@flexkit/studio 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/chat-page-YWENJEUP.js +4 -0
  2. package/dist/chat-page-YWENJEUP.js.map +1 -0
  3. package/dist/chunk-2FQWBOU6.js +6 -0
  4. package/dist/chunk-2FQWBOU6.js.map +1 -0
  5. package/dist/chunk-3FIKCGSP.js +4 -0
  6. package/dist/{chunk-ANVO5P65.js.map → chunk-3FIKCGSP.js.map} +1 -1
  7. package/dist/{chunk-JYHZU2UZ.js → chunk-4BX7OJJ6.js} +2 -2
  8. package/dist/{chunk-JYHZU2UZ.js.map → chunk-4BX7OJJ6.js.map} +1 -1
  9. package/dist/{chunk-ZBI744KS.js → chunk-66N44IKJ.js} +3 -3
  10. package/dist/chunk-66N44IKJ.js.map +1 -0
  11. package/dist/{chunk-2IRKGO2B.js → chunk-7ZDMZVDA.js} +5 -5
  12. package/dist/{chunk-2IRKGO2B.js.map → chunk-7ZDMZVDA.js.map} +1 -1
  13. package/dist/{chunk-S7M5CQ5S.js → chunk-GW37ZTR2.js} +2 -2
  14. package/dist/{chunk-S7M5CQ5S.js.map → chunk-GW37ZTR2.js.map} +1 -1
  15. package/dist/chunk-H6TOYVW2.js +3 -0
  16. package/dist/chunk-H6TOYVW2.js.map +1 -0
  17. package/dist/{chunk-5TQF5UQQ.js → chunk-LYGHDJ5A.js} +2 -2
  18. package/dist/{chunk-5TQF5UQQ.js.map → chunk-LYGHDJ5A.js.map} +1 -1
  19. package/dist/chunk-OFLU53AC.js +2 -0
  20. package/dist/{chunk-LQVZWFM2.js.map → chunk-OFLU53AC.js.map} +1 -1
  21. package/dist/chunk-YIGEER6B.js +7 -0
  22. package/dist/chunk-YIGEER6B.js.map +1 -0
  23. package/dist/chunk-Z6IEBNKV.js +2 -0
  24. package/dist/{chunk-GM5OZTHL.js.map → chunk-Z6IEBNKV.js.map} +1 -1
  25. package/dist/index.css +378 -0
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +9 -9
  28. package/dist/index.js.map +1 -1
  29. package/dist/list-3K2PBGML.js +2 -0
  30. package/dist/{list-ZQJ6NHKQ.js.map → list-3K2PBGML.js.map} +1 -1
  31. package/dist/pages-BDZ4ZXBS.js +3 -0
  32. package/dist/{pages-2GQVTLL2.js.map → pages-BDZ4ZXBS.js.map} +1 -1
  33. package/dist/plugin-pages-Q77CBW45.js +2 -0
  34. package/dist/{plugin-pages-E5TUDDT5.js.map → plugin-pages-Q77CBW45.js.map} +1 -1
  35. package/dist/root-4TME2KMP.js +2 -0
  36. package/dist/{root-HC5QZ2JM.js.map → root-4TME2KMP.js.map} +1 -1
  37. package/dist/root-4ZVGVCYY.js +23 -0
  38. package/dist/{root-TXKDRPOK.js.map → root-4ZVGVCYY.js.map} +1 -1
  39. package/dist/{root-BD4VN3RD.js → root-EZWV5VA4.js} +3 -3
  40. package/dist/{root-BD4VN3RD.js.map → root-EZWV5VA4.js.map} +1 -1
  41. package/dist/{root-P6CVZ5ZB.js → root-YKNISFWH.js} +2 -2
  42. package/dist/{root-P6CVZ5ZB.js.map → root-YKNISFWH.js.map} +1 -1
  43. package/dist/{search-PVXTPIYJ.js → search-7NX232AW.js} +2 -2
  44. package/dist/{search-PVXTPIYJ.js.map → search-7NX232AW.js.map} +1 -1
  45. package/dist/{skills-pages-N5KDEHLT.js → skills-pages-SMJ4EWZW.js} +2 -2
  46. package/dist/{skills-pages-N5KDEHLT.js.map → skills-pages-SMJ4EWZW.js.map} +1 -1
  47. package/dist/{spec-renderer-ZZ3GPVKU.js → spec-renderer-5YGDRF52.js} +2 -2
  48. package/dist/{spec-renderer-ZZ3GPVKU.js.map → spec-renderer-5YGDRF52.js.map} +1 -1
  49. package/dist/ui.d.ts +28 -4
  50. package/dist/ui.js +1 -1
  51. package/package.json +4 -4
  52. package/dist/chat-page-H6I3XOKS.js +0 -2
  53. package/dist/chat-page-H6I3XOKS.js.map +0 -1
  54. package/dist/chunk-ANVO5P65.js +0 -4
  55. package/dist/chunk-BURKG2UC.js +0 -6
  56. package/dist/chunk-BURKG2UC.js.map +0 -1
  57. package/dist/chunk-GM5OZTHL.js +0 -2
  58. package/dist/chunk-HROHAMPM.js +0 -3
  59. package/dist/chunk-HROHAMPM.js.map +0 -1
  60. package/dist/chunk-LQVZWFM2.js +0 -2
  61. package/dist/chunk-QHDL6CA2.js +0 -7
  62. package/dist/chunk-QHDL6CA2.js.map +0 -1
  63. package/dist/chunk-ZBI744KS.js.map +0 -1
  64. package/dist/list-ZQJ6NHKQ.js +0 -2
  65. package/dist/pages-2GQVTLL2.js +0 -3
  66. package/dist/plugin-pages-E5TUDDT5.js +0 -2
  67. package/dist/root-HC5QZ2JM.js +0 -2
  68. package/dist/root-TXKDRPOK.js +0 -23
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/ai/approvals-count.ts","../src/apps/ai/schema-deploy-watch.ts","../src/apps/ai/approval-card.tsx","../src/apps/ai/status-label.ts","../src/apps/ai/approval-parts.ts","../src/apps/ai/resumable-stream.ts","../src/apps/ai/replay.tsx"],"names":["useRevalidateApprovalsCount","currentProjectId","useConfig","mutate","useSWRConfig","useCallback","known","key","paths","POLL_INTERVAL_MS","POLL_LIMIT","watching","urlFetcher","approvalUrl","response","settleSchemaDeployment","approval","projectId","revalidate","revalidateProjectSchema","watchSchemaDeployment","approvalId","fetchApproval","sleep","ms","resolve","load","attempt","APPROVAL_STATUS_STYLES","ApprovalStatusBadge","status","jsx","Badge","formatCellValue","value","DiffCell","after","before","beforeText","afterText","jsxs","MoveRightIcon","getOperationTitle","operation","entity","count","OperationPreviewTable","contextColumns","column","Table","TableHeader","TableRow","TableHead","TableBody","row","index","TableCell","columns","OperationDocuments","operations","plugin","chat","title","getChatPluginAction","segments","toolName","pluginName","action","app","letter","query","connection","account","getChatActionTitle","pluginAction","SchemaRowsTable","isSet","shownColumns","getSchemaOperationTitle","SchemaChangePreview","preview","summary","TriangleAlertIcon","change","warning","isSameApprovalSnapshot","left","right","useApprovalDecision","api","initialApproval","onDecided","setApproval","useState","prevInitialApproval","setPrevInitialApproval","errorMessage","setErrorMessage","isDeciding","startDecideTransition","useTransition","isRejectDialogOpen","setIsRejectDialogOpen","isStale","setIsStale","rejectReason","setRejectReason","revalidateApprovalsCount","applyResult","nextApproval","decide","approved","force","reason","remember","result","message","error","ApprovalDecisionActions","allowRemember","askForRejectionReason","variant","isHeader","buttonClassName","buttonSize","setRemember","rememberId","useId","Fragment","Button","LoaderCircle","CheckIcon","XIcon","Checkbox","checked","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Textarea","event","DialogFooter","ArrowRightIcon","ApprovalCardBody","isPending","formatDistance","format","ApprovalCard","ApprovalDrawer","onClose","DrawerModal","JEV_APPROVAL_REASON_PREFIX","TOOL_ALLOW_RULE_REASON_PREFIX","ROLLING_STATUS_PART_TYPES","isRollingStatusPartType","type","getPartData","part","isJevAutoApproved","truncateLabel","text","maxLength","trimmed","cut","lastSpace","stripInlineMarkdown","getCommittedReasoningText","lastNewline","lastSentence","sentenceEnd","match","boundary","getReasoningStatusLabel","options","lines","line","last","candidate","plain","humanizeToolName","tool","getRollingStatusLabel","data","AGENT_INTERNAL_ERROR_PART_TYPES","getRollingStatusError","isHiddenReplayPart","getPlanStatusLabel","current","step","getLiveStatusLabel","messageHasPendingMutationApproval","settlePendingMutationApprovals","decided","changed","parts","getMutationApprovalIds","approvalIds","pendingOnly","getPendingMutationApprovalIds","LegacyStreamError","PermanentStreamError","createResumableUiStream","url","signal","state","onState","wake","fetchStream","retryMs","cursor","failures","bridge","writer","local","abort","wait","done","timer","pump","reader","partial","complete","end","frame","pipeJsonRender","LazyRunSpecPart","lazy","module","RunSpecPart","props","Suspense","useProjectApi","useMemo","createApiClient","MAX_STREAM_ATTEMPTS","STREAM_RETRY_DELAY_MS","REPLAY_RENDER_INTERVAL_MS","JSON_RENDER_SPEC_PART_TYPE","RunReplayActionsContext","createContext","ChatApprovalContext","delay","isAbortError","hasRenderableParts","getMarkerIds","messages","markerIds","splitSessionMessages","chunkIndex","flush","useSessionMessages","isTerminalRunStatus","shouldPauseStreamForApproval","latestMessage","recordStatus","suppressApprovalPause","useRunStream","streamApi","legacy","setLegacy","fallback","useLegacyRunStream","setMessage","setStatus","optionsRef","useRef","wakeRef","resumeToken","useEffect","latest","stream","next","readUIMessageStream","decidedApprovalsRef","suppressApprovalPauseRef","streamApiRef","messageRef","streamChanged","abortController","rebuildFloor","nextMessage","startIndexSeparator","consumeOnce","sawFinish","chunkStream","parseJsonEventStream","uiMessageChunkSchema","controller","messageStream","throttleTimer","caughtUp","flushLatestMessage","consume","loadTimeout","toMutationApprovalPartData","isCodeFenceOnlyText","MessagePart","partIndex","ToolErrorLine","otherPart","TextPart","GenerateFilesPart","RunArtifactPart","ToolDeliveryPart","RunSummaryPart","ToolMessage","ToolHeader","BotIcon","StatusIcon","PluginConnectionPart","XCircleIcon","AutoApprovedCallPart","MutationApprovalPart","BulkGraphqlActionPart","nextPart","UnknownDataPart","MessageResponse","SHIMMER_PERIOD_MS","RollingStatusText","phaseOriginRef","getPhaseDelayMs","transition","setTransition","STATUS_LABEL_MIN_DWELL_MS","useStableStatusLabel","label","minDwellMs","displayed","setDisplayed","shownAtRef","pendingRef","timeoutId","TurnStatusLine","visible","stableLabel","children","className","isError","loading","StatusToolPart","icon","lastInProgress","generated","generating","CloudUploadIcon","path","isDone","previewUrl","downloadUrl","bytes","formatBytes","FileTextIcon","getArtifactLabel","DownloadIcon","LinkIcon","providerLabel","MessageSquareIcon","SendIcon","CheckCircle2Icon","CircleSlashIcon","replayActions","useContext","isChat","previousApprovalStatusRef","isValidating","useSWR","fetcher","latestData","approvalStatus","approvedSchemaChange","previousStatus","handleDecided","body","detail","ShieldIcon","DatabaseZapIcon","ShieldCheckIcon","progress","sizeBytes","kilobytes","pluginId","pathname","useLocation","base","Link"],"mappings":"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","file":"chunk-BURKG2UC.js","sourcesContent":["import { useCallback } from 'react';\nimport { useSWRConfig } from 'swr';\nimport { useConfig } from '../../core/config/config-context';\nimport { paths } from './api';\nimport type { AutomationApprovals } from './types';\n\n/**\n * The sidebar badge polls the approvals count only every 30 seconds. Pages\n * that learn earlier that the count changed (a run pausing for approval, a\n * decision, the inbox loading) call this so the badge updates at once.\n */\nexport function useRevalidateApprovalsCount(): (_known?: AutomationApprovals) => void {\n const { currentProjectId } = useConfig();\n const { mutate } = useSWRConfig();\n\n return useCallback(\n (known?: AutomationApprovals) => {\n if (!currentProjectId) {\n return;\n }\n\n const key = paths(currentProjectId).approvalsCount;\n\n // A fresh inbox response carries the count already; show it before the refetch lands.\n void (known ? mutate(key, known, { revalidate: true }) : mutate(key));\n },\n [currentProjectId, mutate]\n );\n}\n","import { revalidateProjectSchema } from '../../core/config/use-project-schemas';\nimport type { AutomationApproval } from './types';\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_LIMIT = 150;\nconst watching = new Set<string>();\n\n/** `null` = transient failure (keep polling); `'missing'` = the approval does not exist (stop). */\nexport type ApprovalFetcher = () => Promise<AutomationApproval | 'missing' | null>;\n\nfunction urlFetcher(approvalUrl: string): ApprovalFetcher {\n return async () => {\n const response = await fetch(approvalUrl, { credentials: 'include', mode: 'cors' });\n\n if (response.status === 404) {\n return 'missing';\n }\n\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { approval?: AutomationApproval };\n\n return body.approval ?? 'missing';\n };\n}\n\n/**\n * Decides whether a watch is still needed: `true` to keep polling, `false`\n * once the deployment settled (schema refreshed when it succeeded).\n */\nexport function settleSchemaDeployment(\n approval: AutomationApproval | null,\n projectId: string,\n revalidate: (_projectId: string) => Promise<unknown> = revalidateProjectSchema\n): boolean {\n if (!approval || approval.kind !== 'schema' || approval.status !== 'approved' || approval.error) {\n return false;\n }\n\n if (approval.executedAt) {\n void revalidate(projectId);\n\n return false;\n }\n\n return true;\n}\n\n/**\n * After a schema change is approved the deployment runs server-side for a\n * while. This keeps polling the approval, independently of which component\n * approved it (chat card or inbox drawer) and of navigation inside the\n * Studio, and refetches the project schema once the deployment completed.\n */\nexport function watchSchemaDeployment({\n approvalId,\n approvalUrl,\n fetchApproval,\n projectId,\n revalidate = revalidateProjectSchema,\n sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),\n}: {\n approvalId: string;\n /** GET endpoint returning `{ approval }`; required unless `fetchApproval` is given. */\n approvalUrl?: string;\n fetchApproval?: ApprovalFetcher;\n projectId: string;\n revalidate?: (_projectId: string) => Promise<unknown>;\n sleep?: (_ms: number) => Promise<void>;\n}): void {\n const key = `${projectId}:${approvalId}`;\n const load = fetchApproval ?? (approvalUrl ? urlFetcher(approvalUrl) : null);\n\n if (!load || watching.has(key)) {\n return;\n }\n\n watching.add(key);\n\n void (async () => {\n try {\n for (let attempt = 0; attempt < POLL_LIMIT; attempt += 1) {\n let approval: AutomationApproval | 'missing' | null = null;\n\n try {\n approval = await load();\n } catch {\n approval = null;\n }\n\n if (approval === 'missing') {\n return;\n }\n\n // A transient fetch failure (network blip, 5xx) keeps the watch alive.\n if (approval !== null && !settleSchemaDeployment(approval, projectId, revalidate)) {\n return;\n }\n\n await sleep(POLL_INTERVAL_MS);\n }\n } finally {\n watching.delete(key);\n }\n })();\n}\n","import type { JSX } from 'react';\nimport { useId, useState, useTransition } from 'react';\nimport { format, formatDistance } from 'date-fns';\nimport { ArrowRightIcon, CheckIcon, LoaderCircle, MoveRightIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport {\n Badge,\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DrawerModal,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Textarea,\n} from '../../ui';\nimport { paths, type ApiClient } from './api';\nimport { useRevalidateApprovalsCount } from './approvals-count';\nimport { watchSchemaDeployment } from './schema-deploy-watch';\nimport type {\n AutomationApproval,\n AutomationApprovalOperation,\n AutomationApprovalPreviewOperation,\n AutomationApprovalStatus,\n} from './types';\n\nconst APPROVAL_STATUS_STYLES: { [status in AutomationApprovalStatus]: string } = {\n approved: 'fk:bg-success/20 fk:text-success',\n cancelled: 'fk:bg-secondary fk:text-secondary-foreground',\n expired: 'fk:bg-secondary fk:text-secondary-foreground',\n pending: 'fk:bg-amber-500/20 fk:text-amber-600',\n rejected: 'fk:bg-destructive/15 fk:text-destructive',\n};\n\nexport function ApprovalStatusBadge({ status }: { status: AutomationApprovalStatus }): JSX.Element {\n return (\n <Badge\n className={`fk:border-none fk:h-4.75 fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${APPROVAL_STATUS_STYLES[status]}`}\n variant=\"secondary\"\n >\n {status}\n </Badge>\n );\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '—';\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\nfunction DiffCell({ after, before }: { after: unknown; before: unknown }): JSX.Element {\n const beforeText = formatCellValue(before);\n const afterText = formatCellValue(after);\n\n if (beforeText === afterText) {\n return <span className=\"fk:text-muted-foreground\">{beforeText}</span>;\n }\n\n return (\n <span className=\"fk:inline-flex fk:flex-wrap fk:items-center fk:gap-1.5\">\n <span className=\"fk:rounded fk:bg-destructive/10 fk:px-1 fk:text-destructive fk:line-through fk:corner-squircle\">{beforeText}</span>\n <MoveRightIcon className=\"fk:size-3 fk:shrink-0 fk:text-muted-foreground\" />\n <span className=\"fk:rounded fk:bg-success/15 fk:px-1 fk:text-success fk:corner-squircle\">{afterText}</span>\n </span>\n );\n}\n\nfunction getOperationTitle(operation: AutomationApprovalPreviewOperation): string {\n const entity = operation.entity ?? 'entities';\n const count = operation.affectedCount !== null ? ` · ${operation.affectedCount.toString()} affected` : '';\n\n if (operation.kind === 'create') {\n return `Create ${entity}${count}`;\n }\n\n if (operation.kind === 'update') {\n return `Update ${entity}${count}`;\n }\n\n if (operation.kind === 'delete') {\n return `Delete ${entity}${count}`;\n }\n\n return `Mutation on ${entity}${count}`;\n}\n\nfunction OperationPreviewTable({ operation }: { operation: AutomationApprovalPreviewOperation }): JSX.Element | null {\n if (operation.rows.length === 0) {\n return null;\n }\n\n const contextColumns = (operation.contextColumns ?? []).filter((column) => column !== '_id');\n\n if (operation.kind === 'delete') {\n return (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Records to delete</TableHead>\n {contextColumns.map((column) => (\n <TableHead key={column}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {operation.rows.map((row, index) => (\n <TableRow className=\"fk:bg-destructive/5\" key={row.id ?? index.toString()}>\n <TableCell className=\"fk:font-mono fk:text-xs fk:text-destructive\">\n {row.id ?? formatCellValue(row.before?._id)}\n </TableCell>\n {contextColumns.map((column) => (\n <TableCell className=\"fk:text-xs fk:text-muted-foreground\" key={column}>\n {formatCellValue(row.before?.[column])}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n }\n\n const columns = operation.columns.filter((column) => column !== '_id' && !contextColumns.includes(column));\n\n return (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>ID</TableHead>\n {contextColumns.map((column) => (\n <TableHead key={column}>{column}</TableHead>\n ))}\n {columns.map((column) => (\n <TableHead key={column}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {operation.rows.map((row, index) => (\n <TableRow key={row.id ?? index.toString()}>\n <TableCell className=\"fk:font-mono fk:text-xs fk:text-muted-foreground\">{row.id ?? '—'}</TableCell>\n {contextColumns.map((column) => (\n <TableCell className=\"fk:max-w-72 fk:text-xs fk:text-muted-foreground\" key={column}>\n <span className=\"fk:line-clamp-3\">{formatCellValue(row.before?.[column])}</span>\n </TableCell>\n ))}\n {columns.map((column) => (\n <TableCell className=\"fk:text-xs\" key={column}>\n {operation.kind === 'create' ? (\n <span className=\"fk:rounded fk:bg-success/15 fk:px-1 fk:text-success fk:corner-squircle\">\n {formatCellValue(row.after?.[column])}\n </span>\n ) : (\n <DiffCell after={row.after?.[column]} before={row.before?.[column]} />\n )}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nfunction OperationDocuments({\n operations,\n plugin,\n chat,\n title,\n}: {\n operations: AutomationApprovalOperation[];\n plugin: boolean;\n chat: boolean;\n title?: string;\n}): JSX.Element {\n return (\n <details className=\"fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n <summary className=\"fk:cursor-pointer fk:px-3 fk:py-2 fk:text-xs fk:font-medium fk:text-muted-foreground\">\n {title ?? (chat ? 'Action details' : plugin ? 'Plugin tool and arguments' : `GraphQL documents (${operations.length})`)}\n </summary>\n <div className=\"fk:space-y-3 fk:border-t fk:border-border fk:p-3\">\n {operations.map((operation, index) => (\n <div className=\"fk:space-y-2\" key={index.toString()}>\n <pre className=\"fk:overflow-x-auto fk:rounded-md fk:bg-muted fk:p-3 fk:text-xs fk:corner-squircle\">{operation.query}</pre>\n {operation.variables && Object.keys(operation.variables).length > 0 ? (\n <pre className=\"fk:overflow-x-auto fk:rounded-md fk:bg-muted/60 fk:p-3 fk:text-xs fk:corner-squircle\">\n {JSON.stringify(operation.variables, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </details>\n );\n}\n\nfunction getChatPluginAction(\n approval: AutomationApproval\n): { action: string; app: string; account?: string; scope?: 'project' | 'personal' } | null {\n if (approval.kind !== 'plugin') {\n return null;\n }\n\n const toolPath = approval.operations[0]?.query.split('\\n')[0]?.trim();\n const segments = toolPath?.split('/');\n const toolName = segments?.at(-1);\n const pluginName = segments?.[0];\n\n if (!toolName || !pluginName || segments?.length < 2) {\n return null;\n }\n\n const action = toolName\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .toLowerCase();\n const app = pluginName.replace(/[_-]+/g, ' ').replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n const query = approval.operations[0]?.query ?? '';\n const connection = /^Connection:\\s*(Project|Personal)\\s+—\\s+(.+)$/m.exec(query);\n\n if (connection?.[1] && connection[2]) {\n return {\n action,\n app,\n account: connection[2].trim(),\n scope: connection[1] === 'Project' ? 'project' : 'personal',\n };\n }\n\n // Older approvals only carried the account email.\n const account = /^Connection:.*?([^\\s<>]+@[^\\s<>]+)\\s*$/m.exec(query)?.[1];\n\n return { action, app, account };\n}\n\nfunction getChatActionTitle(approval: AutomationApproval): string {\n const pluginAction = getChatPluginAction(approval);\n\n if (pluginAction) {\n return `${pluginAction.action.charAt(0).toUpperCase()}${pluginAction.action.slice(1)} in ${pluginAction.app}`;\n }\n\n if (approval.kind === 'exec') {\n return 'Run a sandbox command';\n }\n\n if (approval.kind === 'schema') {\n return approval.operationsSummary.replace(/^Schema: /, '');\n }\n\n return approval.kind === 'plugin' ? 'Use a connected app' : approval.operationsSummary;\n}\n\n\nfunction SchemaRowsTable({ operation }: { operation: AutomationApprovalPreviewOperation }): JSX.Element | null {\n if (operation.rows.length === 0) {\n return null;\n }\n\n const isSet = (value: unknown): boolean => value !== null && value !== undefined && value !== false;\n // Hide columns no row sets; in a change table also hide columns no row changes.\n const shownColumns = operation.columns.filter((column) => {\n const anySet = operation.rows.some((row) => isSet(row.before?.[column]) || isSet(row.after?.[column]));\n\n if (!anySet) return false;\n if (operation.kind !== 'update') return true;\n\n return operation.rows.some((row) => formatCellValue(row.before?.[column]) !== formatCellValue(row.after?.[column]));\n });\n\n return (\n <div className=\"fk:overflow-x-auto fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n <Table className=\"fk:text-xs\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"fk:h-8\">{operation.entity === 'scopes' || operation.entity === 'spaces' || operation.entity === 'studio' ? 'Setting' : 'Attribute'}</TableHead>\n {shownColumns.map((column) => (\n <TableHead className=\"fk:h-8\" key={column}>\n {column}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {operation.rows.map((row, index) => (\n <TableRow key={row.id ?? index.toString()}>\n <TableCell className=\"fk:py-1.5 fk:font-mono fk:text-[0.7rem]\">\n {operation.kind === 'delete' ? <span className=\"fk:line-through fk:text-destructive\">{row.id}</span> : row.id}\n {operation.kind === 'update' && row.before === null ? (\n <Badge className=\"fk:ml-2\" variant=\"secondary\">\n new\n </Badge>\n ) : null}\n {operation.kind === 'update' && row.after === null ? (\n <Badge className=\"fk:ml-2\" variant=\"destructive\">\n removed\n </Badge>\n ) : null}\n </TableCell>\n {shownColumns.map((column) => (\n <TableCell className=\"fk:py-1.5\" key={column}>\n {operation.kind === 'create' ? (\n <span>{formatCellValue(row.after?.[column])}</span>\n ) : operation.kind === 'delete' ? (\n <span className=\"fk:text-muted-foreground\">{formatCellValue(row.before?.[column])}</span>\n ) : (\n <DiffCell after={row.after?.[column]} before={row.before?.[column]} />\n )}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n );\n}\n\nfunction getSchemaOperationTitle(operation: AutomationApprovalPreviewOperation): string {\n const entity = operation.entity ?? 'schema';\n\n if (entity === 'scopes' || entity === 'spaces' || entity === 'studio') {\n return `Change ${entity === 'studio' ? 'Studio settings' : entity}`;\n }\n\n if (operation.kind === 'create') {\n return `Add entity ${entity} · ${operation.rows.length.toString()} attribute${operation.rows.length === 1 ? '' : 's'}`;\n }\n\n if (operation.kind === 'delete') {\n return `Remove entity ${entity}`;\n }\n\n return `Change entity ${entity}`;\n}\n\n/** Review card body for agent-proposed schema deployments. */\nfunction SchemaChangePreview({ preview }: { preview: NonNullable<AutomationApproval['preview']> }): JSX.Element {\n const summary = preview.schema;\n\n return (\n <div className=\"fk:space-y-4\">\n {summary && summary.breakingChanges.length > 0 ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:corner-squircle\">\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:gap-2 fk:font-medium fk:text-destructive\">\n <TriangleAlertIcon className=\"fk:size-4\" />\n Breaking changes: existing data becomes inaccessible\n </div>\n <ul className=\"fk:list-disc fk:pl-5 fk:text-destructive\">\n {summary.breakingChanges.map((change) => (\n <li key={change}>{change}</li>\n ))}\n </ul>\n </div>\n ) : null}\n {summary && summary.warnings.length > 0 ? (\n <div className=\"fk:rounded-md fk:border fk:border-amber-500/40 fk:bg-amber-500/10 fk:p-3 fk:text-sm fk:corner-squircle\">\n <ul className=\"fk:list-disc fk:pl-5\">\n {summary.warnings.map((warning) => (\n <li key={warning}>{warning}</li>\n ))}\n </ul>\n </div>\n ) : null}\n {preview.operations.map((operation, index) => (\n <div className=\"fk:space-y-2\" key={`${operation.entity ?? ''}-${index.toString()}`}>\n <div className={`fk:text-sm fk:font-medium ${operation.kind === 'delete' ? 'fk:text-destructive' : ''}`}>\n {getSchemaOperationTitle(operation)}\n </div>\n <SchemaRowsTable operation={operation} />\n </div>\n ))}\n {preview.operations.length === 0 ? (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-3 fk:text-xs fk:text-muted-foreground fk:corner-squircle\">\n No visible entity changes. Review the operations below.\n </div>\n ) : null}\n </div>\n );\n}\n\n/** Fields the card syncs from parent props; ignores object identity from SWR. */\nfunction isSameApprovalSnapshot(left: AutomationApproval, right: AutomationApproval): boolean {\n return (\n left.id === right.id &&\n left.status === right.status &&\n left.decidedAt === right.decidedAt &&\n left.decidedBy === right.decidedBy &&\n left.executedAt === right.executedAt &&\n left.error === right.error &&\n left.reason === right.reason &&\n left.expiresAt === right.expiresAt &&\n left.operationsSummary === right.operationsSummary &&\n left.affectedCount === right.affectedCount &&\n JSON.stringify(left.preview) === JSON.stringify(right.preview)\n );\n}\n\nfunction useApprovalDecision({\n api,\n approval: initialApproval,\n onDecided,\n}: {\n api: ApiClient;\n approval: AutomationApproval;\n onDecided?: (_approval: AutomationApproval) => void;\n}): {\n approval: AutomationApproval;\n decide: (_options: { approved: boolean; force?: boolean; reason?: string; remember?: boolean }) => void;\n errorMessage: string;\n isDeciding: boolean;\n isPending: boolean;\n isRejectDialogOpen: boolean;\n isStale: boolean;\n rejectReason: string;\n setIsRejectDialogOpen: (_open: boolean) => void;\n setRejectReason: (_reason: string) => void;\n} {\n const [approval, setApproval] = useState(initialApproval);\n // Keep local state for decide() responses, but adopt fresher parent data when\n // list polling / SWR revalidation replaces the prop with meaningfully new\n // data (e.g. refreshed preview while still pending). Never regress a local\n // decision back to pending — mutate/revalidation can briefly return stale\n // pending rows. Do not clear isStale here: a reference-only revalidation\n // must not drop the stale-preview banner / \"Approve anyway\" (force) path.\n const [prevInitialApproval, setPrevInitialApproval] = useState(initialApproval);\n const [errorMessage, setErrorMessage] = useState('');\n const [isDeciding, startDecideTransition] = useTransition();\n const [isRejectDialogOpen, setIsRejectDialogOpen] = useState(false);\n const [isStale, setIsStale] = useState(false);\n const [rejectReason, setRejectReason] = useState('');\n const revalidateApprovalsCount = useRevalidateApprovalsCount();\n\n if (initialApproval !== prevInitialApproval) {\n setPrevInitialApproval(initialApproval);\n\n if (!isSameApprovalSnapshot(initialApproval, prevInitialApproval)) {\n const wouldRegressDecision =\n approval.id === initialApproval.id && approval.status !== 'pending' && initialApproval.status === 'pending';\n\n if (!wouldRegressDecision) {\n setApproval(initialApproval);\n }\n }\n }\n\n function applyResult(nextApproval: AutomationApproval): void {\n setApproval(nextApproval);\n // The sidebar badge counts pending approvals; a decision changes it now.\n revalidateApprovalsCount();\n\n // An approved schema change deploys in the background; refresh the\n // project schema when it lands, wherever the approval came from.\n if (nextApproval.kind === 'schema' && nextApproval.status === 'approved') {\n watchSchemaDeployment({\n approvalId: nextApproval.id,\n approvalUrl: paths(nextApproval.projectId).approval(nextApproval.id),\n projectId: nextApproval.projectId,\n });\n }\n\n onDecided?.(nextApproval);\n }\n\n function decide({\n approved,\n force = false,\n reason,\n remember = false,\n }: {\n approved: boolean;\n force?: boolean;\n reason?: string;\n remember?: boolean;\n }): void {\n startDecideTransition(async () => {\n setErrorMessage('');\n\n try {\n const result = await api.decideApproval(approval.id, { approved, force, reason, remember });\n\n if (result.errorCode === 'stale_preview') {\n setIsStale(true);\n\n if (result.approval) {\n setApproval(result.approval);\n }\n\n return;\n }\n\n setIsStale(false);\n setIsRejectDialogOpen(false);\n\n if (result.approval) {\n applyResult(result.approval);\n } else if (result.success) {\n // Successful decide omitted the payload — exit pending using the\n // decision we just submitted (the server accepted it).\n applyResult({\n ...approval,\n decidedAt: approval.decidedAt ?? new Date().toISOString(),\n reason: reason ?? approval.reason,\n status: approved ? 'approved' : 'rejected',\n });\n } else if (result.errorCode === 'already_decided') {\n // Never invent a status from the click — the real decision may differ.\n // Ask the parent to revalidate so the true approval can load.\n onDecided?.(approval);\n }\n\n // When already_decided includes an approval, the badge reflects truth.\n // Otherwise surface the server message (including already_decided\n // without a payload). errorMessage may be omitted on some 400 bodies.\n if (!result.success && (result.errorCode !== 'already_decided' || !result.approval)) {\n const message = Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage;\n\n setErrorMessage(message || 'Failed to submit the decision.');\n }\n } catch (error) {\n setErrorMessage(error instanceof Error ? error.message : 'Failed to submit the decision.');\n }\n });\n }\n\n return {\n approval,\n decide,\n errorMessage,\n isDeciding,\n isPending: approval.status === 'pending',\n isRejectDialogOpen,\n isStale,\n rejectReason,\n setIsRejectDialogOpen,\n setRejectReason,\n };\n}\n\nfunction ApprovalDecisionActions({\n allowRemember = false,\n askForRejectionReason,\n decide,\n isDeciding,\n isRejectDialogOpen,\n isStale,\n rejectReason,\n setIsRejectDialogOpen,\n setRejectReason,\n variant,\n}: {\n /** Offer \"always allow this tool for this automation\" alongside Approve. */\n allowRemember?: boolean;\n askForRejectionReason: boolean;\n decide: (_options: { approved: boolean; force?: boolean; reason?: string; remember?: boolean }) => void;\n isDeciding: boolean;\n isRejectDialogOpen: boolean;\n isStale: boolean;\n rejectReason: string;\n setIsRejectDialogOpen: (_open: boolean) => void;\n setRejectReason: (_reason: string) => void;\n variant: 'header' | 'inline';\n}): JSX.Element {\n const isHeader = variant === 'header';\n const buttonClassName = isHeader ? 'fk:px-8 fk:min-w-32' : undefined;\n const buttonSize = isHeader ? 'default' : 'sm';\n const [remember, setRemember] = useState(false);\n const rememberId = useId();\n\n return (\n <>\n <div className=\"fk:flex fk:flex-nowrap fk:items-center fk:gap-2\">\n <Button\n className={buttonClassName}\n disabled={isDeciding}\n size={buttonSize}\n onClick={() => decide({ approved: true, force: isStale, remember: allowRemember && remember })}\n >\n {isDeciding ? <LoaderCircle className=\"fk:size-4 fk:animate-spin\" /> : <CheckIcon className=\"fk:size-4\" />}\n {isStale ? 'Approve anyway' : 'Approve'}\n </Button>\n <Button\n className={buttonClassName}\n disabled={isDeciding}\n size={buttonSize}\n variant=\"outline\"\n onClick={() => {\n if (askForRejectionReason) {\n setRejectReason('');\n setIsRejectDialogOpen(true);\n } else {\n decide({ approved: false });\n }\n }}\n >\n <XIcon className=\"fk:size-4\" />\n Reject\n </Button>\n {allowRemember ? (\n <label\n className=\"fk:ml-1 fk:flex fk:cursor-pointer fk:items-center fk:gap-1.5 fk:whitespace-nowrap fk:text-xs fk:text-muted-foreground\"\n htmlFor={rememberId}\n >\n <Checkbox checked={remember} id={rememberId} onCheckedChange={(checked) => setRemember(checked === true)} />\n Always allow this tool for this automation\n </label>\n ) : null}\n </div>\n\n {askForRejectionReason ? (\n <Dialog open={isRejectDialogOpen} onOpenChange={setIsRejectDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Reject this proposal?</DialogTitle>\n <DialogDescription>\n The mutation will not be executed. The agent receives your reason and can adapt its plan.\n </DialogDescription>\n </DialogHeader>\n <Textarea\n placeholder=\"Optional reason for the agent...\"\n value={rejectReason}\n onChange={(event) => setRejectReason(event.target.value)}\n />\n <DialogFooter>\n <Button disabled={isDeciding} size=\"sm\" variant=\"outline\" onClick={() => setIsRejectDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n disabled={isDeciding}\n size=\"sm\"\n variant=\"destructive\"\n onClick={() => decide({ approved: false, reason: rejectReason.trim() || undefined })}\n >\n {isDeciding ? (\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n ) : (\n <ArrowRightIcon className=\"fk:size-4\" />\n )}\n Reject proposal\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ) : null}\n </>\n );\n}\n\nfunction ApprovalCardBody({\n approval,\n chat,\n errorMessage,\n isPending,\n isStale,\n}: {\n approval: AutomationApproval;\n chat: boolean;\n errorMessage: string;\n isPending: boolean;\n isStale: boolean;\n}): JSX.Element {\n const { preview } = approval;\n const pluginAction = chat ? getChatPluginAction(approval) : null;\n\n return (\n // min-w-0 lets the card shrink inside flex/grid parents (e.g. DrawerModal)\n // so wide preview tables scroll inside their own container instead of\n // stretching the layout.\n <div className=\"fk:min-w-0 fk:max-w-full fk:space-y-4\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <ApprovalStatusBadge status={approval.status} />\n {approval.kind === 'schema' ? <Badge variant=\"outline\">Schema change</Badge> : null}\n <span className=\"fk:text-sm fk:font-medium\">\n {chat ? getChatActionTitle(approval) : approval.operationsSummary}\n </span>\n </div>\n <div className=\"fk:text-xs fk:text-muted-foreground\">\n {approval.automationName ? `${approval.automationName} · ` : ''}\n requested {formatDistance(new Date(approval.requestedAt), new Date(), { addSuffix: true })}\n {isPending ? ` · expires ${formatDistance(new Date(approval.expiresAt), new Date(), { addSuffix: true })}` : ''}\n {approval.decidedAt ? ` · decided ${format(new Date(approval.decidedAt), 'PPpp')}` : ''}\n </div>\n\n {isStale ? (\n <div className=\"fk:flex fk:items-start fk:gap-2 fk:rounded-md fk:border fk:border-amber-500/40 fk:bg-amber-500/10 fk:p-3 fk:text-sm fk:corner-squircle\">\n <TriangleAlertIcon className=\"fk:mt-0.5 fk:size-4 fk:shrink-0 fk:text-amber-600\" />\n <span>\n The affected data changed since this proposal was created. The preview below has been refreshed — review it\n and approve again to proceed.\n </span>\n </div>\n ) : null}\n\n {approval.kind === 'schema' && preview ? (\n <SchemaChangePreview preview={preview} />\n ) : preview && preview.operations.length > 0 ? (\n <div className=\"fk:space-y-4\">\n {preview.operations.map((operation, index) => (\n <div className=\"fk:space-y-2\" key={index.toString()}>\n <div className=\"fk:text-sm fk:font-medium\">{getOperationTitle(operation)}</div>\n {operation.kind === 'delete' && operation.affectedCount !== null ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:text-destructive fk:corner-squircle\">\n {operation.affectedCount.toString()} record{operation.affectedCount === 1 ? '' : 's'} will be\n permanently deleted.\n </div>\n ) : null}\n <OperationPreviewTable operation={operation} />\n {operation.truncated ? (\n <div className=\"fk:text-xs fk:text-muted-foreground\">\n Preview limited to the first {operation.rows.length.toString()} rows.\n </div>\n ) : null}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-3 fk:text-xs fk:text-muted-foreground fk:corner-squircle\">\n {chat\n ? pluginAction\n ? `This action uses ${pluginAction.scope === 'project' ? \"the project's\" : 'your'} ${pluginAction.app} account${pluginAction.account ? ` (${pluginAction.account})` : ''}. Check the details before deciding.`\n : 'The assistant wants to make this change. Check the details before deciding.'\n : approval.kind === 'plugin'\n ? 'Review the account, tool, and arguments before allowing this external call.'\n : approval.kind === 'exec'\n ? 'This command runs inside the run\\'s ephemeral sandbox but may send data out or reach other hosts. Review the command line before allowing it.'\n : 'No structured preview is available for this proposal. Review the raw GraphQL documents below.'}\n </div>\n )}\n\n <OperationDocuments\n chat={chat}\n operations={approval.operations}\n plugin={approval.kind === 'plugin' || approval.kind === 'exec'}\n title={approval.kind === 'exec' ? 'Command and options' : approval.kind === 'schema' ? 'Operations' : undefined}\n />\n\n {approval.reason ? (\n <div className=\"fk:text-sm\">\n <span className=\"fk:font-medium\">Reason:</span> {approval.reason}\n </div>\n ) : null}\n {approval.error ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:corner-squircle\">\n Execution failed: {approval.error}\n </div>\n ) : null}\n {approval.executedAt && !approval.error ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:text-sm fk:text-success\">\n <CheckIcon className=\"fk:size-4\" />\n Executed {format(new Date(approval.executedAt), 'PPpp')}\n </div>\n ) : null}\n {errorMessage ? <div className=\"fk:text-sm fk:text-destructive\">{errorMessage}</div> : null}\n </div>\n );\n}\n\nexport function ApprovalCard({\n api,\n approval: initialApproval,\n chat,\n onDecided,\n}: {\n api: ApiClient;\n approval: AutomationApproval;\n chat: boolean;\n onDecided?: (_approval: AutomationApproval) => void;\n}): JSX.Element {\n const {\n approval,\n decide,\n errorMessage,\n isDeciding,\n isPending,\n isRejectDialogOpen,\n isStale,\n rejectReason,\n setIsRejectDialogOpen,\n setRejectReason,\n } = useApprovalDecision({ api, approval: initialApproval, onDecided });\n\n return (\n <>\n <ApprovalCardBody\n approval={approval}\n chat={chat}\n errorMessage={errorMessage}\n isPending={isPending}\n isStale={isStale}\n />\n {isPending ? (\n <div className=\"fk:mt-4\">\n <ApprovalDecisionActions\n allowRemember={!chat && approval.kind === 'plugin' && Boolean(approval.automationId)}\n askForRejectionReason={!chat}\n decide={decide}\n isDeciding={isDeciding}\n isRejectDialogOpen={isRejectDialogOpen}\n isStale={isStale}\n rejectReason={rejectReason}\n setIsRejectDialogOpen={setIsRejectDialogOpen}\n setRejectReason={setRejectReason}\n variant=\"inline\"\n />\n </div>\n ) : null}\n </>\n );\n}\n\nexport function ApprovalDrawer({\n api,\n approval: initialApproval,\n onClose,\n onDecided,\n}: {\n api: ApiClient;\n approval: AutomationApproval;\n onClose: () => void;\n onDecided?: (_approval: AutomationApproval) => void;\n}): JSX.Element {\n const {\n approval,\n decide,\n errorMessage,\n isDeciding,\n isPending,\n isRejectDialogOpen,\n isStale,\n rejectReason,\n setIsRejectDialogOpen,\n setRejectReason,\n } = useApprovalDecision({ api, approval: initialApproval, onDecided });\n\n return (\n <DrawerModal\n actions={\n isPending ? (\n <ApprovalDecisionActions\n allowRemember={approval.kind === 'plugin' && Boolean(approval.automationId)}\n askForRejectionReason\n decide={decide}\n isDeciding={isDeciding}\n isRejectDialogOpen={isRejectDialogOpen}\n isStale={isStale}\n rejectReason={rejectReason}\n setIsRejectDialogOpen={setIsRejectDialogOpen}\n setRejectReason={setRejectReason}\n variant=\"header\"\n />\n ) : null\n }\n depth={0}\n isFocused\n onClose={onClose}\n title=\"Mutation proposal\"\n >\n <ApprovalCardBody\n approval={approval}\n chat={false}\n errorMessage={errorMessage}\n isPending={isPending}\n isStale={isStale}\n />\n </DrawerModal>\n );\n}\n","/**\n * Pure helpers behind the transient status line shown while an agent turn or\n * automation run is in flight. Kept free of React and UI imports so the\n * label heuristics can be unit-tested in isolation.\n */\nimport type { ReplayDataParts, ReplayMessage, ReplayMessagePart } from './replay';\n\nexport const STATUS_LABEL_MAX_LENGTH = 72;\n\nexport const JEV_APPROVAL_REASON_PREFIX = 'Approved by Flexkit Jev policy';\nexport const TOOL_ALLOW_RULE_REASON_PREFIX = 'Approved by automation tool allow rule';\n\nconst ROLLING_STATUS_PART_TYPES = new Set<string>([\n 'data-create-sandbox',\n 'data-execute-graphql',\n 'data-load-skill',\n 'data-plan',\n 'data-plugin-call',\n 'data-run-command',\n 'data-search-schema',\n 'data-update-memory',\n 'data-validate-graphql',\n 'data-web-search',\n]);\n\n/**\n * These tool events are surfaced as a single transient status line while the\n * call is in flight (see `RollingStatusText`) instead of persistent cards.\n */\nexport function isRollingStatusPartType(type: string): boolean {\n return ROLLING_STATUS_PART_TYPES.has(type);\n}\n\nexport function getPartData<T>(part: ReplayMessagePart): T {\n return (part as { data: T }).data;\n}\n\n/** Plugin calls cleared without asking anyone (Jev or an allow rule): the replay shows nothing for them. */\nexport function isJevAutoApproved(message: ReplayDataParts['mutation-approval']): boolean {\n return (\n !message.decidedBy &&\n Boolean(\n message.reason?.startsWith(JEV_APPROVAL_REASON_PREFIX) || message.reason?.startsWith(TOOL_ALLOW_RULE_REASON_PREFIX)\n )\n );\n}\n\nexport function truncateLabel(text: string, maxLength = STATUS_LABEL_MAX_LENGTH): string {\n const trimmed = text.trim();\n\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n\n const cut = trimmed.slice(0, maxLength);\n const lastSpace = cut.lastIndexOf(' ');\n const wordBoundary = lastSpace >= Math.floor(maxLength * 0.6) ? cut.slice(0, lastSpace) : cut;\n\n return `${wordBoundary.trimEnd()}…`;\n}\n\nexport function stripInlineMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/, '')\n .replace(/^(?:[-*+]|\\d+[.)])\\s+/, '')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/(\\*\\*|__)(.*?)\\1/g, '$2')\n .replace(/(\\*|_)(.*?)\\1/g, '$2')\n .replace(/`([^`]*)`/g, '$1')\n .replace(/[*_`#>]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/[.:]+$/, '');\n}\n\n/**\n * The prefix of a streaming reasoning text that will not change anymore: up to\n * the later of the last line break and the last sentence terminator followed\n * by whitespace. Empty when no boundary has been reached yet.\n */\nexport function getCommittedReasoningText(text: string): string {\n const lastNewline = text.lastIndexOf('\\n');\n let lastSentence = -1;\n const sentenceEnd = /[.!?](?=\\s)/g;\n let match: RegExpExecArray | null;\n\n while ((match = sentenceEnd.exec(text)) !== null) {\n lastSentence = match.index;\n }\n\n const boundary = Math.max(lastNewline, lastSentence);\n\n if (boundary < 0) {\n return '';\n }\n\n return text.slice(0, boundary + 1);\n}\n\n/**\n * One-line label for a reasoning part: the heading or first sentence of the\n * latest committed paragraph. Updates only at line/sentence boundaries so the\n * status line does not flicker on every token.\n */\nexport function getReasoningStatusLabel(text: string, options: { streaming: boolean }): string | null {\n const committed = options.streaming ? getCommittedReasoningText(text) : text;\n const lines = committed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const last = lines[lines.length - 1];\n\n if (!last) {\n return null;\n }\n\n const heading = /^\\*\\*(.+?)\\*\\*:?$/.exec(last)?.[1] ?? /^#{1,6}\\s+(.+)$/.exec(last)?.[1];\n const candidate = heading ?? /^(.+?[.!?])(?:\\s|$)/.exec(last)?.[1] ?? last;\n const plain = stripInlineMarkdown(candidate);\n\n if (!plain || /^reasoning$/i.test(plain)) {\n return null;\n }\n\n return truncateLabel(plain);\n}\n\nfunction humanizeToolName(tool: string): string {\n return tool.replace(/[_-]+/g, ' ').trim();\n}\n\n/** Gerund label for a rolling-status part, or null once the call concluded. */\nexport function getRollingStatusLabel(part: ReplayMessagePart): string | null {\n if (part.type === 'data-load-skill') {\n const data = getPartData<ReplayDataParts['load-skill']>(part);\n\n if (data.status !== 'loading') {\n return null;\n }\n\n return data.skillName ? truncateLabel(`Loading skill \"${data.skillName}\"`) : 'Loading skill';\n }\n\n if (part.type === 'data-search-schema') {\n const data = getPartData<ReplayDataParts['search-schema']>(part);\n\n return data.status === 'loading' ? 'Searching schema' : null;\n }\n\n if (part.type === 'data-validate-graphql') {\n const data = getPartData<ReplayDataParts['validate-graphql']>(part);\n\n return data.status === 'loading' ? 'Validating GraphQL query' : null;\n }\n\n if (part.type === 'data-execute-graphql') {\n const data = getPartData<ReplayDataParts['execute-graphql']>(part);\n\n if (data.status !== 'loading') {\n return null;\n }\n\n return data.operationType === 'mutation' ? 'Executing GraphQL mutation' : 'Executing GraphQL query';\n }\n\n if (part.type === 'data-update-memory') {\n const data = getPartData<ReplayDataParts['update-memory']>(part);\n\n return data.status === 'loading' ? 'Updating memory' : null;\n }\n\n if (part.type === 'data-web-search') {\n const data = getPartData<ReplayDataParts['web-search']>(part);\n\n if (data.status !== 'loading') {\n return null;\n }\n\n return data.query ? truncateLabel(`Searching the web for \"${data.query}\"`) : 'Searching the web';\n }\n\n if (part.type === 'data-run-command') {\n const data = getPartData<ReplayDataParts['run-command']>(part);\n\n if (!['executing', 'running', 'waiting'].includes(data.status)) {\n return null;\n }\n\n return truncateLabel(`Running ${[data.command, ...data.args].join(' ')}`);\n }\n\n if (part.type === 'data-create-sandbox') {\n const data = getPartData<ReplayDataParts['create-sandbox']>(part);\n\n return data.status === 'loading' ? 'Creating sandbox' : null;\n }\n\n if (part.type === 'data-plugin-call') {\n const data = getPartData<ReplayDataParts['plugin-call']>(part);\n\n if (data.status !== 'loading') {\n return null;\n }\n\n return truncateLabel(`Calling ${data.pluginId}: ${humanizeToolName(data.tool)}`);\n }\n\n if (part.type === 'data-subtask') {\n const data = getPartData<ReplayDataParts['subtask']>(part);\n\n return data.status === 'running' ? truncateLabel(`Running subtask: ${data.title}`) : null;\n }\n\n return null;\n}\n\n/** Error text for a failed rolling-status part, or null when it did not fail. */\n/**\n * Schema lookups and GraphQL validation or query failures are the agent's own\n * missteps: it reads the error and corrects the next call. Showing them would\n * only tell the user about a problem they cannot act on.\n */\nconst AGENT_INTERNAL_ERROR_PART_TYPES = new Set<string>(['data-execute-graphql', 'data-search-schema', 'data-validate-graphql']);\n\nexport function getRollingStatusError(part: ReplayMessagePart): string | null {\n if (!isRollingStatusPartType(part.type) || part.type === 'data-plan' || AGENT_INTERNAL_ERROR_PART_TYPES.has(part.type)) {\n return null;\n }\n\n const data = getPartData<{ status: string; error?: { message?: string } } & { [key: string]: unknown }>(part);\n\n if (data.status !== 'error') {\n return null;\n }\n\n if (data.error?.message) {\n return data.error.message;\n }\n\n switch (part.type) {\n case 'data-web-search':\n return 'Failed to search the web';\n case 'data-run-command':\n return `Command failed: ${String(data.command ?? '')}`.trim();\n case 'data-create-sandbox':\n return 'Failed to create sandbox';\n case 'data-load-skill':\n return 'Failed to load skill';\n case 'data-update-memory':\n return 'Failed to update memory';\n case 'data-plugin-call':\n return `Plugin call failed: ${String(data.pluginId ?? '')}: ${humanizeToolName(String(data.tool ?? ''))}`;\n default:\n return 'The tool call failed';\n }\n}\n\n/**\n * Parts that never render in the conversation: they either feed the transient\n * status line, are internal bookkeeping, or were cleared without anyone being\n * asked. Failed calls stay visible so the user learns what went wrong.\n */\nexport function isHiddenReplayPart(part: ReplayMessagePart): boolean {\n if (part.type === 'step-start' || part.type === 'reasoning') {\n return true;\n }\n\n if (isRollingStatusPartType(part.type)) {\n return getRollingStatusError(part) === null;\n }\n\n if (part.type === 'data-mutation-approval') {\n const data = getPartData<ReplayDataParts['mutation-approval']>(part);\n\n return isJevAutoApproved(data) && data.status !== 'error';\n }\n\n return false;\n}\n\n/**\n * Label describing what the agent is doing right now, derived from the tail\n * of the stream: streaming reasoning, a pending approval, or an in-flight\n * tool call. Null when nothing specific is known (callers show \"Thinking\").\n */\n/** \"Step 2 of 5: Fetch threads\" from the latest plan part, if one has an in-progress step. */\nexport function getPlanStatusLabel(message: ReplayMessage | undefined): string | null {\n if (!message) {\n return null;\n }\n\n for (let index = message.parts.length - 1; index >= 0; index--) {\n const part = message.parts[index];\n\n if (part?.type !== 'data-plan') {\n continue;\n }\n\n const data = getPartData<ReplayDataParts['plan']>(part);\n const current = data.steps.findIndex((step) => step.status === 'in_progress');\n\n if (current < 0) {\n return null;\n }\n\n return truncateLabel(`Step ${(current + 1).toString()} of ${data.steps.length.toString()}: ${data.steps[current]!.step}`);\n }\n\n return null;\n}\n\nexport function getLiveStatusLabel(message: ReplayMessage | undefined): string | null {\n if (!message) {\n return null;\n }\n\n for (let index = message.parts.length - 1; index >= 0; index--) {\n const part = message.parts[index];\n\n if (!part || part.type === 'step-start') {\n continue;\n }\n\n if (part.type === 'reasoning') {\n if (part.state === 'streaming') {\n return getReasoningStatusLabel(part.text, { streaming: true }) ?? getPlanStatusLabel(message);\n }\n\n return getPlanStatusLabel(message);\n }\n\n if (part.type === 'data-mutation-approval') {\n const data = getPartData<ReplayDataParts['mutation-approval']>(part);\n\n return data.status === 'pending' ? 'Awaiting approval' : getPlanStatusLabel(message);\n }\n\n if (part.type === 'text') {\n return null;\n }\n\n // A tool label beats the plan step while the tool runs; the plan fills the gaps.\n return getRollingStatusLabel(part) ?? getPlanStatusLabel(message);\n }\n\n return null;\n}\n","import type { AutomationApprovalStatus } from '@flexkit/agent-protocol';\nimport type { ReplayDataParts, ReplayMessage } from './replay';\nimport { getPartData } from './status-label';\n\n/** Decisions this client made or observed, by approval id, before the stream caught up. */\nexport type DecidedApprovals = { [approvalId: string]: AutomationApprovalStatus };\n\nexport function messageHasPendingMutationApproval(message: ReplayMessage | undefined): boolean {\n if (!message) {\n return false;\n }\n\n return message.parts.some((part) => {\n if (part.type !== 'data-mutation-approval') {\n return false;\n }\n\n return getPartData<ReplayDataParts['mutation-approval']>(part).status === 'pending';\n });\n}\n\n/**\n * Once the run record says execution resumed, a `pending` approval part in\n * the in-memory replay is stale. Parts whose decision this client knows are\n * patched to that status so the card stays mounted; unknown ones are dropped\n * until the rebuilt stream delivers their real status.\n */\nexport function settlePendingMutationApprovals(message: ReplayMessage, decided: DecidedApprovals = {}): ReplayMessage {\n let changed = false;\n const parts: ReplayMessage['parts'] = [];\n\n for (const part of message.parts) {\n if (part.type !== 'data-mutation-approval') {\n parts.push(part);\n continue;\n }\n\n const data = getPartData<ReplayDataParts['mutation-approval']>(part);\n\n if (data.status !== 'pending') {\n parts.push(part);\n continue;\n }\n\n changed = true;\n const status = decided[data.approvalId];\n\n if (status && status !== 'pending') {\n parts.push({ ...part, data: { ...data, status } } as typeof part);\n }\n }\n\n return changed ? { ...message, parts } : message;\n}\n\nexport function getMutationApprovalIds(\n message: ReplayMessage | undefined,\n options?: { pendingOnly?: boolean }\n): string[] {\n if (!message) {\n return [];\n }\n\n const approvalIds: string[] = [];\n const pendingOnly = options?.pendingOnly ?? false;\n\n for (const part of message.parts) {\n if (part.type !== 'data-mutation-approval') {\n continue;\n }\n\n const data = getPartData<ReplayDataParts['mutation-approval']>(part);\n\n if (pendingOnly && data.status !== 'pending') {\n continue;\n }\n\n approvalIds.push(data.approvalId);\n }\n\n return approvalIds;\n}\n\nexport function getPendingMutationApprovalIds(message: ReplayMessage | undefined): string[] {\n return getMutationApprovalIds(message, { pendingOnly: true });\n}\n","import type { UIMessageChunk } from 'ai';\nimport { pipeJsonRender } from '@json-render/core';\n\nexport class LegacyStreamError extends Error {}\nclass PermanentStreamError extends Error {}\ntype State = { terminal: boolean; paused: boolean };\n\n/** Cursor and parser state have the same lifetime. Neither is reused alone.\n * A remount deliberately starts at zero; reconnects reuse both. */\nexport function createResumableUiStream({\n url,\n signal,\n state,\n onState,\n wake,\n fetchStream = fetch,\n retryMs = 2000,\n}: {\n url: string;\n signal: AbortSignal;\n state: () => State;\n onState: (status: 'streaming' | 'paused' | 'finished' | 'unavailable') => void;\n /** A `wake` event here ends the current pause or retry wait so `state` is re-read at once. */\n wake?: EventTarget;\n fetchStream?: typeof fetch;\n retryMs?: number;\n}): ReadableStream<UIMessageChunk> {\n let cursor = 0;\n let failures = 0;\n const bridge = new TransformStream<UIMessageChunk, UIMessageChunk>();\n const writer = bridge.writable.getWriter();\n const local = new AbortController();\n void writer.closed.catch((error) => local.abort(error));\n const abort = () => {\n local.abort(signal.reason);\n void writer.abort(signal.reason).catch(() => undefined);\n };\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) abort();\n const wait = () =>\n new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n local.signal.removeEventListener('abort', done);\n wake?.removeEventListener('wake', done);\n resolve();\n };\n const timer = setTimeout(done, retryMs);\n local.signal.addEventListener('abort', done, { once: true });\n wake?.addEventListener('wake', done, { once: true });\n if (local.signal.aborted) done();\n });\n\n async function pump() {\n try {\n await writer.write({ type: 'start' });\n while (!local.signal.aborted) {\n try {\n const response = await fetchStream(`${url}${url.includes('?') ? '&' : '?'}wire=2&startIndex=${cursor}`, {\n credentials: 'include',\n signal: local.signal,\n });\n if (response.status === 404) {\n onState('unavailable');\n await writer.close();\n return;\n }\n if (response.status === 401 || response.status === 403)\n throw new PermanentStreamError('Stream access denied');\n if (!response.ok || !response.body) throw new Error(`Stream request failed: ${response.status}`);\n if (response.headers.get('x-flexkit-stream-version') !== '2') {\n await response.body.cancel();\n throw new LegacyStreamError('Backend uses legacy replay');\n }\n onState('streaming');\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n let partial = '';\n let complete = false;\n try {\n while (!local.signal.aborted) {\n const { value, done } = await reader.read();\n if (done) break;\n partial += value;\n let end: number;\n while ((end = partial.indexOf('\\n')) >= 0) {\n const line = partial.slice(0, end);\n partial = partial.slice(end + 1);\n if (!line) continue;\n const frame = JSON.parse(line) as { index: number; chunk: UIMessageChunk | null };\n if (!Number.isSafeInteger(frame.index) || frame.index < 0) throw new Error('Invalid replay cursor');\n if (frame.index < cursor) continue; // Retry duplicates never enter the parser.\n if (frame.index !== cursor) throw new Error('Replay cursor gap');\n if (frame.chunk) await writer.write(frame.chunk);\n cursor = frame.index + 1;\n failures = 0;\n if (\n frame.chunk?.type === 'finish' &&\n (frame.chunk.messageMetadata as { flexkitTerminal?: boolean } | undefined)?.flexkitTerminal\n )\n complete = true;\n }\n if (partial.length > 2_000_000) throw new Error('Oversized replay frame');\n if (complete) break;\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n reader.releaseLock();\n }\n if (complete || (state().terminal && !partial)) {\n await writer.write({ type: 'finish' });\n await writer.close();\n onState('finished');\n return;\n }\n } catch (error) {\n if (\n local.signal.aborted ||\n error instanceof LegacyStreamError ||\n error instanceof PermanentStreamError ||\n ++failures >= 5\n )\n throw error;\n // Keep the same parser and last accepted cursor after a dropped or\n // truncated HTTP response. No partial frame advances the cursor.\n }\n do {\n onState(state().paused ? 'paused' : 'streaming');\n await wait();\n } while (!local.signal.aborted && state().paused && !state().terminal);\n }\n } catch (error) {\n await writer.abort(error).catch(() => undefined);\n } finally {\n signal.removeEventListener('abort', abort);\n writer.releaseLock();\n }\n }\n void pump(); // Lifetime owned by the returned stream and the abort signal.\n return pipeJsonRender(bridge.readable) as ReadableStream<UIMessageChunk>;\n}\n","import { createResumableUiStream, LegacyStreamError } from './resumable-stream';\nimport { Link, useLocation } from 'react-router-dom';\nimport type { JSX } from 'react';\nimport type { TextUIPart, UIMessage, UIMessageChunk } from 'ai';\nimport { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { parseJsonEventStream, readUIMessageStream, uiMessageChunkSchema } from 'ai';\nimport {\n BotIcon,\n CheckCircle2Icon,\n CheckIcon,\n CircleSlashIcon,\n CloudUploadIcon,\n DatabaseZapIcon,\n DownloadIcon,\n LinkIcon,\n FileTextIcon,\n LoaderCircle,\n MessageSquareIcon,\n SendIcon,\n ShieldCheckIcon,\n ShieldIcon,\n XCircleIcon,\n XIcon,\n} from 'lucide-react';\nimport { useConfig } from '../../core/config/config-context';\nimport { Button, MessageResponse } from '../../ui';\nimport useSWR from 'swr';\nimport { createApiClient, fetcher, paths } from './api';\nimport { ApprovalCard } from './approval-card';\nimport {\n type DecidedApprovals,\n messageHasPendingMutationApproval,\n settlePendingMutationApprovals,\n} from './approval-parts';\n\nexport {\n getMutationApprovalIds,\n getPendingMutationApprovalIds,\n messageHasPendingMutationApproval,\n} from './approval-parts';\nexport type { DecidedApprovals } from './approval-parts';\nimport { lazy, Suspense } from 'react';\nconst LazyRunSpecPart = lazy(() => import('./spec-renderer').then((module) => ({ default: module.RunSpecPart })));\nfunction RunSpecPart(props: React.ComponentProps<typeof LazyRunSpecPart>) {\n return (\n <Suspense fallback={null}>\n <LazyRunSpecPart {...props} />\n </Suspense>\n );\n}\nimport {\n getPartData,\n getRollingStatusError,\n isHiddenReplayPart,\n isJevAutoApproved,\n isRollingStatusPartType,\n} from './status-label';\nimport type { DataPart } from '@flexkit/agent-protocol';\nimport type { AutomationApproval, AutomationRun } from './types';\nimport { watchSchemaDeployment } from './schema-deploy-watch';\n\nexport {\n getLiveStatusLabel,\n getPartData,\n getRollingStatusError,\n isHiddenReplayPart,\n isRollingStatusPartType,\n} from './status-label';\n\nexport function useProjectApi(): { api: ReturnType<typeof createApiClient> | null; projectId: string | undefined } {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createApiClient(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\nexport interface ReplayMetadata {\n model?: string;\n}\n\n/**\n * Parts streamed by the platform, derived from the shared protocol schema; the\n * index signature keeps `UIMessage` happy with parts this build does not know.\n */\nexport interface ReplayDataParts extends DataPart {\n [key: string]: unknown;\n}\n\ninterface ReplayTools {\n [key: string]: {\n input: unknown;\n output: unknown | undefined;\n };\n}\n\nexport type ReplayMessage = UIMessage<ReplayMetadata, ReplayDataParts, ReplayTools>;\nexport type ReplayMessagePart = ReplayMessage['parts'][number];\nexport type RunStreamStatus = 'streaming' | 'paused' | 'finished' | 'error' | 'unavailable';\n/** The persisted record status backing a stream (automation run or chat turn). */\nexport type RunRecordStatus = AutomationRun['status'];\ntype ConsumeOnceResult = 'finished' | 'incomplete' | 'unavailable';\n\nconst MAX_STREAM_ATTEMPTS = 5;\nexport const STREAM_RETRY_DELAY_MS = 2000;\nconst REPLAY_RENDER_INTERVAL_MS = 120;\nconst JSON_RENDER_SPEC_PART_TYPE = 'data-spec';\n\nexport interface RunReplayActions {\n /** A proposal was decided here or seen decided elsewhere; `status` lets the replay keep its card mounted. */\n onApprovalDecided: (_approvalId?: string, _status?: AutomationApproval['status']) => void;\n}\n\nexport const RunReplayActionsContext = createContext<RunReplayActions | null>(null);\nexport const ChatApprovalContext = createContext(false);\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => window.setTimeout(resolve, ms));\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');\n}\n\nfunction hasRenderableParts(parts: ReplayMessagePart[]): boolean {\n return parts.some((part) => !isHiddenReplayPart(part));\n}\n\nfunction getMarkerIds(messages: ReplayMessage[]): Set<string> {\n const markerIds = new Set<string>();\n\n for (const message of messages) {\n for (const part of message.parts) {\n if (part.type === 'data-user-message' && part.id) {\n markerIds.add(part.id);\n }\n }\n }\n\n return markerIds;\n}\n\nfunction splitSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n const markerIds = getMarkerIds(messages);\n const result: ReplayMessage[] = [];\n\n for (const message of messages) {\n if (message.role === 'user') {\n if (!markerIds.has(message.id)) {\n result.push(message);\n }\n\n continue;\n }\n\n if (message.role !== 'assistant') {\n result.push(message);\n\n continue;\n }\n\n let parts: ReplayMessagePart[] = [];\n let chunkIndex = 0;\n\n const flush = (): void => {\n if (hasRenderableParts(parts)) {\n result.push({ ...message, id: `${message.id}-${chunkIndex.toString()}`, parts });\n }\n\n chunkIndex++;\n parts = [];\n };\n\n for (const part of message.parts) {\n if (part.type === 'data-user-message') {\n const data = getPartData<ReplayDataParts['user-message']>(part);\n\n flush();\n result.push({\n id: part.id ?? crypto.randomUUID(),\n parts: data.parts as ReplayMessagePart[],\n role: 'user',\n });\n\n continue;\n }\n\n parts.push(part);\n }\n\n flush();\n }\n\n return result;\n}\n\nexport function useSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n return useMemo(() => splitSessionMessages(messages), [messages]);\n}\n\nexport function isTerminalRunStatus(status: RunRecordStatus | null | undefined): boolean {\n return status === 'success' || status === 'failed' || status === 'cancelled' || status === 'skipped';\n}\n\nfunction shouldPauseStreamForApproval({\n latestMessage,\n recordStatus,\n suppressApprovalPause,\n}: {\n latestMessage: ReplayMessage | undefined;\n recordStatus: RunRecordStatus | null | undefined;\n suppressApprovalPause: boolean;\n}): boolean {\n if (isTerminalRunStatus(recordStatus)) {\n return false;\n }\n\n // After a local approval decision the run/stream can still look suspended\n // until the workflow hook resumes — keep reconnecting in that case.\n if (suppressApprovalPause) {\n return false;\n }\n\n // The run record is authoritative once execution has resumed. A stale\n // pending data-mutation-approval part can linger in the replay until the\n // next workflow step writes an updated status.\n if (recordStatus === 'running') {\n return false;\n }\n\n if (recordStatus === 'awaiting_approval') {\n return true;\n }\n\n // Fall back to the stream part when the run record hasn't caught up yet.\n return messageHasPendingMutationApproval(latestMessage);\n}\n\n/** A single UI parser remains alive across approval waits and reconnects. */\nexport function useRunStream(\n streamApi: string,\n options?: {\n decidedApprovals?: DecidedApprovals;\n recordStatus?: RunRecordStatus | null;\n resumeToken?: number;\n suppressApprovalPause?: boolean;\n }\n): { message: ReplayMessage | undefined; status: RunStreamStatus } {\n const [legacy, setLegacy] = useState(false);\n const fallback = useLegacyRunStream(legacy ? streamApi : '', options);\n const [message, setMessage] = useState<ReplayMessage>();\n const [status, setStatus] = useState<RunStreamStatus>('streaming');\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const wakeRef = useRef<EventTarget | null>(null);\n if (!wakeRef.current) wakeRef.current = new EventTarget();\n const wake = wakeRef.current;\n // A local approval decision bumps resumeToken after setting\n // suppressApprovalPause; re-read the pause state now rather than after the\n // retry delay, so the run resumes as soon as the user decides.\n const resumeToken = options?.resumeToken;\n useEffect(() => {\n wake.dispatchEvent(new Event('wake'));\n }, [resumeToken, wake]);\n useEffect(() => {\n setLegacy(false);\n setMessage(undefined);\n if (!streamApi) {\n setStatus('unavailable');\n return;\n }\n const abort = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let latest: ReplayMessage | undefined;\n const flush = () => {\n timer = undefined;\n if (latest && !abort.signal.aborted) setMessage({ ...latest });\n };\n const stream = createResumableUiStream({\n url: streamApi,\n signal: abort.signal,\n state: () => ({\n terminal: isTerminalRunStatus(optionsRef.current?.recordStatus),\n paused: shouldPauseStreamForApproval({\n latestMessage: latest,\n recordStatus: optionsRef.current?.recordStatus,\n suppressApprovalPause: optionsRef.current?.suppressApprovalPause ?? false,\n }),\n }),\n onState: (next) => {\n if (!abort.signal.aborted) setStatus(next);\n },\n wake,\n });\n void (async () => {\n try {\n for await (const current of readUIMessageStream<ReplayMessage>({ stream, terminateOnError: true })) {\n latest = current;\n if (!timer) timer = setTimeout(flush, REPLAY_RENDER_INTERVAL_MS);\n }\n flush();\n } catch (error) {\n if (abort.signal.aborted) return;\n if (error instanceof LegacyStreamError) setLegacy(true);\n else {\n console.error('Run stream error', error);\n setStatus('error');\n }\n }\n })();\n return () => {\n abort.abort();\n if (timer) clearTimeout(timer);\n };\n }, [streamApi, wake]);\n if (legacy) return fallback;\n return {\n message: message ? settlePendingMutationApprovals(message, options?.decidedApprovals ?? {}) : undefined,\n status,\n };\n}\n\nfunction useLegacyRunStream(\n streamApi: string,\n options?: {\n /** Decisions known to this client, applied to stale pending parts while the stream rebuilds. */\n decidedApprovals?: DecidedApprovals;\n recordStatus?: RunRecordStatus | null;\n resumeToken?: number;\n suppressApprovalPause?: boolean;\n }\n): {\n message: ReplayMessage | undefined;\n status: RunStreamStatus;\n} {\n const [message, setMessage] = useState<ReplayMessage>();\n const [status, setStatus] = useState<RunStreamStatus>('streaming');\n const recordStatus = options?.recordStatus;\n const resumeToken = options?.resumeToken ?? 0;\n const decidedApprovalsRef = useRef(options?.decidedApprovals ?? {});\n decidedApprovalsRef.current = options?.decidedApprovals ?? {};\n // Read via ref so clearing the post-decide suppress window does not abort a\n // healthy reconnect the way resetting resumeToken would.\n const suppressApprovalPauseRef = useRef(options?.suppressApprovalPause ?? false);\n suppressApprovalPauseRef.current = options?.suppressApprovalPause ?? false;\n const streamApiRef = useRef(streamApi);\n const messageRef = useRef(message);\n messageRef.current = message;\n\n useEffect(() => {\n const streamChanged = streamApiRef.current !== streamApi;\n streamApiRef.current = streamApi;\n\n if (!streamApi) {\n setMessage(undefined);\n setStatus('unavailable');\n\n return;\n }\n\n const abortController = new AbortController();\n // Approval resume and record-status updates restart this effect (they bump\n // resumeToken / recordStatus) but the stream identity is unchanged. Keep\n // the in-memory replay while consumeOnce rebuilds from startIndex=0.\n let latestMessage: ReplayMessage | undefined = streamChanged ? undefined : messageRef.current;\n // While the same stream rebuilds from startIndex=0 the partial replay has\n // fewer parts than what is on screen; keep showing the previous message\n // until the rebuild catches up so cards do not blink out and back.\n const rebuildFloor = streamChanged ? 0 : (latestMessage?.parts.length ?? 0);\n\n if (streamChanged) {\n setMessage(undefined);\n } else if (latestMessage && (recordStatus === 'running' || isTerminalRunStatus(recordStatus))) {\n // Pending data-mutation-approval parts are stale once the run record\n // says execution has resumed. Chat and run UIs treat those parts as\n // still awaiting approval until consumeOnce rebuilds from startIndex=0.\n const nextMessage = settlePendingMutationApprovals(latestMessage, decidedApprovalsRef.current);\n\n if (nextMessage !== latestMessage) {\n latestMessage = nextMessage;\n setMessage(nextMessage);\n }\n }\n\n setStatus('streaming');\n\n // The chat stream URL already carries a workflowRunId query parameter.\n const startIndexSeparator = streamApi.includes('?') ? '&' : '?';\n\n const consumeOnce = async (): Promise<ConsumeOnceResult> => {\n const response = await fetch(`${streamApi}${startIndexSeparator}startIndex=0`, {\n credentials: 'include',\n signal: abortController.signal,\n });\n\n if (response.status === 404) {\n return 'unavailable';\n }\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to fetch the run stream (status ${response.status.toString()})`);\n }\n\n let sawFinish = false;\n const parsedStream = parseJsonEventStream({ schema: uiMessageChunkSchema, stream: response.body });\n type ParsedChunk = typeof parsedStream extends ReadableStream<infer T> ? T : never;\n\n const chunkStream = parsedStream.pipeThrough(\n new TransformStream<ParsedChunk, UIMessageChunk>({\n transform: (result, controller) => {\n if (!result.success) {\n throw result.error;\n }\n\n if (result.value.type === 'finish') {\n sawFinish = true;\n }\n\n controller.enqueue(result.value);\n },\n })\n );\n\n const messageStream = readUIMessageStream<ReplayMessage>({\n onError: (error) => {\n // Unmounting aborts the fetch on purpose; only a real chunk error is worth a log.\n if (abortController.signal.aborted) {\n return;\n }\n\n console.error('Run stream chunk error', error);\n },\n stream: chunkStream,\n });\n\n // Rendering after every chunk makes long replays (thousands of chunks,\n // e.g. large streamed tool inputs) re-render the whole message tree per\n // chunk and freeze the page. Throttle to one trailing update per\n // interval, with a guaranteed final flush after the stream ends.\n let throttleTimer: number | null = null;\n\n let caughtUp = rebuildFloor === 0;\n const flushLatestMessage = (force = false): void => {\n if (abortController.signal.aborted || !latestMessage) {\n return;\n }\n\n if (!caughtUp) {\n caughtUp = force || latestMessage.parts.length >= rebuildFloor;\n\n if (!caughtUp) {\n return;\n }\n }\n\n setMessage({ ...latestMessage });\n };\n\n try {\n for await (const current of messageStream) {\n if (abortController.signal.aborted) {\n break;\n }\n\n latestMessage = current;\n\n if (throttleTimer === null) {\n throttleTimer = window.setTimeout(() => {\n throttleTimer = null;\n flushLatestMessage();\n }, REPLAY_RENDER_INTERVAL_MS);\n }\n }\n } finally {\n if (throttleTimer !== null) {\n window.clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n\n flushLatestMessage(true);\n }\n\n return sawFinish ? 'finished' : 'incomplete';\n };\n\n const consume = async (): Promise<void> => {\n let attempt = 0;\n\n while (!abortController.signal.aborted) {\n if (attempt > 0) {\n await delay(STREAM_RETRY_DELAY_MS);\n }\n\n try {\n const result = await consumeOnce();\n\n if (abortController.signal.aborted) {\n return;\n }\n\n if (result === 'unavailable') {\n setStatus('unavailable');\n\n return;\n }\n\n // The stream route wraps every readable session with a finish chunk,\n // including sessions that close while the durable workflow continues.\n // Only the run record can confirm that the run itself finished.\n if (result === 'finished' && isTerminalRunStatus(recordStatus)) {\n setStatus('finished');\n\n return;\n }\n\n // The run record is authoritative once it reaches a terminal status.\n // Without this, a lingering post-decide suppress flag would reconnect\n // forever when the replay never emits a finish chunk.\n if (isTerminalRunStatus(recordStatus)) {\n setStatus('finished');\n\n return;\n }\n\n // Workflow hooks close the readable without a finish chunk while the\n // run is suspended on a mutation approval. Pause instead of treating\n // that as an error or a perpetual \"Running...\" state.\n if (\n shouldPauseStreamForApproval({\n latestMessage,\n recordStatus,\n suppressApprovalPause: suppressApprovalPauseRef.current,\n })\n ) {\n setStatus('paused');\n\n return;\n }\n\n // Keep reconnecting while the run is active, or right after a local\n // approval decision while the workflow is still waking up.\n const shouldKeepRetrying = recordStatus === 'running' || suppressApprovalPauseRef.current;\n\n if (!shouldKeepRetrying && attempt >= MAX_STREAM_ATTEMPTS - 1) {\n setStatus('error');\n\n return;\n }\n } catch (error) {\n if (abortController.signal.aborted || isAbortError(error)) {\n return;\n }\n\n console.error('Run stream error', error);\n\n if (isTerminalRunStatus(recordStatus)) {\n setStatus('finished');\n\n return;\n }\n\n const shouldKeepRetrying = recordStatus === 'running' || suppressApprovalPauseRef.current;\n\n if (!shouldKeepRetrying && attempt >= MAX_STREAM_ATTEMPTS - 1) {\n setStatus('error');\n\n return;\n }\n }\n\n attempt += 1;\n }\n };\n\n const loadTimeout = window.setTimeout(() => {\n void consume();\n }, 0);\n\n return () => {\n window.clearTimeout(loadTimeout);\n abortController.abort('Run replay unmounted');\n };\n }, [recordStatus, resumeToken, streamApi]);\n\n return { message, status };\n}\n\nexport function toMutationApprovalPartData(approval: AutomationApproval): ReplayDataParts['mutation-approval'] {\n return {\n affectedCount: approval.affectedCount,\n approvalId: approval.id,\n decidedBy: approval.decidedBy ?? undefined,\n operationsSummary: approval.operationsSummary,\n reason: approval.reason ?? undefined,\n status: approval.status,\n };\n}\n\n/**\n * Models sometimes wrap json-render patch lines in a Markdown code fence\n * despite instructions. The patch lines are consumed by the spec pipeline,\n * leaving stray fence-only text parts behind; those are never meaningful.\n */\nexport function isCodeFenceOnlyText(text: string): boolean {\n const trimmed = text.trim();\n\n if (!trimmed) {\n return false;\n }\n\n return trimmed.split('\\n').every((line) => /^`{3,}[\\w-]*$/.test(line.trim()));\n}\n\nexport function MessagePart({\n api,\n part,\n partIndex,\n parts,\n}: {\n api: ReturnType<typeof createApiClient>;\n part: ReplayMessagePart;\n partIndex: number;\n parts: ReplayMessagePart[];\n}): JSX.Element | null {\n // Reasoning, step markers, in-flight tool calls, and Jev-cleared plugin\n // calls only feed the transient status line; nothing to show here.\n if (isHiddenReplayPart(part)) {\n return null;\n }\n\n // A rolling-status call that is not hidden has failed.\n if (isRollingStatusPartType(part.type)) {\n const error = getRollingStatusError(part);\n\n return error ? <ToolErrorLine message={error} /> : null;\n }\n\n if (part.type === 'text') {\n const isStrayFence =\n isCodeFenceOnlyText(part.text) && parts.some((otherPart) => otherPart.type === JSON_RENDER_SPEC_PART_TYPE);\n\n return isStrayFence ? null : <TextPart part={part} />;\n }\n\n if (part.type === 'data-generating-files') {\n return <GenerateFilesPart message={getPartData<ReplayDataParts['generating-files']>(part)} />;\n }\n\n if (part.type === 'data-run-artifact') {\n return <RunArtifactPart api={api} message={getPartData<ReplayDataParts['run-artifact']>(part)} />;\n }\n\n if (part.type === 'data-tool-delivery') {\n return <ToolDeliveryPart message={getPartData<ReplayDataParts['tool-delivery']>(part)} />;\n }\n\n if (part.type === 'data-run-summary') {\n return <RunSummaryPart message={getPartData<ReplayDataParts['run-summary']>(part)} />;\n }\n\n if (part.type === 'data-subtask') {\n const data = getPartData<ReplayDataParts['subtask']>(part);\n const message =\n data.status === 'running'\n ? `Running \"${data.title}\"`\n : data.status === 'done'\n ? `Completed \"${data.title}\"${typeof data.stepsUsed === 'number' ? ` in ${data.stepsUsed.toString()} steps` : ''}`\n : `\"${data.title}\" failed: ${data.error?.message ?? 'unknown error'}`;\n\n return (\n <ToolMessage>\n <ToolHeader>\n <BotIcon className=\"fk:size-3.5\" />\n Subtask\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={data.status === 'error'} loading={data.status === 'running'} />\n </span>\n <span className=\"fk:text-xs\">{message}</span>\n {data.resultPreview ? (\n <p className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{data.resultPreview}</p>\n ) : null}\n </div>\n </ToolMessage>\n );\n }\n\n if (part.type === 'data-context-compaction') {\n const data = getPartData<ReplayDataParts['context-compaction']>(part);\n\n return (\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Earlier messages ({data.summarizedMessageCount.toString()}) were summarized to keep this conversation within the\n model&apos;s context. Details may need to be re-fetched.\n </p>\n );\n }\n\n if (part.type === 'data-plugin-connection') {\n const data = getPartData<ReplayDataParts['plugin-connection']>(part);\n\n return <PluginConnectionPart pluginId={data.pluginId} />;\n }\n\n // Rendered by the chat page under the latest reply, where the composer is in reach.\n if (part.type === 'data-suggested-prompt') {\n return null;\n }\n\n if (part.type === 'data-turn-error') {\n const data = getPartData<ReplayDataParts['turn-error']>(part);\n\n return (\n <ToolMessage className=\"fk:border-red-700/40\">\n <ToolHeader>\n <XCircleIcon className=\"fk:size-3.5 fk:text-red-700\" />\n <span>Turn failed</span>\n </ToolHeader>\n <p className=\"fk:whitespace-pre-wrap fk:text-xs\">{data.message}</p>\n </ToolMessage>\n );\n }\n\n if (part.type === 'data-mutation-approval') {\n const approval = getPartData<ReplayDataParts['mutation-approval']>(part);\n\n return isJevAutoApproved(approval) ? (\n <AutoApprovedCallPart message={approval} />\n ) : (\n <MutationApprovalPart api={api} message={approval} />\n );\n }\n\n if (part.type === 'data-bulk-graphql-action') {\n return <BulkGraphqlActionPart message={getPartData<ReplayDataParts['bulk-graphql-action']>(part)} />;\n }\n\n if (part.type === JSON_RENDER_SPEC_PART_TYPE) {\n const nextSpecPart = parts.slice(partIndex + 1).find((nextPart) => nextPart.type === JSON_RENDER_SPEC_PART_TYPE);\n\n if (nextSpecPart) {\n return null;\n }\n\n return <RunSpecPart parts={parts} />;\n }\n\n if (part.type.startsWith('data-')) {\n return <UnknownDataPart part={part} />;\n }\n\n return null;\n}\n\nfunction TextPart({ part }: { part: TextUIPart }): JSX.Element {\n return (\n <MessageResponse\n className=\"fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:text-base fk:leading-relaxed fk:text-foreground\"\n isAnimating={part.state === 'streaming'}\n >\n {part.text}\n </MessageResponse>\n );\n}\n\n/** Compact inline error row for a failed tool call or turn. */\nexport function ToolErrorLine({ message }: { message: string }): JSX.Element {\n return (\n <div className=\"fk:flex fk:items-start fk:gap-2 fk:rounded-xl fk:border fk:border-red-700/40 fk:bg-destructive/5 fk:px-3.5 fk:py-3 fk:text-sm fk:corner-squircle\">\n <XCircleIcon className=\"fk:mt-0.5 fk:size-3.5 fk:shrink-0 fk:text-red-700\" />\n <span className=\"fk:whitespace-pre-wrap fk:text-xs\">{message}</span>\n </div>\n );\n}\n\n/** Period of the `fk:shimmer-duration-1000` utility, used to keep the phase across label swaps. */\nconst SHIMMER_PERIOD_MS = 1000;\n\n/**\n * Single-line shimmering status indicator that swaps its text with a rolling\n * transition: the previous label exits through the top while the new one\n * enters from the bottom of an overflow-hidden line.\n */\nexport function RollingStatusText({ text }: { text: string }): JSX.Element {\n // The shimmer utility restarts its animation whenever the keyed label span\n // remounts. A negative delay anchored to one origin resumes it in phase.\n const phaseOriginRef = useRef<number>(typeof performance === 'undefined' ? 0 : performance.now());\n const getPhaseDelayMs = (): number => {\n const now = typeof performance === 'undefined' ? 0 : performance.now();\n\n return -((now - phaseOriginRef.current) % SHIMMER_PERIOD_MS);\n };\n const [transition, setTransition] = useState<{\n current: string;\n currentDelayMs: number;\n key: number;\n previous: string | null;\n previousDelayMs: number;\n }>({\n current: text,\n currentDelayMs: 0,\n key: 0,\n previous: null,\n previousDelayMs: 0,\n });\n\n useEffect(() => {\n setTransition((state) => {\n if (state.current === text) {\n return state;\n }\n\n return {\n current: text,\n currentDelayMs: getPhaseDelayMs(),\n key: state.key + 1,\n previous: state.current,\n previousDelayMs: state.currentDelayMs,\n };\n });\n }, [text]);\n\n // The shimmer utility (background-clip: text) sets `animation` itself, so\n // the roll transforms live on wrapper spans to avoid overriding it.\n return (\n <span className=\"fk:relative fk:block fk:h-5 fk:min-w-0 fk:flex-1 fk:overflow-hidden\">\n {transition.previous ? (\n <span\n aria-hidden\n className=\"fk:absolute fk:inset-x-0 fk:top-0 fk:block fk:animate-roll-up-out\"\n key={`previous-${transition.key.toString()}`}\n >\n <span\n className=\"fk:block fk:truncate fk:shimmer fk:shimmer-duration-1000\"\n style={{ animationDelay: `${transition.previousDelayMs.toString()}ms` }}\n >\n {transition.previous}\n </span>\n </span>\n ) : null}\n <span\n className={transition.previous ? 'fk:block fk:animate-roll-up-in' : 'fk:block'}\n key={`current-${transition.key.toString()}`}\n role=\"status\"\n >\n <span\n className=\"fk:block fk:truncate fk:shimmer fk:shimmer-duration-1000\"\n style={{ animationDelay: `${transition.currentDelayMs.toString()}ms` }}\n >\n {transition.current}\n </span>\n </span>\n </span>\n );\n}\n\nconst STATUS_LABEL_MIN_DWELL_MS = 1000;\n\n/**\n * Holds each displayed label for at least `minDwellMs` so a burst of label\n * changes (e.g. a reasoning heading followed by its first sentence) still\n * reads as distinct rolls. The latest pending label wins once the window\n * elapses; A → B → A inside the window collapses to no change.\n */\nexport function useStableStatusLabel(label: string, options?: { minDwellMs?: number }): string {\n const minDwellMs = options?.minDwellMs ?? STATUS_LABEL_MIN_DWELL_MS;\n const [displayed, setDisplayed] = useState(label);\n const shownAtRef = useRef(Date.now());\n const pendingRef = useRef(label);\n pendingRef.current = label;\n\n useEffect(() => {\n if (label === displayed) {\n return;\n }\n\n const wait = Math.max(0, minDwellMs - (Date.now() - shownAtRef.current));\n const timeoutId = window.setTimeout(() => {\n shownAtRef.current = Date.now();\n setDisplayed(pendingRef.current);\n }, wait);\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [displayed, label, minDwellMs]);\n\n return displayed;\n}\n\nexport interface TurnStatus {\n label: string;\n visible: boolean;\n}\n\n/**\n * The one transient status slot of an in-flight turn or run. It keeps its\n * height for the whole turn and only fades while response text streams, so\n * the conversation never shifts when the label appears or disappears.\n * Parents unmount it once the turn reached a terminal state.\n */\nexport function TurnStatusLine({ label, visible }: TurnStatus): JSX.Element {\n const stableLabel = useStableStatusLabel(label);\n\n return (\n <div\n aria-hidden={!visible}\n className={`fk:flex fk:h-9 fk:items-center fk:text-sm fk:text-muted-foreground fk:transition-[opacity,visibility] fk:duration-200 ${\n visible ? 'fk:visible fk:opacity-100' : 'fk:invisible fk:opacity-0'\n }`}\n >\n <RollingStatusText text={stableLabel} />\n </div>\n );\n}\n\nexport function ToolMessage({\n children,\n className = '',\n}: {\n children: React.ReactNode;\n className?: string;\n}): JSX.Element {\n return (\n <div\n className={`fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:rounded-xl fk:border fk:border-border fk:bg-background fk:px-3.5 fk:py-3 fk:text-sm ${className} fk:corner-squircle`}\n >\n {children}\n </div>\n );\n}\n\nexport function ToolHeader({ children }: { children: React.ReactNode }): JSX.Element {\n return <div className=\"fk:flex fk:items-center fk:gap-2 fk:font-medium fk:text-muted-foreground\">{children}</div>;\n}\n\nfunction StatusIcon({ isError, loading }: { isError?: boolean; loading?: boolean }): JSX.Element {\n if (loading) {\n return <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />;\n }\n\n if (isError) {\n return <XIcon className=\"fk:size-4 fk:text-red-700\" />;\n }\n\n return <CheckIcon className=\"fk:size-4\" />;\n}\n\nexport function StatusToolPart({\n error,\n icon,\n loading,\n message,\n title,\n}: {\n error?: string;\n icon: React.ReactNode;\n loading: boolean;\n message: string;\n title: string;\n}): JSX.Element {\n return (\n <ToolMessage>\n <ToolHeader>\n {icon}\n {title}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={Boolean(error)} loading={loading} />\n </span>\n <span className=\"fk:text-xs\">{message}</span>\n </div>\n </ToolMessage>\n );\n}\n\nfunction GenerateFilesPart({ message }: { message: ReplayDataParts['generating-files'] }): JSX.Element {\n const lastInProgress = ['error', 'uploading', 'generating'].includes(message.status);\n const generated = lastInProgress ? message.paths.slice(0, message.paths.length - 1) : message.paths;\n const generating = lastInProgress ? (message.paths[message.paths.length - 1] ?? '') : null;\n\n return (\n <ToolMessage>\n <ToolHeader>\n <CloudUploadIcon className=\"fk:size-3.5\" />\n <span>{message.status === 'done' ? 'Uploaded files' : 'Generating files'}</span>\n </ToolHeader>\n <div className=\"fk:space-y-1 fk:text-sm\">\n {generated.map((path, index) => (\n <div className=\"fk:flex fk:items-center fk:gap-2\" key={`${path}-${index.toString()}`}>\n <CheckIcon className=\"fk:size-4\" />\n <span className=\"fk:whitespace-pre-wrap\">{path}</span>\n </div>\n ))}\n {typeof generating === 'string' ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <StatusIcon isError={message.status === 'error'} loading={message.status !== 'error'} />\n <span>{message.status === 'error' ? (message.error?.message ?? generating) : generating}</span>\n </div>\n ) : null}\n </div>\n </ToolMessage>\n );\n}\n\nexport function RunArtifactPart({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayDataParts['run-artifact'];\n}): JSX.Element {\n const isDone = message.status === 'done' && message.artifactId;\n const previewUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '') : '';\n const downloadUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '', { download: true }) : '';\n const bytes = formatBytes(message.sizeBytes);\n\n return (\n <ToolMessage>\n <ToolHeader>\n <FileTextIcon className=\"fk:size-3.5\" />\n {message.status === 'done' ? 'Published artifact' : 'Publishing artifact'}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={message.status === 'error'} loading={message.status === 'uploading'} />\n </span>\n <div className=\"fk:min-w-0 fk:space-y-2\">\n <div className=\"fk:min-w-0\">\n <div className=\"fk:truncate fk:font-medium\">{message.filename}</div>\n <div className=\"fk:text-xs fk:text-muted-foreground\">\n {message.status === 'uploading' && 'Uploading to artifacts'}\n {message.status === 'done' && [getArtifactLabel(message), bytes].filter(Boolean).join(' · ')}\n {message.status === 'error' && (message.error?.message ?? 'Failed to publish artifact')}\n </div>\n </div>\n {isDone ? (\n <div className=\"fk:flex fk:flex-wrap fk:gap-2\">\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={previewUrl} rel=\"noreferrer\" target=\"_blank\">\n Preview\n </a>\n </Button>\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={downloadUrl}>\n <DownloadIcon className=\"fk:size-3\" />\n Download\n </a>\n </Button>\n {message.url ? (\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={message.url} rel=\"noreferrer\" target=\"_blank\">\n <LinkIcon className=\"fk:size-3\" />\n Permanent link\n </a>\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n </ToolMessage>\n );\n}\n\nfunction ToolDeliveryPart({ message }: { message: ReplayDataParts['tool-delivery'] }): JSX.Element {\n const providerLabel = message.provider === 'slack' ? 'Slack' : 'Microsoft Teams';\n const icon =\n message.provider === 'slack' ? <MessageSquareIcon className=\"fk:size-3.5\" /> : <SendIcon className=\"fk:size-3.5\" />;\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={icon}\n loading={message.status === 'loading'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed to send result to ${message.channelName}`)\n : `${message.status === 'done' ? 'Sent' : 'Sending'} result to ${message.channelName}`\n }\n title={`${providerLabel} Delivery`}\n />\n );\n}\n\nfunction RunSummaryPart({ message }: { message: ReplayDataParts['run-summary'] }): JSX.Element {\n const icon =\n message.status === 'success' ? (\n <CheckCircle2Icon className=\"fk:size-3.5 fk:text-green-700\" />\n ) : message.status === 'skipped' ? (\n <CircleSlashIcon className=\"fk:size-3.5\" />\n ) : (\n <XCircleIcon className=\"fk:size-3.5 fk:text-red-700\" />\n );\n const title =\n message.status === 'success' ? 'Run completed' : message.status === 'skipped' ? 'Run skipped' : 'Run failed';\n\n return (\n <ToolMessage className={message.status === 'failed' ? 'fk:border-red-700/40' : 'fk:border-green-700/40'}>\n <ToolHeader>\n {icon}\n <span>{title}</span>\n </ToolHeader>\n {message.status === 'failed' ? <p className=\"fk:whitespace-pre-wrap fk:text-xs\">{message.summary}</p> : null}\n </ToolMessage>\n );\n}\n\ninterface ApprovalResponse {\n approval: AutomationApproval;\n}\n\nexport function MutationApprovalPart({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayDataParts['mutation-approval'];\n}): JSX.Element {\n const { projectId } = useProjectApi();\n const replayActions = useContext(RunReplayActionsContext);\n const isChat = useContext(ChatApprovalContext);\n const previousApprovalStatusRef = useRef<AutomationApproval['status'] | undefined>(undefined);\n // Poll while the stream still says pending so a decision from the Approvals\n // inbox / another tab updates this card. RunReplay refreshes the run record\n // on the same interval but does not touch this approval fetch.\n const { data, error, isValidating, mutate } = useSWR<ApprovalResponse>(\n projectId ? paths(projectId).approval(message.approvalId) : null,\n fetcher,\n {\n refreshInterval: (latestData) => {\n if (message.status !== 'pending') {\n return 0;\n }\n\n if (latestData?.approval?.status && latestData.approval.status !== 'pending') {\n return 0;\n }\n\n return STREAM_RETRY_DELAY_MS;\n },\n }\n );\n const approvalStatus = data?.approval?.status;\n const isPending = (approvalStatus ?? message.status) === 'pending';\n const approvedSchemaChange = data?.approval?.kind === 'schema' && data.approval.status === 'approved';\n\n // A schema change approved here or elsewhere deploys in the background:\n // watch it so the navbar and Desk pick up the new entities without a reload.\n useEffect(() => {\n if (!approvedSchemaChange || !projectId) {\n return;\n }\n\n watchSchemaDeployment({\n approvalId: message.approvalId,\n approvalUrl: paths(projectId).approval(message.approvalId),\n projectId,\n });\n }, [approvedSchemaChange, message.approvalId, projectId]);\n\n // The stream part changes when the proposal is decided or executed; refresh\n // the full approval (preview, result, error) from the API when that happens.\n useEffect(() => {\n void mutate();\n }, [message.status, mutate]);\n\n // When polling discovers an external decide while the replay part is still\n // pending, reconnect the stream the same way a local decide does. Only a\n // pending -> decided transition observed while mounted counts: a card that\n // mounts with an already-decided approval (e.g. right after a reconnect\n // remounted it) must not trigger another reconnect, or it would loop.\n useEffect(() => {\n const previousStatus = previousApprovalStatusRef.current;\n previousApprovalStatusRef.current = approvalStatus;\n\n if (message.status !== 'pending' || !approvalStatus || approvalStatus === 'pending') {\n return;\n }\n\n if (previousStatus !== 'pending') {\n return;\n }\n\n replayActions?.onApprovalDecided(data?.approval?.id ?? message.approvalId, approvalStatus);\n }, [approvalStatus, data?.approval?.id, message.approvalId, message.status, replayActions]);\n\n function handleDecided(nextApproval: AutomationApproval): void {\n // Keep the external-decide effect from bumping resumeToken again after a\n // local decide already reconnected the stream.\n if (nextApproval.status !== 'pending') {\n previousApprovalStatusRef.current = nextApproval.status;\n }\n\n void mutate();\n // Revalidate the run record and reconnect the workflow stream so the page\n // reflects resumed execution instead of a stale awaiting_approval/error state.\n replayActions?.onApprovalDecided(nextApproval.id, nextApproval.status);\n }\n\n let body: JSX.Element;\n\n if (data?.approval) {\n body = (\n <ApprovalCard\n api={api}\n approval={data.approval}\n chat={isChat}\n key={data.approval.status}\n onDecided={handleDecided}\n />\n );\n } else if (error && !isValidating) {\n const detail = error instanceof Error && error.message ? error.message : 'Request failed';\n\n body = (\n <div className=\"fk:space-y-2\">\n <p className=\"fk:text-xs fk:text-destructive\">\n Failed to load proposal {message.operationsSummary}: {detail}\n </p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => void mutate()}>\n Retry\n </Button>\n </div>\n );\n } else {\n body = (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-3.5 fk:animate-spin\" />\n <span>Loading proposal {message.operationsSummary}...</span>\n </div>\n );\n }\n\n return (\n <ToolMessage>\n <ToolHeader>\n {isChat ? <ShieldIcon className=\"fk:size-3.5\" /> : <DatabaseZapIcon className=\"fk:size-3.5\" />}\n {isChat ? 'Approval request' : 'Mutation approval'}\n {isPending ? <LoaderCircle className=\"fk:ml-1 fk:size-3.5 fk:animate-spin\" /> : null}\n </ToolHeader>\n <div className=\"fk:mt-2\">{body}</div>\n {message.status === 'error' && message.error ? (\n <p className=\"fk:mt-2 fk:text-xs fk:text-destructive\">{message.error.message}</p>\n ) : null}\n </ToolMessage>\n );\n}\n\n/** Only reached for a Jev-cleared call that failed; successful ones are hidden. */\nfunction AutoApprovedCallPart({ message }: { message: ReplayDataParts['mutation-approval'] }): JSX.Element {\n const summary = message.operationsSummary.replace(/^Call /, '');\n\n return (\n <StatusToolPart\n error={message.status === 'error' ? (message.error?.message ?? 'The call failed.') : undefined}\n icon={<ShieldCheckIcon className=\"fk:size-3.5\" />}\n loading={false}\n message={\n message.status === 'error'\n ? `${summary}: ${message.error?.message ?? 'The call failed.'}`\n : `${summary} · Auto-approved by Jev`\n }\n title=\"Plugin call\"\n />\n );\n}\n\nfunction BulkGraphqlActionPart({ message }: { message: ReplayDataParts['bulk-graphql-action'] }): JSX.Element {\n const progress = [\n typeof message.processedItems === 'number' ? `${message.processedItems.toString()} processed` : '',\n typeof message.changedItems === 'number' ? `${message.changedItems.toString()} changed` : '',\n typeof message.failedItems === 'number' ? `${message.failedItems.toString()} failed` : '',\n typeof message.totalItems === 'number' ? `${message.totalItems.toString()} total` : '',\n ].filter(Boolean);\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={message.status === 'loading' || message.status === 'running'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed bulk ${message.operationName}`)\n : `${message.status === 'done' ? 'Completed' : 'Running'} ${message.operationName}${\n progress.length > 0 ? ` (${progress.join(', ')})` : ''\n }`\n }\n title=\"Bulk GraphQL action\"\n />\n );\n}\n\nfunction UnknownDataPart({ part }: { part: ReplayMessagePart }): JSX.Element {\n return (\n <ToolMessage className=\"fk:bg-muted/30\">\n <ToolHeader>\n <CheckCircle2Icon className=\"fk:size-3.5\" />\n {part.type.replace(/^data-/, '').replaceAll('-', ' ')}\n </ToolHeader>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n This run emitted a structured event that is not yet rendered by Studio.\n </p>\n </ToolMessage>\n );\n}\n\nfunction formatBytes(sizeBytes?: number): string {\n if (typeof sizeBytes !== 'number') {\n return '';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes.toString()} B`;\n }\n\n const kilobytes = sizeBytes / 1024;\n\n if (kilobytes < 1024) {\n return `${kilobytes.toFixed(1)} KB`;\n }\n\n return `${(kilobytes / 1024).toFixed(1)} MB`;\n}\n\nfunction getArtifactLabel(message: ReplayDataParts['run-artifact']): string {\n if (message.kind === 'pdf') {\n return 'PDF artifact';\n }\n\n if (message.kind === 'html') {\n return 'HTML artifact';\n }\n\n return 'Artifact';\n}\n\n/** Links to the plugin page, which lists every account and reconnects the one that needs attention. */\nfunction PluginConnectionPart({ pluginId }: { pluginId: string }): JSX.Element {\n const { pathname } = useLocation();\n const [base] = pathname.split('/ai/');\n\n return (\n <ToolMessage>\n <p className=\"fk:text-sm\">Connect {pluginId} to use it in this conversation.</p>\n <Button asChild size=\"sm\" variant=\"outline\">\n <Link to={`${base}/ai/plugins/${encodeURIComponent(pluginId)}`}>Connect {pluginId}</Link>\n </Button>\n </ToolMessage>\n );\n}\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';import {q as q$1,o,r}from'./chunk-2IRKGO2B.js';import {g as g$1}from'./chunk-ZBI744KS.js';import {e}from'./chunk-NNA4MLFC.js';import {useCallback}from'react';import {toast}from'sonner';import {useApolloClient}from'@apollo/client/react';function E(i){let{currentProjectSchema:t}=g$1();return useCallback(a=>{t&&q$1(o(i,t),a);},[i,t])}var g=["image/jpeg","image/png","image/webp","image/vnd.microsoft.icon","image/bmp","image/gif","image/tiff","image/svg+xml","image/avif","image/heic","image/heif","image/heic-sequence","image/heif-sequence","image/apng","audio/aac","audio/mpeg","audio/wav","audio/webm","audio/midi","audio/x-midi","audio/ogg","video/x-msvideo","video/mp4","video/mpeg","video/webm","video/quicktime","video/ogg","video/mp2t","video/3gpp","video/3gpp2","application/x-7z-compressed","application/zip","application/vnd.amazon.ebook","application/octet-stream","application/epub+zip","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-fontobject","application/gzip","application/x-gzip","application/java-archive","application/json","application/ld+json","text/javascript","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/ogg","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.rar","application/x-tar","application/vnd.visio","application/xhtml+xml","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/xml"];function F(i,t){if(!i.type)return true;let a=t?t.split(",").map(e=>e.trim()).filter(Boolean):g;return a.length===0?true:a.some(e=>e.endsWith("/*")?i.type.startsWith(e.slice(0,-1)):i.type===e)}async function x(i,t){let a=new URLSearchParams({filename:i.name}),e$1=await fetch(`${e(t).assets}?${a.toString()}`,{method:"POST",headers:{"Content-Type":i.type||"application/octet-stream"},body:i});if(!e$1.ok)throw new Error(`Upload failed for ${i.name}`);let n=await e$1.json(),o={_id:n._id,path:n.path??"",originalFilename:n.originalFilename??i.name,size:n.size??i.size,mimeType:n.mimeType??i.type,lqip:n.lqip??"",width:n.width??0,height:n.height??0};return {pathname:o.path,lqip:o.lqip||void 0,originalFilename:o.originalFilename,size:o.size,mimeType:o.mimeType,width:o.width||void 0,height:o.height||void 0,_id:o._id,asset:o}}async function h(i,t){let{projectId:a,accept:e,maxBytes:n=4*1024*1024,onUploadStart:o}=t,l=[];for(let p of Array.from(i)){if(p.size>n){toast.error(`File size too big (max ${(n/(1024*1024)).toFixed(0)}MB): ${p.name}`);continue}if(!F(p,e)){toast.error(`Unsupported file type: ${p.name}`);continue}l.push(p);}if(l.length===0)return [];o?.();try{let p=await Promise.all(l.map(async f=>x(f,a)));return p.length>0&&toast.success(`Uploaded ${p.length} file${p.length>1?"s":""}`),p}catch(p){return console.error(p),toast.error("Upload failed. Please try again."),[]}}async function b(i){let{accept:t,multiple:a=true}=i,e=document.createElement("input");e.type="file",e.accept=t??g.join(","),e.multiple=a,e.style.display="none",document.body.appendChild(e);try{let n=await new Promise(o=>{e.addEventListener("change",()=>o(e.files),{once:!0}),e.addEventListener("cancel",()=>o(null),{once:!0}),e.click();});return !n||n.length===0?[]:h(n,i)}finally{document.body.removeChild(e);}}function q(){let i=useApolloClient();return useCallback(async t=>{let a=t.files?await h(t.files,t):await b(t);return a.length>0&&await r(i,"GetAssets").catch(e=>{console.error("Error refreshing asset lists after upload:",e);}),a},[i])}export{E as a,x as b,q as c};//# sourceMappingURL=chunk-GM5OZTHL.js.map
2
- //# sourceMappingURL=chunk-GM5OZTHL.js.map
@@ -1,3 +0,0 @@
1
- import'./index.css';import {put}from'@vercel/blob/client';function I(o,n){let a=n.trim();return a?o.trim()?/\s$/.test(o)||/^[.,!?;:]/.test(a)?`${o}${a}`:`${o} ${a}`:o.length===0?a:`${o}${a}`:o}async function h(o){if(typeof window>"u")throw new Error("Dictation is only available in the browser.");let n=window.AudioContext??window.webkitAudioContext;if(!n)throw new Error("This browser cannot decode recorded audio.");let a=await o.arrayBuffer(),u=new n;try{let e=await u.decodeAudioData(a.slice(0)),r=C(e),t=$(r,e.sampleRate,24e3),i=y(t),l=t.length/24e3;if(l<.25)throw new Error("No speech was captured. Try again.");if(l>60)throw new Error(`Dictation is limited to ${String(60)} seconds.`);return {durationSeconds:l,pcm:new Blob([i],{type:"audio/pcm"})}}finally{await u.close();}}function C(o){let{length:n,numberOfChannels:a}=o;if(a===1)return o.getChannelData(0).slice();let u=new Float32Array(n);for(let e=0;e<n;e+=1){let r=0;for(let t=0;t<a;t+=1)r+=o.getChannelData(t)[e]??0;u[e]=r/a;}return u}function $(o,n,a){if(n===a)return o;let u=n/a,e=Math.max(1,Math.round(o.length/u)),r=new Float32Array(e);for(let t=0;t<e;t+=1){let i=t*u,l=Math.floor(i),s=Math.min(l+1,o.length-1),c=i-l,d=o[l]??0,g=o[s]??0;r[t]=d+(g-d)*c;}return r}function y(o){let n=new ArrayBuffer(o.length*2),a=new DataView(n);for(let u=0;u<o.length;u+=1){let e=Math.max(-1,Math.min(1,o[u]??0));a.setInt16(u*2,e<0?e*32768:e*32767,true);}return n}var m=class extends Error{code;status;constructor(n,a,u=null){super(a),this.name="AgentUploadError",this.code=u,this.status=n;}};function f(){if(typeof window>"u")return "flexkit.io";let{hostname:o}=window.location;return o==="localhost"||o==="127.0.0.1"||o==="flexkit.test"||o.endsWith(".flexkit.test")?"flexkit.test":"flexkit.io"}function w(){return `https://${f()}`}function R(o,n){return `https://${o}.api.${f()}/automations/webhook/${encodeURIComponent(n)}`}function _(o){let n=`/api/flexkit/${o}`,a=`${n}/automations`,u=`${n}/skills`,e=`${n}/agent/chats`;async function r(t,i){let l=await fetch(t,{credentials:"include",headers:{"Content-Type":"application/json",...i?.headers??{}},...i}),s=await l.json();if(!l.ok){let c=s&&typeof s=="object"&&"error"in s?String(s.error):"Request failed";throw new Error(c)}return s}return {connectPlugins:t=>r(`${n}/plugins/connect`,{method:"POST",body:JSON.stringify(t)}),pluginOAuthStatus:t=>r(`${n}/plugins/oauth-transactions/${encodeURIComponent(t)}`),updatePluginConnection:(t,i)=>r(`${n}/plugin-connections/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(i)}),disconnectPlugin:t=>r(`${n}/plugin-connections/${encodeURIComponent(t)}`,{method:"DELETE"}),installPlugin:t=>r(`${n}/plugins/${encodeURIComponent(t)}/installation`,{method:"PUT",body:JSON.stringify({})}),setPluginPolicy:(t,i)=>r(`${n}/plugins/${encodeURIComponent(t)}/policy`,{method:"PATCH",body:JSON.stringify(i)}),refreshPluginTools:t=>r(`${n}/plugin-connections/${encodeURIComponent(t)}/tools/refresh`,{method:"POST"}),cancelRun:async t=>r(`${a}/runs/${encodeURIComponent(t)}/cancel`,{method:"POST"}),createAgentChat:async t=>r(e,{body:JSON.stringify({modelId:t?.modelId??null}),method:"POST"}),deleteAgentChat:async t=>r(`${e}/${encodeURIComponent(t)}`,{method:"DELETE"}),getAgentChatStreamUrl:(t,i)=>`${e}/${encodeURIComponent(t)}/stream?workflowRunId=${encodeURIComponent(i)}`,renameAgentChat:async(t,i)=>r(`${e}/${encodeURIComponent(t)}`,{body:JSON.stringify({title:i}),method:"PATCH"}),sendAgentChatMessage:async(t,i)=>r(`${e}/${encodeURIComponent(t)}/messages`,{body:JSON.stringify(i),method:"POST"}),stopAgentChat:async t=>r(`${e}/${encodeURIComponent(t)}/stop`,{method:"POST"}),transcribeAgentAudio:async(t,i)=>{let{durationSeconds:l,pcm:s}=await h(t),c=new FormData;c.append("file",s,"audio.pcm"),c.append("durationSeconds",String(l));let d=await fetch(`${n}/agent/transcribe`,{body:c,credentials:"include",method:"POST",signal:i}),g=await d.json();if(!d.ok){let A=g&&typeof g=="object"&&g.error?String(g.error):"Request failed";throw new Error(A)}if(!g.text?.trim())throw new Error("No speech was recognized. Try again.");return {text:g.text}},uploadAgentChatAttachment:async(t,i)=>{let l=await fetch(`${n}/agent/uploads`,{body:JSON.stringify({filename:t.name,mediaType:t.type||null,sizeBytes:t.size}),credentials:"include",headers:{"Content-Type":"application/json"},method:"POST",signal:i}),s=await l.json();if(!l.ok||!s.pathname||!s.token||!s.mediaType)throw new m(l.status,s.error?String(s.error):"The file could not be uploaded.",s.code??null);let c=await put(s.pathname,t,{abortSignal:i,access:"public",contentType:s.mediaType,token:s.token});return {filename:t.name,mediaType:s.mediaType,sizeBytes:t.size,url:c.url}},decideApproval:async(t,i)=>{let l=await fetch(`${a}/approvals/${encodeURIComponent(t)}/decide`,{body:JSON.stringify(i),credentials:"include",headers:{"Content-Type":"application/json"},method:"POST"}),s=await l.json();if(!l.ok&&typeof s.success!="boolean")throw new Error(s.error?String(s.error):"Request failed");return s},createAutomation:async t=>r(a,{body:JSON.stringify(t),method:"POST"}),createSkill:async t=>r(u,{body:JSON.stringify(t),method:"POST"}),deleteAutomation:async t=>r(`${a}/${encodeURIComponent(t)}`,{method:"DELETE"}),deleteSkill:async t=>r(`${u}/${encodeURIComponent(t)}`,{method:"DELETE"}),getArtifactUrl:(t,i)=>{let l=i?.download?"?download=1":"";return `${a}/artifacts/${encodeURIComponent(t)}/content${l}`},getRunArtifacts:async t=>r(`${a}/runs/${encodeURIComponent(t)}/artifacts`).then(i=>i.artifacts),getStreamUrl:t=>`${a}/runs/${encodeURIComponent(t)}/stream`,getTranscriptUrl:t=>`${a}/runs/${encodeURIComponent(t)}/transcript`,listChannels:async(t,i)=>{let l=i?`${n}/plugin-connections/${encodeURIComponent(i)}/channels`:`${n}/plugins/${t}/channels`,s=await fetch(l,{credentials:"include",headers:{"Content-Type":"application/json"}}),c=await s.json();if(s.ok)return {channels:c.channels??[],errorMessage:c.errorMessage,success:c.success??true};if(c.success===false)return {channels:c.channels??[],errorMessage:c.errorMessage??`Failed to load ${t==="slack"?"Slack":"Teams"} channels.`,success:false};let d=c.error?String(c.error):"Request failed";throw new Error(d)},runAutomation:async t=>r(`${a}/${encodeURIComponent(t)}/runs`,{method:"POST"}),updateAutomation:async(t,i)=>r(`${a}/${encodeURIComponent(t)}`,{body:JSON.stringify(i),method:"PATCH"}),updateSkill:async(t,i)=>r(`${u}/${encodeURIComponent(t)}`,{body:JSON.stringify(i),method:"PATCH"})}}var p=class extends Error{status;constructor(n,a="Request failed"){super(a),this.name="FetcherError",this.status=n;}},k=async o=>{let n=await fetch(o,{credentials:"include"});if(!n.ok)throw new p(n.status);return await n.json()};function U(o){let n=`/api/flexkit/${o}/automations`,a=`/api/flexkit/${o}/skills`,u=`/api/flexkit/${o}/agent/chats`;return {agentChat:e=>`${u}/${encodeURIComponent(e)}`,agentChatSearch:e=>`${u}/search?q=${encodeURIComponent(e)}`,agentChats:(e=0)=>`${u}?offset=${e.toString()}`,agentProfile:()=>`/api/flexkit/${o}/agent/profile`,approval:e=>`${n}/approvals/${encodeURIComponent(e)}`,approvals:(e={})=>{let{limit:r=25,offset:t=0,runId:i,status:l}=e,s=new URLSearchParams({limit:r.toString(),offset:t.toString()});return l&&s.set("status",l),i&&s.set("runId",i),`${n}/approvals?${s.toString()}`},approvalsCount:`${n}/approvals?limit=1`,automation:e=>`${n}/${encodeURIComponent(e)}`,automationRuns:(e,r=0,t=25)=>`${n}/${encodeURIComponent(e)}/runs?offset=${r.toString()}&limit=${t.toString()}`,automations:(e={})=>{let{enabled:r,limit:t=25,offset:i=0,search:l,visibility:s}=e,c=new URLSearchParams({limit:t.toString(),offset:i.toString()});r&&r.length>0&&c.set("enabled",r.map(g=>g?"true":"false").join(",")),s&&s.length>0&&c.set("visibility",s.join(","));let d=l?.trim();return d&&c.set("q",d),`${n}?${c.toString()}`},creditBalance:`${n}/credits`,entities:`${n}/entities`,run:e=>`${n}/runs/${encodeURIComponent(e)}`,runHistory:(e,r=0,t=25)=>`${n}/runs?scope=${e}&offset=${r.toString()}&limit=${t.toString()}`,skill:e=>`${a}/${encodeURIComponent(e)}`,skills:(e={})=>{let{limit:r=25,offset:t=0,search:i,visibility:l}=e,s=new URLSearchParams({limit:r.toString(),offset:t.toString()});l&&l.length>0&&s.set("visibility",l.join(","));let c=i?.trim();return c&&s.set("q",c),`${a}?${s.toString()}`},spaces:`/api/flexkit/${o}/spaces`,tools:e=>e?`${n}/${encodeURIComponent(e)}/tools`:`${n}/tools`}}
2
- export{I as a,w as b,R as c,_ as d,p as e,k as f,U as g};//# sourceMappingURL=chunk-HROHAMPM.js.map
3
- //# sourceMappingURL=chunk-HROHAMPM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/ai/agent/dictation.ts","../src/apps/ai/api.ts"],"names":["appendDictatedText","existing","transcript","dictated","convertRecordedAudioToPcm","blob","AudioContextCtor","arrayBuffer","audioContext","audioBuffer","mono","mixToMono","resampled","resample","pcm","floatToPcm16","durationSeconds","buffer","length","channelCount","index","sum","channel","samples","sourceRate","targetRate","ratio","outputLength","output","sourceIndex","left","right","fraction","leftSample","rightSample","view","sample","AgentUploadError","status","message","code","getApiRootDomain","hostname","getPlatformOrigin","getWebhookTriggerUrl","projectId","token","createApiClient","projectBasePath","automationsBasePath","skillsBasePath","agentChatsBasePath","request","url","init","response","data","error","input","id","runId","chatId","workflowRunId","title","audio","signal","formData","file","tokenResponse","tokenData","put","approvalId","automationId","skillId","artifactId","options","suffix","provider","connectionId","FetcherError","fetcher","paths","basePath","query","offset","limit","params","enabled","search","visibility","value","trimmedSearch","scope"],"mappings":"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","file":"chunk-HROHAMPM.js","sourcesContent":["export const DICTATION_SAMPLE_RATE = 24_000;\nexport const DICTATION_MAX_DURATION_SECONDS = 60;\nexport const DICTATION_MIN_DURATION_SECONDS = 0.25;\n\nexport function appendDictatedText(existing: string, transcript: string): string {\n const dictated = transcript.trim();\n\n if (!dictated) {\n return existing;\n }\n\n if (!existing.trim()) {\n return existing.length === 0 ? dictated : `${existing}${dictated}`;\n }\n\n if (/\\s$/.test(existing) || /^[.,!?;:]/.test(dictated)) {\n return `${existing}${dictated}`;\n }\n\n return `${existing} ${dictated}`;\n}\n\nexport async function convertRecordedAudioToPcm(blob: Blob): Promise<{ durationSeconds: number; pcm: Blob }> {\n if (typeof window === 'undefined') {\n throw new Error('Dictation is only available in the browser.');\n }\n\n const AudioContextCtor = window.AudioContext ?? window.webkitAudioContext;\n\n if (!AudioContextCtor) {\n throw new Error('This browser cannot decode recorded audio.');\n }\n\n const arrayBuffer = await blob.arrayBuffer();\n const audioContext = new AudioContextCtor();\n\n try {\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer.slice(0));\n const mono = mixToMono(audioBuffer);\n const resampled = resample(mono, audioBuffer.sampleRate, DICTATION_SAMPLE_RATE);\n const pcm = floatToPcm16(resampled);\n const durationSeconds = resampled.length / DICTATION_SAMPLE_RATE;\n\n if (durationSeconds < DICTATION_MIN_DURATION_SECONDS) {\n throw new Error('No speech was captured. Try again.');\n }\n\n if (durationSeconds > DICTATION_MAX_DURATION_SECONDS) {\n throw new Error(`Dictation is limited to ${String(DICTATION_MAX_DURATION_SECONDS)} seconds.`);\n }\n\n return {\n durationSeconds,\n pcm: new Blob([pcm], { type: 'audio/pcm' }),\n };\n } finally {\n await audioContext.close();\n }\n}\n\nfunction mixToMono(buffer: AudioBuffer): Float32Array {\n const { length, numberOfChannels: channelCount } = buffer;\n\n if (channelCount === 1) {\n return buffer.getChannelData(0).slice();\n }\n\n const mono = new Float32Array(length);\n\n for (let index = 0; index < length; index += 1) {\n let sum = 0;\n\n for (let channel = 0; channel < channelCount; channel += 1) {\n sum += buffer.getChannelData(channel)[index] ?? 0;\n }\n\n mono[index] = sum / channelCount;\n }\n\n return mono;\n}\n\nfunction resample(samples: Float32Array, sourceRate: number, targetRate: number): Float32Array {\n if (sourceRate === targetRate) {\n return samples;\n }\n\n const ratio = sourceRate / targetRate;\n const outputLength = Math.max(1, Math.round(samples.length / ratio));\n const output = new Float32Array(outputLength);\n\n for (let index = 0; index < outputLength; index += 1) {\n const sourceIndex = index * ratio;\n const left = Math.floor(sourceIndex);\n const right = Math.min(left + 1, samples.length - 1);\n const fraction = sourceIndex - left;\n const leftSample = samples[left] ?? 0;\n const rightSample = samples[right] ?? 0;\n output[index] = leftSample + (rightSample - leftSample) * fraction;\n }\n\n return output;\n}\n\nfunction floatToPcm16(samples: Float32Array): ArrayBuffer {\n const buffer = new ArrayBuffer(samples.length * 2);\n const view = new DataView(buffer);\n\n for (let index = 0; index < samples.length; index += 1) {\n const sample = Math.max(-1, Math.min(1, samples[index] ?? 0));\n view.setInt16(index * 2, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n }\n\n return buffer;\n}\n\ndeclare global {\n interface Window {\n webkitAudioContext?: typeof AudioContext;\n }\n}\n","import type { PluginConnection, PluginScope, PluginTools } from './plugin-types';\nimport { put } from '@vercel/blob/client';\nimport { convertRecordedAudioToPcm } from './agent/dictation';\nimport type {\n AgentChat,\n AgentChatAttachment,\n AgentChatMessage,\n AgentChatTurn,\n Automation,\n AutomationApproval,\n AutomationApprovalStatus,\n AutomationArtifact,\n AutomationInput,\n AutomationToolChannel,\n AutomationToolProvider,\n AutomationVisibility,\n MutationResult,\n Skill,\n SkillInput,\n} from './types';\n\nexport interface DecideApprovalInput {\n /** Approve and always allow this plugin tool for the automation. */\n remember?: boolean;\n approved: boolean;\n force?: boolean;\n reason?: string;\n}\n\nexport interface SendAgentChatMessageInput {\n attachments?: AgentChatAttachment[];\n content: string;\n modelId?: string | null;\n}\n\n/** Thrown when the API refuses an upload; `code` lets the UI tailor the message. */\nexport class AgentUploadError extends Error {\n code: string | null;\n status: number;\n\n constructor(status: number, message: string, code: string | null = null) {\n super(message);\n this.name = 'AgentUploadError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport interface ApiClient {\n /** Starts OAuth for a new account, or for `connectionId` to reconnect that specific account. */\n connectPlugins: (_input: {\n pluginId: string;\n scope: PluginScope;\n studioOrigin: string;\n connectionId?: string;\n }) => Promise<{ transactionId: string; authorizeUrl: string; completionOrigin: string; launchTicket: string }>;\n /** Renames (label null resets to the provider name) or makes a connection primary. */\n updatePluginConnection: (\n _id: string,\n _input: { label?: string | null; primary?: true }\n ) => Promise<{ connection: PluginConnection }>;\n pluginOAuthStatus: (_id: string) => Promise<{ id: string; status: 'pending' | 'exchanging' | 'complete' | 'failed'; expires_at: string }>;\n disconnectPlugin: (_id: string) => Promise<{ success: boolean }>;\n installPlugin: (_id: string) => Promise<unknown>;\n setPluginPolicy: (_id: string, _input: { enabled: boolean; allowPersonal: boolean }) => Promise<{ success: boolean }>;\n refreshPluginTools: (_id: string) => Promise<PluginTools>;\n\n cancelRun: (_runId: string) => Promise<MutationResult>;\n createAgentChat: (_input?: { modelId?: string | null }) => Promise<{ chat: AgentChat }>;\n deleteAgentChat: (_chatId: string) => Promise<{ success: boolean }>;\n getAgentChatStreamUrl: (_chatId: string, _workflowRunId: string) => string;\n renameAgentChat: (_chatId: string, _title: string) => Promise<{ chat: AgentChat }>;\n sendAgentChatMessage: (_chatId: string, _input: SendAgentChatMessageInput) => Promise<AgentChatTurn>;\n stopAgentChat: (_chatId: string) => Promise<{ message: AgentChatMessage }>;\n transcribeAgentAudio: (_audio: Blob, _signal?: AbortSignal) => Promise<{ text: string }>;\n /** Uploads a chat attachment straight to the platform file store. */\n uploadAgentChatAttachment: (_file: File, _signal?: AbortSignal) => Promise<AgentChatAttachment>;\n decideApproval: (\n _approvalId: string,\n _input: DecideApprovalInput\n ) => Promise<MutationResult & { approval?: AutomationApproval }>;\n createAutomation: (_input: AutomationInput) => Promise<MutationResult & { automation?: Automation }>;\n createSkill: (_input: SkillInput) => Promise<MutationResult & { skill?: Skill }>;\n deleteAutomation: (_automationId: string) => Promise<MutationResult>;\n deleteSkill: (_skillId: string) => Promise<MutationResult>;\n getArtifactUrl: (_artifactId: string, _options?: { download?: boolean }) => string;\n getRunArtifacts: (_workflowRunId: string) => Promise<AutomationArtifact[]>;\n getStreamUrl: (_workflowRunId: string) => string;\n /** JSON transcript of a finished run (owners and developers). */\n getTranscriptUrl: (_runId: string) => string;\n /** Lists delivery channels of `connectionId`, or of the provider's primary project account when omitted. */\n listChannels: (_provider: AutomationToolProvider, _connectionId?: string | null) => Promise<{\n channels: AutomationToolChannel[];\n errorMessage?: string;\n success: boolean;\n }>;\n runAutomation: (_automationId: string) => Promise<MutationResult & { runId?: string }>;\n updateAutomation: (\n _automationId: string,\n _input: AutomationInput\n ) => Promise<MutationResult & { automation?: Automation }>;\n updateSkill: (_skillId: string, _input: SkillInput) => Promise<MutationResult & { skill?: Skill }>;\n}\n\n\nfunction getApiRootDomain(): string {\n if (typeof window === 'undefined') {\n return 'flexkit.io';\n }\n\n const { hostname } = window.location;\n const isDevHost =\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === 'flexkit.test' ||\n hostname.endsWith('.flexkit.test');\n\n return isDevHost ? 'flexkit.test' : 'flexkit.io';\n}\n\n/** Origin that hosts plugin OAuth start and completion. */\nexport function getPlatformOrigin(): string {\n return `https://${getApiRootDomain()}`;\n}\n\n/** Public URL an external system calls to fire a webhook trigger. */\nexport function getWebhookTriggerUrl(projectId: string, token: string): string {\n return `https://${projectId}.api.${getApiRootDomain()}/automations/webhook/${encodeURIComponent(token)}`;\n}\n\nexport function createApiClient(projectId: string): ApiClient {\n const projectBasePath = `/api/flexkit/${projectId}`;\n const automationsBasePath = `${projectBasePath}/automations`;\n const skillsBasePath = `${projectBasePath}/skills`;\n const agentChatsBasePath = `${projectBasePath}/agent/chats`;\n\n async function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n ...init,\n });\n const data = (await response.json()) as T;\n\n if (!response.ok) {\n const error = data && typeof data === 'object' && 'error' in data ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n }\n\n return data;\n }\n\n return {\n connectPlugins: (input) => request(`${projectBasePath}/plugins/connect`, { method: 'POST', body: JSON.stringify(input) }),\n pluginOAuthStatus: (id) => request(`${projectBasePath}/plugins/oauth-transactions/${encodeURIComponent(id)}`),\n updatePluginConnection: (id, input) =>\n request(`${projectBasePath}/plugin-connections/${encodeURIComponent(id)}`, { method: 'PATCH', body: JSON.stringify(input) }),\n disconnectPlugin: (id) => request(`${projectBasePath}/plugin-connections/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n installPlugin: (id) => request(`${projectBasePath}/plugins/${encodeURIComponent(id)}/installation`, { method: 'PUT', body: JSON.stringify({}) }),\n setPluginPolicy: (id, input) => request(`${projectBasePath}/plugins/${encodeURIComponent(id)}/policy`, { method: 'PATCH', body: JSON.stringify(input) }),\n refreshPluginTools: (id) => request(`${projectBasePath}/plugin-connections/${encodeURIComponent(id)}/tools/refresh`, { method: 'POST' }),\n cancelRun: async (runId) =>\n request<MutationResult>(`${automationsBasePath}/runs/${encodeURIComponent(runId)}/cancel`, { method: 'POST' }),\n createAgentChat: async (input) =>\n request<{ chat: AgentChat }>(agentChatsBasePath, {\n body: JSON.stringify({ modelId: input?.modelId ?? null }),\n method: 'POST',\n }),\n deleteAgentChat: async (chatId) =>\n request<{ success: boolean }>(`${agentChatsBasePath}/${encodeURIComponent(chatId)}`, { method: 'DELETE' }),\n getAgentChatStreamUrl: (chatId, workflowRunId) =>\n `${agentChatsBasePath}/${encodeURIComponent(chatId)}/stream?workflowRunId=${encodeURIComponent(workflowRunId)}`,\n renameAgentChat: async (chatId, title) =>\n request<{ chat: AgentChat }>(`${agentChatsBasePath}/${encodeURIComponent(chatId)}`, {\n body: JSON.stringify({ title }),\n method: 'PATCH',\n }),\n sendAgentChatMessage: async (chatId, input) =>\n request<AgentChatTurn>(`${agentChatsBasePath}/${encodeURIComponent(chatId)}/messages`, {\n body: JSON.stringify(input),\n method: 'POST',\n }),\n stopAgentChat: async (chatId) =>\n request<{ message: AgentChatMessage }>(`${agentChatsBasePath}/${encodeURIComponent(chatId)}/stop`, {\n method: 'POST',\n }),\n transcribeAgentAudio: async (audio, signal) => {\n const { durationSeconds, pcm } = await convertRecordedAudioToPcm(audio);\n const formData = new FormData();\n formData.append('file', pcm, 'audio.pcm');\n formData.append('durationSeconds', String(durationSeconds));\n\n const response = await fetch(`${projectBasePath}/agent/transcribe`, {\n body: formData,\n credentials: 'include',\n method: 'POST',\n signal,\n });\n const data = (await response.json()) as { error?: string; text?: string };\n\n if (!response.ok) {\n const error = data && typeof data === 'object' && data.error ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n }\n\n if (!data.text?.trim()) {\n throw new Error('No speech was recognized. Try again.');\n }\n\n return { text: data.text };\n },\n uploadAgentChatAttachment: async (file, signal) => {\n // The platform issues a token scoped to one pathname, type and size; the\n // browser then writes the bytes to the store directly, so large files\n // never pass through the API function body limit.\n const tokenResponse = await fetch(`${projectBasePath}/agent/uploads`, {\n body: JSON.stringify({ filename: file.name, mediaType: file.type || null, sizeBytes: file.size }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal,\n });\n const tokenData = (await tokenResponse.json()) as {\n code?: string;\n error?: string;\n mediaType?: string;\n pathname?: string;\n token?: string;\n };\n\n if (!tokenResponse.ok || !tokenData.pathname || !tokenData.token || !tokenData.mediaType) {\n throw new AgentUploadError(\n tokenResponse.status,\n tokenData.error ? String(tokenData.error) : 'The file could not be uploaded.',\n tokenData.code ?? null\n );\n }\n\n const blob = await put(tokenData.pathname, file, {\n abortSignal: signal,\n access: 'public',\n contentType: tokenData.mediaType,\n token: tokenData.token,\n });\n\n return {\n filename: file.name,\n mediaType: tokenData.mediaType,\n sizeBytes: file.size,\n url: blob.url,\n };\n },\n decideApproval: async (approvalId, input) => {\n const response = await fetch(`${automationsBasePath}/approvals/${encodeURIComponent(approvalId)}/decide`, {\n body: JSON.stringify(input),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n });\n const data = (await response.json()) as MutationResult & { approval?: AutomationApproval; error?: string };\n\n // Business errors (stale_preview, already_decided) come back as 400\n // with a structured body the caller must be able to inspect.\n if (!response.ok && typeof data.success !== 'boolean') {\n throw new Error(data.error ? String(data.error) : 'Request failed');\n }\n\n return data;\n },\n createAutomation: async (input) =>\n request<MutationResult & { automation?: Automation }>(automationsBasePath, {\n body: JSON.stringify(input),\n method: 'POST',\n }),\n createSkill: async (input) =>\n request<MutationResult & { skill?: Skill }>(skillsBasePath, {\n body: JSON.stringify(input),\n method: 'POST',\n }),\n deleteAutomation: async (automationId) =>\n request<MutationResult>(`${automationsBasePath}/${encodeURIComponent(automationId)}`, { method: 'DELETE' }),\n deleteSkill: async (skillId) =>\n request<MutationResult>(`${skillsBasePath}/${encodeURIComponent(skillId)}`, { method: 'DELETE' }),\n getArtifactUrl: (artifactId, options) => {\n const suffix = options?.download ? '?download=1' : '';\n\n return `${automationsBasePath}/artifacts/${encodeURIComponent(artifactId)}/content${suffix}`;\n },\n getRunArtifacts: async (workflowRunId) =>\n request<{ artifacts: AutomationArtifact[] }>(\n `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/artifacts`\n ).then((response) => response.artifacts),\n getStreamUrl: (workflowRunId) => `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/stream`,\n getTranscriptUrl: (runId) => `${automationsBasePath}/runs/${encodeURIComponent(runId)}/transcript`,\n listChannels: async (provider, connectionId) => {\n const url = connectionId\n ? `${projectBasePath}/plugin-connections/${encodeURIComponent(connectionId)}/channels`\n : `${projectBasePath}/plugins/${provider}/channels`;\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n const data = (await response.json()) as {\n channels?: AutomationToolChannel[];\n error?: string;\n errorMessage?: string;\n success?: boolean;\n };\n\n if (response.ok) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage,\n success: data.success ?? true,\n };\n }\n\n if (data.success === false) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage ?? `Failed to load ${provider === 'slack' ? 'Slack' : 'Teams'} channels.`,\n success: false,\n };\n }\n\n const error = data.error ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n },\n runAutomation: async (automationId) =>\n request<MutationResult & { runId?: string }>(`${automationsBasePath}/${encodeURIComponent(automationId)}/runs`, {\n method: 'POST',\n }),\n updateAutomation: async (automationId, input) =>\n request<MutationResult & { automation?: Automation }>(\n `${automationsBasePath}/${encodeURIComponent(automationId)}`,\n {\n body: JSON.stringify(input),\n method: 'PATCH',\n }\n ),\n updateSkill: async (skillId, input) =>\n request<MutationResult & { skill?: Skill }>(`${skillsBasePath}/${encodeURIComponent(skillId)}`, {\n body: JSON.stringify(input),\n method: 'PATCH',\n }),\n };\n}\n\nexport class FetcherError extends Error {\n status: number;\n\n constructor(status: number, message = 'Request failed') {\n super(message);\n this.name = 'FetcherError';\n this.status = status;\n }\n}\n\nexport const fetcher = async <T>(url: string): Promise<T> => {\n const response = await fetch(url, { credentials: 'include' });\n\n if (!response.ok) {\n throw new FetcherError(response.status);\n }\n\n return (await response.json()) as T;\n};\n\nexport function paths(projectId: string): {\n agentChat: (_chatId: string) => string;\n agentChatSearch: (_query: string) => string;\n agentChats: (_offset?: number) => string;\n agentProfile: () => string;\n approval: (_approvalId: string) => string;\n approvals: (_options?: {\n limit?: number;\n offset?: number;\n runId?: string;\n status?: AutomationApprovalStatus;\n }) => string;\n approvalsCount: string;\n automation: (_automationId: string) => string;\n automationRuns: (_automationId: string, _offset?: number, _limit?: number) => string;\n automations: (_options?: {\n enabled?: boolean[];\n limit?: number;\n offset?: number;\n search?: string;\n visibility?: AutomationVisibility[];\n }) => string;\n creditBalance: string;\n entities: string;\n run: (_runId: string) => string;\n runHistory: (_scope: 'mine' | 'team', _offset?: number, _limit?: number) => string;\n skill: (_skillId: string) => string;\n skills: (_options?: { limit?: number; offset?: number; search?: string; visibility?: AutomationVisibility[] }) => string;\n spaces: string;\n tools: (_automationId?: string) => string;\n} {\n const basePath = `/api/flexkit/${projectId}/automations`;\n const skillsBasePath = `/api/flexkit/${projectId}/skills`;\n const agentChatsBasePath = `/api/flexkit/${projectId}/agent/chats`;\n\n return {\n agentChat: (chatId) => `${agentChatsBasePath}/${encodeURIComponent(chatId)}`,\n agentChatSearch: (query) => `${agentChatsBasePath}/search?q=${encodeURIComponent(query)}`,\n agentChats: (offset = 0) => `${agentChatsBasePath}?offset=${offset.toString()}`,\n agentProfile: () => `/api/flexkit/${projectId}/agent/profile`,\n approval: (approvalId) => `${basePath}/approvals/${encodeURIComponent(approvalId)}`,\n approvals: (options = {}) => {\n const { limit = 25, offset = 0, runId, status } = options;\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: offset.toString(),\n });\n\n if (status) {\n params.set('status', status);\n }\n\n if (runId) {\n params.set('runId', runId);\n }\n\n return `${basePath}/approvals?${params.toString()}`;\n },\n approvalsCount: `${basePath}/approvals?limit=1`,\n automation: (automationId) => `${basePath}/${encodeURIComponent(automationId)}`,\n automationRuns: (automationId, offset = 0, limit = 25) =>\n `${basePath}/${encodeURIComponent(automationId)}/runs?offset=${offset.toString()}&limit=${limit.toString()}`,\n automations: (options = {}) => {\n const { enabled, limit = 25, offset = 0, search, visibility } = options;\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: offset.toString(),\n });\n\n if (enabled && enabled.length > 0) {\n params.set('enabled', enabled.map((value) => (value ? 'true' : 'false')).join(','));\n }\n\n if (visibility && visibility.length > 0) {\n params.set('visibility', visibility.join(','));\n }\n\n const trimmedSearch = search?.trim();\n\n if (trimmedSearch) {\n params.set('q', trimmedSearch);\n }\n\n return `${basePath}?${params.toString()}`;\n },\n creditBalance: `${basePath}/credits`,\n entities: `${basePath}/entities`,\n run: (runId) => `${basePath}/runs/${encodeURIComponent(runId)}`,\n runHistory: (scope, offset = 0, limit = 25) =>\n `${basePath}/runs?scope=${scope}&offset=${offset.toString()}&limit=${limit.toString()}`,\n skill: (skillId) => `${skillsBasePath}/${encodeURIComponent(skillId)}`,\n skills: (options = {}) => {\n const { limit = 25, offset = 0, search, visibility } = options;\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: offset.toString(),\n });\n\n if (visibility && visibility.length > 0) {\n params.set('visibility', visibility.join(','));\n }\n\n const trimmedSearch = search?.trim();\n\n if (trimmedSearch) {\n params.set('q', trimmedSearch);\n }\n\n return `${skillsBasePath}?${params.toString()}`;\n },\n spaces: `/api/flexkit/${projectId}/spaces`,\n tools: (automationId) =>\n automationId ? `${basePath}/${encodeURIComponent(automationId)}/tools` : `${basePath}/tools`,\n };\n}\n"]}