{"context":{"domain":"natura-br"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"65a86528721f5a092783289d","name":"Natura Brasil CB","domain":"natura-br","visibility":"private","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-08-19T20:06:13.815Z","createdAt":"2024-01-17T23:39:20.806Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a8ed018383002de23ef5f3a","component":"data2-core-types@Component","system":"65a86528721f5a092783289d","params":{"extends":"data2-core-primitives@Block","component":"kUraBiz","package":"natura-br","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    :host,.wrap{height:100%}\n    *{box-sizing:border-box}\n    .wrap{height:100%;overflow:auto;background:#f5f6f8;color:#1a1d24;\n      font:13px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}\n    .top{display:flex;align-items:center;gap:14px;padding:18px 26px;background:#fff;border-bottom:1px solid #e8eaee;\n      position:sticky;top:0;z-index:5;flex-wrap:wrap}\n    .top h1{font-size:17px;font-weight:650;margin:0;letter-spacing:-.01em}\n    .top .sub{color:#8a909b;font-size:12px}\n    .cresce{flex:1}\n    .seg{display:inline-flex;border:1px solid #e2e5ea;border-radius:8px;overflow:hidden;background:#fff}\n    .seg button{border:0;background:#fff;color:#5b616e;padding:6px 12px;font:inherit;font-size:12px;cursor:pointer}\n    .seg button.on{background:#2b6cff;color:#fff}\n    input{border:1px solid #e2e5ea;border-radius:8px;padding:7px 10px;font:inherit;font-size:12.5px;background:#fff;color:#1a1d24}\n    button.gh{border:1px solid #e2e5ea;background:#fff;color:#3b4150;border-radius:8px;padding:7px 12px;font:inherit;\n      font-size:12.5px;cursor:pointer}\n    button.gh:hover{background:#f0f2f5}\n    .body{padding:22px 26px;display:flex;flex-direction:column;gap:20px;max-width:1500px;margin:0 auto}\n    .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}\n    .card{background:#fff;border:1px solid #e8eaee;border-radius:14px;padding:16px 18px;box-shadow:0 1px 2px rgba(20,25,40,.03)}\n    .kpi .v{font-size:26px;font-weight:680;letter-spacing:-.02em}\n    .kpi .l{font-size:11.5px;color:#8a909b;margin-top:3px}\n    .kpi .d{font-size:11px;margin-top:6px}\n    .up{color:#16a34a}.down{color:#dc2626}\n    .grid2{display:grid;grid-template-columns:2fr 1fr;gap:18px}\n    .grid2b{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n    @media(max-width:1000px){.grid2,.grid2b{grid-template-columns:1fr}}\n    h2{font-size:13px;font-weight:640;margin:0 0 14px;color:#3b4150}\n    .bar-row{display:flex;align-items:center;gap:10px;margin-bottom:9px;font-size:12px}\n    .bar-row .lab{width:150px;color:#4b515e;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}\n    .bar-row .track{flex:1;height:16px;background:#f0f2f5;border-radius:5px;overflow:hidden}\n    .bar-row .fill{height:100%;background:#2b6cff;border-radius:5px}\n    .bar-row .val{width:52px;text-align:right;color:#6b7280;font-variant-numeric:tabular-nums;flex-shrink:0}\n    .colbars{display:flex;align-items:flex-end;gap:5px;height:150px;padding-top:8px}\n    .colbars .col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:5px;min-width:0}\n    .colbars .cb{width:70%;max-width:26px;background:#2b6cff;border-radius:4px 4px 0 0;min-height:2px;transition:height .2s}\n    .colbars .cd{font-size:9.5px;color:#9aa0ab;white-space:nowrap;transform:rotate(-45deg);transform-origin:top;height:26px}\n    .tbl{width:100%;border-collapse:collapse;font-size:12.5px}\n    .tbl th{text-align:left;color:#8a909b;font-weight:550;font-size:11px;text-transform:uppercase;letter-spacing:.04em;\n      padding:8px 10px;border-bottom:1px solid #eceef2}\n    .tbl td{padding:10px;border-bottom:1px solid #f1f3f6;vertical-align:middle}\n    .tbl tr.click{cursor:pointer}\n    .tbl tr.click:hover td{background:#f7f9fc}\n    .pill{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:550}\n    .pill.g{background:#e7f6ec;color:#16833c}.pill.b{background:#fdeaea;color:#c62b2b}\n    .pill.a{background:#fdf3e3;color:#b3730c}.pill.i{background:#e9f0fe;color:#2357c7}.pill.n{background:#eef0f3;color:#6b7280}\n    .mono{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:#8a909b}\n    .drawer{position:fixed;top:0;right:0;bottom:0;width:min(560px,94vw);background:#fff;border-left:1px solid #e2e5ea;\n      box-shadow:-8px 0 30px rgba(20,25,40,.12);z-index:20;display:flex;flex-direction:column}\n    .drawer .dh{padding:16px 20px;border-bottom:1px solid #eceef2;display:flex;align-items:center;gap:10px}\n    .drawer .dc{flex:1;overflow:auto;padding:18px 20px}\n    .x{margin-left:auto;cursor:pointer;color:#8a909b;font-size:20px;line-height:1;border:0;background:0}\n    .metg{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px;margin-bottom:16px}\n    .metg .m{background:#f7f9fc;border:1px solid #eceef2;border-radius:9px;padding:9px 11px}\n    .metg .m .mv{font-size:16px;font-weight:640}.metg .m .ml{font-size:10px;color:#8a909b;margin-top:1px}\n    .conv{display:flex;flex-direction:column;gap:7px;margin-bottom:8px}\n    .bub{max-width:85%;padding:8px 11px;border-radius:11px;font-size:12.5px;white-space:pre-wrap;word-break:break-word}\n    .bub.u{align-self:flex-end;background:#eaf1ff;border:1px solid #d6e2ff}\n    .bub.a{align-self:flex-start;background:#f4f5f7;border:1px solid #e8eaee}\n    .bub .q{font-size:9.5px;text-transform:uppercase;letter-spacing:.06em;color:#9aa0ab;margin-bottom:3px}\n    .tl{align-self:center;font-size:10.5px;color:#7c5fd0;background:#f2effc;border:1px solid #e2d9fa;padding:2px 9px;border-radius:999px}\n    .svc{display:flex;align-items:center;gap:9px;padding:7px 10px;border:1px solid #eceef2;border-radius:8px;margin-bottom:6px}\n    .svc .o{width:20px;height:20px;border-radius:50%;background:#eef0f3;display:flex;align-items:center;justify-content:center;\n      font-size:10px;color:#6b7280;flex-shrink:0}\n    .svc .lat{margin-left:auto;color:#9aa0ab;font-size:11px}\n    .grav{border:1px solid #e8eaee;border-radius:10px;padding:14px;background:#f7f9fc}\n    .grav audio{width:100%;margin-top:10px}\n    .btn{background:#2b6cff;color:#fff;border:0;border-radius:8px;padding:8px 14px;font:inherit;font-size:12.5px;cursor:pointer}\n    .btn:disabled{opacity:.5;cursor:default}\n    .h2sub{font-weight:400;color:#9aa0ab;font-size:11px}\n    .vazio{color:#9aa0ab;padding:30px;text-align:center}\n    .portao{display:flex;align-items:center;justify-content:center;height:100%}\n    .caixa{width:340px;background:#fff;border:1px solid #e8eaee;border-radius:16px;padding:30px;box-shadow:0 8px 30px rgba(20,25,40,.08)}\n    .caixa h1{font-size:17px;margin:0 0 5px}.caixa .sub{color:#8a909b;font-size:12.5px;margin-bottom:18px}\n    .caixa input{width:100%}.caixa .btn{width:100%;margin-top:12px}\n    .err{color:#c62b2b;font-size:12px;margin-top:10px}\n  `,\n\n  mounted(d2) {\n    d2.setState({\n      fase: 'gate', erro: null,\n      chamadas: [], servicos: [], carregando: false,\n      periodo: 30, busca: '',\n      sel: null, det: null, carregandoDet: false,\n      audioUrl: null, audioMsg: null, buscandoAudio: false,\n      senha: (function(){try{return localStorage.getItem('ura-biz-senha')||''}catch(e){return''}})()\n    })\n    const refBiz = d2.param('rushBiz', 'poc-ura-biz')\n    const refDet = d2.param('rushDetalhe', 'poc-ura-monitor')\n    const refAudio = d2.param('rushAudio', 'poc-ura-audio')\n    const senhaFixa = d2.param('senhaParam', '')\n    const senhaDe = () => senhaFixa || d2.state.senha || ''\n    const com = (o) => Object.assign({ senha: senhaDe() }, o || {})\n\n    const carregar = async () => {\n      if (!senhaDe()) return\n      d2.setState({ carregando: true, erro: null })\n      try {\n        const r = await d2.rush(refBiz).invoke(com({}))\n        const out = (r && r.data) ? r.data : r\n        if (out && out.erro === 'acesso negado') { d2.setState({ fase: 'gate', erro: 'senha incorreta', carregando: false }); return }\n        d2.setState({ fase: 'painel', chamadas: out.chamadas || [], servicos: out.servicos || [], carregando: false })\n      } catch (e) { d2.setState({ erro: String((e && e.message) || e), carregando: false }) }\n    }\n\n    const abrir = async (callId, cid) => {\n      d2.setState({ sel: callId, det: null, carregandoDet: true, audioUrl: null, audioMsg: null })\n      try {\n        const r = await d2.rush(refDet).invoke(com({ modo: 'detalhe', call_id: callId }))\n        const out = (r && r.data) ? r.data : r\n        d2.setState({ det: (out && out.detalhe) || null, carregandoDet: false })\n      } catch (e) { d2.setState({ carregandoDet: false, det: null }) }\n    }\n\n    const ouvir = async () => {\n      const cid = d2.state.sel\n      if (!cid) { d2.setState({ audioMsg: 'nenhuma chamada selecionada' }); return }\n      d2.setState({ buscandoAudio: true, audioMsg: null })\n      try {\n        const r = await d2.rush(refAudio).invoke(com({ call_id: cid }))\n        const out = (r && r.data) ? r.data : r\n        if (out && out.ok && out.audio_url) d2.setState({ audioUrl: out.audio_url, buscandoAudio: false })\n        else d2.setState({ audioMsg: (out && out.motivo) || 'gravação indisponível', buscandoAudio: false })\n      } catch (e) { d2.setState({ audioMsg: 'erro ao buscar gravação', buscandoAudio: false }) }\n    }\n\n    d2.on(d2.root, 'click', (e) => {\n      const a = e.target; if (!a || !a.closest) return\n      const ent = a.closest('[data-entrar]')\n      if (ent) { const c = d2.$('#senha'); const v = (c && c.value || '').trim()\n        try { localStorage.setItem('ura-biz-senha', v) } catch (er) {}\n        d2.setState({ senha: v }); carregar(); return }\n      const rf = a.closest('[data-refresh]'); if (rf) { carregar(); return }\n      const pr = a.closest('[data-periodo]'); if (pr) { d2.setState({ periodo: Number(pr.dataset.periodo) }); return }\n      const ln = a.closest('[data-call]'); if (ln) { abrir(ln.dataset.call, ln.dataset.cid); return }\n      const fc = a.closest('[data-fechar]'); if (fc) { d2.setState({ sel: null, det: null }); return }\n      const au = a.closest('[data-ouvir]'); if (au) { ouvir(); return }\n    })\n    d2.on(d2.root, 'input', (e) => { const el = e.target; if (el && el.dataset && el.dataset.campo === 'busca') d2.setState({ busca: el.value }) })\n\n    if (senhaDe()) { d2.setState({ fase: 'painel' }); carregar() }\n  },\n\n  render(d2) {\n    const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"]/g, c => ({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;' }[c]))\n    if (d2.state.fase === 'gate') {\n      return `<div class=\"portao\"><div class=\"caixa\">\n        <h1>Painel da URA de Voz</h1>\n        <div class=\"sub\">indicadores de atendimento · acesso restrito</div>\n        <input type=\"password\" id=\"senha\" placeholder=\"senha de acesso\" autocomplete=\"current-password\">\n        <button class=\"btn\" data-entrar=\"1\">entrar</button>\n        ${d2.state.erro ? `<div class=\"err\">${esc(d2.state.erro)}</div>` : ''}\n      </div></div>`\n    }\n\n    const dur = (s) => { s = Math.round(Number(s)||0); const m = Math.floor(s/60), r = s%60; return m ? `${m}m${String(r).padStart(2,'0')}` : `${r}s` }\n    const agora = Date.now()\n    const janela = d2.state.periodo > 0 ? d2.state.periodo * 86400000 : Infinity\n    const dentro = (t) => { const x = new Date(t).getTime(); return isFinite(janela) ? (agora - x) <= janela : true }\n    const q = (d2.state.busca||'').trim().toLowerCase()\n    const chamadas = (d2.state.chamadas||[]).filter(c => dentro(c.timestamp)).filter(c => !q ||\n      String(c.call_id||'').toLowerCase().includes(q) || String(c.consultant_id||'').toLowerCase().includes(q) || String(c.caller_number||'').toLowerCase().includes(q))\n    const callIds = new Set(chamadas.map(c => c.call_id))\n    const servicos = (d2.state.servicos||[]).filter(s => callIds.has(s.call_id))\n\n    const n = chamadas.length\n    const soma = (arr, f) => arr.reduce((a,c)=>a+(Number(f(c))||0),0)\n    const retidas = chamadas.filter(c => /retid/i.test(String(c.outcome||'')) || /total/i.test(String(c.retention||''))).length\n    const transf = chamadas.filter(c => c.transferred_intent || c.transferred_done).length\n    const comCsat = chamadas.filter(c => c.csat_score != null)\n    const csatMed = comCsat.length ? (soma(comCsat, c=>c.csat_score)/comCsat.length) : null\n    const durMed = n ? soma(chamadas, c=>c.duration_s)/n : 0\n    const erros = servicos.filter(s => s.erro).length\n    const consultores = new Set(chamadas.map(c=>c.consultant_id).filter(Boolean)).size\n\n    const kpi = (v,l,extra) => `<div class=\"card kpi\"><div class=\"v\">${v}</div><div class=\"l\">${esc(l)}</div>${extra?`<div class=\"d\">${extra}</div>`:''}</div>`\n\n    // chamadas por dia (últimos min(periodo,21) dias)\n    const dias = Math.min(d2.state.periodo>0?d2.state.periodo:21, 21)\n    const porDia = []\n    for (let i = dias-1; i >= 0; i--) {\n      const d = new Date(agora - i*86400000); const key = d.toISOString().slice(0,10)\n      porDia.push({ key, lab: d.toLocaleDateString('pt-BR',{day:'2-digit',month:'2-digit'}),\n        n: chamadas.filter(c => String(c.timestamp||'').slice(0,10) === key).length })\n    }\n    const maxDia = Math.max(1, ...porDia.map(d=>d.n))\n    const colDia = `<div class=\"colbars\">${porDia.map(d=>`<div class=\"col\" title=\"${d.lab}: ${d.n}\">\n      <div class=\"cb\" style=\"height:${Math.round(d.n/maxDia*120)}px\"></div><div class=\"cd\">${d.lab}</div></div>`).join('')}</div>`\n\n    // barras genéricas\n    const barras = (rows, cor) => { const mx = Math.max(1, ...rows.map(r=>r.v)); return rows.length ? rows.map(r=>`\n      <div class=\"bar-row\"><div class=\"lab\" title=\"${esc(r.k)}\">${esc(r.k)}</div>\n        <div class=\"track\"><div class=\"fill\" style=\"width:${Math.round(r.v/mx*100)}%;${cor?`background:${cor}`:''}\"></div></div>\n        <div class=\"val\">${r.v}</div></div>`).join('') : `<div class=\"vazio\">sem dados</div>` }\n\n    const grp = (arr, f) => { const m = {}; arr.forEach(x=>{ const k=f(x)||'—'; m[k]=(m[k]||0)+1 }); \n      return Object.entries(m).map(([k,v])=>({k,v})).sort((a,b)=>b.v-a.v) }\n\n    const porUsecase = grp(servicos, s=>s.usecase).slice(0,10)\n    const porOutcome = grp(chamadas, c=>c.outcome).slice(0,8)\n    const porConsultor = grp(chamadas.filter(c=>c.consultant_id), c=>c.consultant_id).slice(0,8)\n\n    const outPill = (o) => { const k = /retid/i.test(o)?'g':/transfer/i.test(o)?'i':/aband|erro|falha/i.test(o)?'b':/devolv/i.test(o)?'a':'n'\n      return `<span class=\"pill ${k}\">${esc(o||'—')}</span>` }\n\n    const linhas = chamadas.slice(0,120).map(c => `\n      <tr class=\"click\" data-call=\"${esc(c.call_id)}\" data-cid=\"${esc(c.conversation_id||'')}\">\n        <td class=\"mono\">${esc(new Date(c.timestamp).toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',hour:'2-digit',minute:'2-digit'}))}</td>\n        <td>${esc(c.consultant_id||'—')}<div class=\"mono\">${esc(c.caller_number||'')}</div></td>\n        <td>${outPill(c.outcome)}${c.transferred_done?' <span class=\"pill i\">transf✓</span>':(c.transferred_intent?' <span class=\"pill a\">transf?</span>':'')}</td>\n        <td style=\"text-align:right\">${dur(c.duration_s)}</td>\n        <td style=\"text-align:right\">${c.usecases_count||0}</td>\n        <td style=\"text-align:right\">${c.csat_score!=null?esc(c.csat_score):'—'}</td>\n      </tr>`).join('')\n\n    const seg = (v,l) => `<button class=\"${d2.state.periodo===v?'on':''}\" data-periodo=\"${v}\">${l}</button>`\n\n    return `<div class=\"wrap\">\n      <div class=\"top\">\n        <h1>Painel da URA de Voz</h1>\n        <span class=\"sub\">${n} chamadas${d2.state.carregando?' · atualizando…':''}</span>\n        <span class=\"cresce\"></span>\n        <input data-campo=\"busca\" value=\"${esc(d2.state.busca)}\" placeholder=\"🔎 consultora / número / call_id\" style=\"width:210px\">\n        <div class=\"seg\">${seg(7,'7d')}${seg(30,'30d')}${seg(90,'90d')}${seg(0,'tudo')}</div>\n        <button class=\"gh\" data-refresh=\"1\">↻ atualizar</button>\n      </div>\n      <div class=\"body\">\n        <div class=\"kpis\">\n          ${kpi(n,'Chamadas')}\n          ${kpi(dur(durMed),'Duração média')}\n          ${kpi(n?Math.round(retidas/n*100)+'%':'—','Retenção')}\n          ${kpi(n?Math.round(transf/n*100)+'%':'—','Pediram atendente')}\n          ${kpi(servicos.length,'Serviços consumidos')}\n          ${kpi(servicos.length?Math.round(erros/servicos.length*100)+'%':'—','Erros em serviços')}\n          ${kpi(consultores,'Consultoras únicas')}\n          ${kpi(csatMed!=null?csatMed.toFixed(1):'—','CSAT médio')}\n        </div>\n        <div class=\"grid2\">\n          <div class=\"card\"><h2>Chamadas por dia</h2>${colDia}</div>\n          <div class=\"card\"><h2>Desfecho</h2>${barras(porOutcome.map(r=>({k:r.k,v:r.v})),'#16a34a')}</div>\n        </div>\n        <div class=\"grid2b\">\n          <div class=\"card\"><h2>Serviços mais consumidos <span class=\"h2sub\">(use cases)</span></h2>${barras(porUsecase,'#2b6cff')}</div>\n          <div class=\"card\"><h2>Chamadas por consultora</h2>${barras(porConsultor,'#7c5fd0')}</div>\n        </div>\n        <div class=\"card\">\n          <h2>Chamadas <span class=\"h2sub\">— clique para abrir a transcrição, serviços e gravação</span></h2>\n          <table class=\"tbl\"><thead><tr><th>Quando</th><th>Consultora</th><th>Desfecho</th>\n            <th style=\"text-align:right\">Duração</th><th style=\"text-align:right\">Serviços</th><th style=\"text-align:right\">CSAT</th></tr></thead>\n            <tbody>${linhas || `<tr><td colspan=\"6\" class=\"vazio\">nenhuma chamada no período</td></tr>`}</tbody></table>\n        </div>\n      </div>\n      ${d2.state.sel ? this.renderDrawer(d2, esc, dur, outPill) : ''}\n    </div>`\n  },\n\n  renderDrawer(d2, esc, dur, outPill) {\n    const inner = () => {\n      if (d2.state.carregandoDet) return `<div class=\"vazio\">carregando…</div>`\n      const det = d2.state.det; if (!det) return `<div class=\"vazio\">não foi possível carregar o detalhe.</div>`\n      const c = det.chamada || {}; const tr = Array.isArray(det.transcript)?det.transcript:[]; const sv = Array.isArray(det.servicos)?det.servicos:[]\n      const m = (v,l) => `<div class=\"m\"><div class=\"mv\">${v==null||v===''?'—':esc(v)}</div><div class=\"ml\">${esc(l)}</div></div>`\n      const acao = (t) => { try { if (t.tool_calls&&t.tool_calls[0]) { const raw=t.tool_calls[0].params_as_json||(t.tool_calls[0].tool_details&&t.tool_calls[0].tool_details.body); const p=typeof raw==='string'?JSON.parse(raw):raw; return (p&&(p.action||p.name))||null } } catch(e){} return null }\n      const conv = tr.length ? tr.map(t => { const role=t.role||t.source||''; const msg=t.message||t.text||''; const a=acao(t)\n        if (a&&!msg) return `<div class=\"tl\">⚙ ${esc(a)}</div>`; if (!msg&&!a) return ''\n        const u=/user|caller|cliente|consultora/i.test(role)\n        return `<div class=\"bub ${u?'u':'a'}\"><div class=\"q\">${u?'consultora':'assistente'}${a?' · '+esc(a):''}</div>${esc(msg)}</div>` }).join('') : `<div class=\"vazio\">sem transcrição.</div>`\n      const svc = sv.length ? sv.map((s,i)=>`<div class=\"svc\"><div class=\"o\">${esc(s.ordem!=null?s.ordem+1:i+1)}</div>\n        <div><b>${esc(s.usecase||'—')}</b></div>${s.erro?' <span class=\"pill b\">erro</span>':''}\n        <div class=\"lat\">${s.latencia_s!=null?esc(Math.round(s.latencia_s*10)/10)+'s':''}</div></div>`).join('') : `<div class=\"vazio\">nenhum serviço.</div>`\n      const grav = d2.state.audioUrl\n        ? `<div class=\"grav\">Gravação da ligação<audio controls autoplay src=\"${esc(d2.state.audioUrl)}\"></audio></div>`\n        : `<div class=\"grav\"><div>Gravação — <span class=\"mono\">${esc(c.conversation_id||'sem id')}</span></div>\n            <button class=\"btn\" data-ouvir=\"1\" ${d2.state.buscandoAudio?'disabled':''} style=\"margin-top:10px\">\n              ${d2.state.buscandoAudio?'buscando…':'▶ ouvir gravação'}</button>\n            ${d2.state.audioMsg?`<div class=\"err\">${esc(d2.state.audioMsg)}</div>`:''}</div>`\n      return `<div class=\"metg\">\n          ${m(dur(c.duration_s),'duração')}${m(c.csat_score,'CSAT')}${m(c.retention,'retenção')}\n          ${m((c.user_turns||0)+'/'+(c.agent_turns||0),'turnos')}${m(c.usecases_count,'serviços')}\n          ${m(c.tool_errors,'erros')}${m(c.ai_tokens,'tokens')}\n          ${m(c.transferred_done?'sim':(c.transferred_intent?'tentou':'não'),'transferência')}</div>\n        ${tr.length ? `<h2>Transcrição</h2><div class=\"conv\">${conv}</div>` : ''}\n        <h2>Serviços consumidos</h2>${svc}\n        <h2>Gravação</h2>${grav}`\n    }\n    const c = (d2.state.det && d2.state.det.chamada) || {}\n    return `<div class=\"drawer\">\n      <div class=\"dh\">${outPill(c.outcome)}<span class=\"mono\">${esc(String(d2.state.sel||'').slice(0,24))}</span>\n        <button class=\"x\" data-fechar=\"1\">×</button></div>\n      <div class=\"dc\">${inner()}</div>\n    </div>`\n  }\n}"}},"rushBiz":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rushBiz"}}}},"rushDetalhe":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rushDetalhe"}}}},"rushAudio":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rushAudio"}}}},"senhaParam":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"senhaParam"}}}}}}}},"__d2PrevCode":{"code":"export default {\n  css: `\n    :host,.wrap{height:100%}\n    *{box-sizing:border-box}\n    .wrap{height:100%;overflow:auto;background:#f5f6f8;color:#1a1d24;\n      font:13px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}\n    .top{display:flex;align-items:center;gap:14px;padding:18px 26px;background:#fff;border-bottom:1px solid #e8eaee;\n      position:sticky;top:0;z-index:5;flex-wrap:wrap}\n    .top h1{font-size:17px;font-weight:650;margin:0;letter-spacing:-.01em}\n    .top .sub{color:#8a909b;font-size:12px}\n    .cresce{flex:1}\n    .seg{display:inline-flex;border:1px solid #e2e5ea;border-radius:8px;overflow:hidden;background:#fff}\n    .seg button{border:0;background:#fff;color:#5b616e;padding:6px 12px;font:inherit;font-size:12px;cursor:pointer}\n    .seg button.on{background:#2b6cff;color:#fff}\n    input{border:1px solid #e2e5ea;border-radius:8px;padding:7px 10px;font:inherit;font-size:12.5px;background:#fff;color:#1a1d24}\n    button.gh{border:1px solid #e2e5ea;background:#fff;color:#3b4150;border-radius:8px;padding:7px 12px;font:inherit;\n      font-size:12.5px;cursor:pointer}\n    button.gh:hover{background:#f0f2f5}\n    .body{padding:22px 26px;display:flex;flex-direction:column;gap:20px;max-width:1500px;margin:0 auto}\n    .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}\n    .card{background:#fff;border:1px solid #e8eaee;border-radius:14px;padding:16px 18px;box-shadow:0 1px 2px rgba(20,25,40,.03)}\n    .kpi .v{font-size:26px;font-weight:680;letter-spacing:-.02em}\n    .kpi .l{font-size:11.5px;color:#8a909b;margin-top:3px}\n    .kpi .d{font-size:11px;margin-top:6px}\n    .up{color:#16a34a}.down{color:#dc2626}\n    .grid2{display:grid;grid-template-columns:2fr 1fr;gap:18px}\n    .grid2b{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n    @media(max-width:1000px){.grid2,.grid2b{grid-template-columns:1fr}}\n    h2{font-size:13px;font-weight:640;margin:0 0 14px;color:#3b4150}\n    .bar-row{display:flex;align-items:center;gap:10px;margin-bottom:9px;font-size:12px}\n    .bar-row .lab{width:150px;color:#4b515e;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}\n    .bar-row .track{flex:1;height:16px;background:#f0f2f5;border-radius:5px;overflow:hidden}\n    .bar-row .fill{height:100%;background:#2b6cff;border-radius:5px}\n    .bar-row .val{width:52px;text-align:right;color:#6b7280;font-variant-numeric:tabular-nums;flex-shrink:0}\n    .colbars{display:flex;align-items:flex-end;gap:5px;height:150px;padding-top:8px}\n    .colbars .col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:5px;min-width:0}\n    .colbars .cb{width:70%;max-width:26px;background:#2b6cff;border-radius:4px 4px 0 0;min-height:2px;transition:height .2s}\n    .colbars .cd{font-size:9.5px;color:#9aa0ab;white-space:nowrap;transform:rotate(-45deg);transform-origin:top;height:26px}\n    .tbl{width:100%;border-collapse:collapse;font-size:12.5px}\n    .tbl th{text-align:left;color:#8a909b;font-weight:550;font-size:11px;text-transform:uppercase;letter-spacing:.04em;\n      padding:8px 10px;border-bottom:1px solid #eceef2}\n    .tbl td{padding:10px;border-bottom:1px solid #f1f3f6;vertical-align:middle}\n    .tbl tr.click{cursor:pointer}\n    .tbl tr.click:hover td{background:#f7f9fc}\n    .pill{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:550}\n    .pill.g{background:#e7f6ec;color:#16833c}.pill.b{background:#fdeaea;color:#c62b2b}\n    .pill.a{background:#fdf3e3;color:#b3730c}.pill.i{background:#e9f0fe;color:#2357c7}.pill.n{background:#eef0f3;color:#6b7280}\n    .mono{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:#8a909b}\n    .drawer{position:fixed;top:0;right:0;bottom:0;width:min(560px,94vw);background:#fff;border-left:1px solid #e2e5ea;\n      box-shadow:-8px 0 30px rgba(20,25,40,.12);z-index:20;display:flex;flex-direction:column}\n    .drawer .dh{padding:16px 20px;border-bottom:1px solid #eceef2;display:flex;align-items:center;gap:10px}\n    .drawer .dc{flex:1;overflow:auto;padding:18px 20px}\n    .x{margin-left:auto;cursor:pointer;color:#8a909b;font-size:20px;line-height:1;border:0;background:0}\n    .metg{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px;margin-bottom:16px}\n    .metg .m{background:#f7f9fc;border:1px solid #eceef2;border-radius:9px;padding:9px 11px}\n    .metg .m .mv{font-size:16px;font-weight:640}.metg .m .ml{font-size:10px;color:#8a909b;margin-top:1px}\n    .conv{display:flex;flex-direction:column;gap:7px;margin-bottom:8px}\n    .bub{max-width:85%;padding:8px 11px;border-radius:11px;font-size:12.5px;white-space:pre-wrap;word-break:break-word}\n    .bub.u{align-self:flex-end;background:#eaf1ff;border:1px solid #d6e2ff}\n    .bub.a{align-self:flex-start;background:#f4f5f7;border:1px solid #e8eaee}\n    .bub .q{font-size:9.5px;text-transform:uppercase;letter-spacing:.06em;color:#9aa0ab;margin-bottom:3px}\n    .tl{align-self:center;font-size:10.5px;color:#7c5fd0;background:#f2effc;border:1px solid #e2d9fa;padding:2px 9px;border-radius:999px}\n    .svc{display:flex;align-items:center;gap:9px;padding:7px 10px;border:1px solid #eceef2;border-radius:8px;margin-bottom:6px}\n    .svc .o{width:20px;height:20px;border-radius:50%;background:#eef0f3;display:flex;align-items:center;justify-content:center;\n      font-size:10px;color:#6b7280;flex-shrink:0}\n    .svc .lat{margin-left:auto;color:#9aa0ab;font-size:11px}\n    .grav{border:1px solid #e8eaee;border-radius:10px;padding:14px;background:#f7f9fc}\n    .grav audio{width:100%;margin-top:10px}\n    .btn{background:#2b6cff;color:#fff;border:0;border-radius:8px;padding:8px 14px;font:inherit;font-size:12.5px;cursor:pointer}\n    .btn:disabled{opacity:.5;cursor:default}\n    .h2sub{font-weight:400;color:#9aa0ab;font-size:11px}\n    .vazio{color:#9aa0ab;padding:30px;text-align:center}\n    .portao{display:flex;align-items:center;justify-content:center;height:100%}\n    .caixa{width:340px;background:#fff;border:1px solid #e8eaee;border-radius:16px;padding:30px;box-shadow:0 8px 30px rgba(20,25,40,.08)}\n    .caixa h1{font-size:17px;margin:0 0 5px}.caixa .sub{color:#8a909b;font-size:12.5px;margin-bottom:18px}\n    .caixa input{width:100%}.caixa .btn{width:100%;margin-top:12px}\n    .err{color:#c62b2b;font-size:12px;margin-top:10px}\n  `,\n\n  mounted(d2) {\n    d2.setState({\n      fase: 'gate', erro: null,\n      chamadas: [], servicos: [], carregando: false,\n      periodo: 30, busca: '',\n      sel: null, det: null, carregandoDet: false,\n      audioUrl: null, audioMsg: null, buscandoAudio: false,\n      senha: (function(){try{return localStorage.getItem('ura-biz-senha')||''}catch(e){return''}})()\n    })\n    const refBiz = d2.param('rushBiz', 'poc-ura-biz')\n    const refDet = d2.param('rushDetalhe', 'poc-ura-monitor')\n    const refAudio = d2.param('rushAudio', 'poc-ura-audio')\n    const senhaFixa = d2.param('senhaParam', '')\n    const senhaDe = () => senhaFixa || d2.state.senha || ''\n    const com = (o) => Object.assign({ senha: senhaDe() }, o || {})\n\n    const carregar = async () => {\n      if (!senhaDe()) return\n      d2.setState({ carregando: true, erro: null })\n      try {\n        const r = await d2.rush(refBiz).invoke(com({}))\n        const out = (r && r.data) ? r.data : r\n        if (out && out.erro === 'acesso negado') { d2.setState({ fase: 'gate', erro: 'senha incorreta', carregando: false }); return }\n        d2.setState({ fase: 'painel', chamadas: out.chamadas || [], servicos: out.servicos || [], carregando: false })\n      } catch (e) { d2.setState({ erro: String((e && e.message) || e), carregando: false }) }\n    }\n\n    const abrir = async (callId, cid) => {\n      d2.setState({ sel: callId, det: null, carregandoDet: true, audioUrl: null, audioMsg: null })\n      try {\n        const r = await d2.rush(refDet).invoke(com({ modo: 'detalhe', call_id: callId }))\n        const out = (r && r.data) ? r.data : r\n        d2.setState({ det: (out && out.detalhe) || null, carregandoDet: false })\n      } catch (e) { d2.setState({ carregandoDet: false, det: null }) }\n    }\n\n    const ouvir = async () => {\n      const cid = d2.state.det && d2.state.det.chamada && d2.state.det.chamada.conversation_id\n      if (!cid) { d2.setState({ audioMsg: 'sem conversation_id nesta chamada' }); return }\n      d2.setState({ buscandoAudio: true, audioMsg: null })\n      try {\n        const r = await d2.rush(refAudio).invoke(com({ conversation_id: cid }))\n        const out = (r && r.data) ? r.data : r\n        if (out && out.ok && out.audio_url) d2.setState({ audioUrl: out.audio_url, buscandoAudio: false })\n        else d2.setState({ audioMsg: (out && out.motivo) || 'gravação indisponível', buscandoAudio: false })\n      } catch (e) { d2.setState({ audioMsg: 'erro ao buscar gravação', buscandoAudio: false }) }\n    }\n\n    d2.on(d2.root, 'click', (e) => {\n      const a = e.target; if (!a || !a.closest) return\n      const ent = a.closest('[data-entrar]')\n      if (ent) { const c = d2.$('#senha'); const v = (c && c.value || '').trim()\n        try { localStorage.setItem('ura-biz-senha', v) } catch (er) {}\n        d2.setState({ senha: v }); carregar(); return }\n      const rf = a.closest('[data-refresh]'); if (rf) { carregar(); return }\n      const pr = a.closest('[data-periodo]'); if (pr) { d2.setState({ periodo: Number(pr.dataset.periodo) }); return }\n      const ln = a.closest('[data-call]'); if (ln) { abrir(ln.dataset.call, ln.dataset.cid); return }\n      const fc = a.closest('[data-fechar]'); if (fc) { d2.setState({ sel: null, det: null }); return }\n      const au = a.closest('[data-ouvir]'); if (au) { ouvir(); return }\n    })\n    d2.on(d2.root, 'input', (e) => { const el = e.target; if (el && el.dataset && el.dataset.campo === 'busca') d2.setState({ busca: el.value }) })\n\n    if (senhaDe()) { d2.setState({ fase: 'painel' }); carregar() }\n  },\n\n  render(d2) {\n    const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"]/g, c => ({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;' }[c]))\n    if (d2.state.fase === 'gate') {\n      return `<div class=\"portao\"><div class=\"caixa\">\n        <h1>Painel da URA de Voz</h1>\n        <div class=\"sub\">indicadores de atendimento · acesso restrito</div>\n        <input type=\"password\" id=\"senha\" placeholder=\"senha de acesso\" autocomplete=\"current-password\">\n        <button class=\"btn\" data-entrar=\"1\">entrar</button>\n        ${d2.state.erro ? `<div class=\"err\">${esc(d2.state.erro)}</div>` : ''}\n      </div></div>`\n    }\n\n    const dur = (s) => { s = Math.round(Number(s)||0); const m = Math.floor(s/60), r = s%60; return m ? `${m}m${String(r).padStart(2,'0')}` : `${r}s` }\n    const agora = Date.now()\n    const janela = d2.state.periodo > 0 ? d2.state.periodo * 86400000 : Infinity\n    const dentro = (t) => { const x = new Date(t).getTime(); return isFinite(janela) ? (agora - x) <= janela : true }\n    const q = (d2.state.busca||'').trim().toLowerCase()\n    const chamadas = (d2.state.chamadas||[]).filter(c => dentro(c.timestamp)).filter(c => !q ||\n      String(c.call_id||'').toLowerCase().includes(q) || String(c.consultant_id||'').toLowerCase().includes(q) || String(c.caller_number||'').toLowerCase().includes(q))\n    const callIds = new Set(chamadas.map(c => c.call_id))\n    const servicos = (d2.state.servicos||[]).filter(s => callIds.has(s.call_id))\n\n    const n = chamadas.length\n    const soma = (arr, f) => arr.reduce((a,c)=>a+(Number(f(c))||0),0)\n    const retidas = chamadas.filter(c => /retid/i.test(String(c.outcome||'')) || /total/i.test(String(c.retention||''))).length\n    const transf = chamadas.filter(c => c.transferred_intent || c.transferred_done).length\n    const comCsat = chamadas.filter(c => c.csat_score != null)\n    const csatMed = comCsat.length ? (soma(comCsat, c=>c.csat_score)/comCsat.length) : null\n    const durMed = n ? soma(chamadas, c=>c.duration_s)/n : 0\n    const erros = servicos.filter(s => s.erro).length\n    const consultores = new Set(chamadas.map(c=>c.consultant_id).filter(Boolean)).size\n\n    const kpi = (v,l,extra) => `<div class=\"card kpi\"><div class=\"v\">${v}</div><div class=\"l\">${esc(l)}</div>${extra?`<div class=\"d\">${extra}</div>`:''}</div>`\n\n    // chamadas por dia (últimos min(periodo,21) dias)\n    const dias = Math.min(d2.state.periodo>0?d2.state.periodo:21, 21)\n    const porDia = []\n    for (let i = dias-1; i >= 0; i--) {\n      const d = new Date(agora - i*86400000); const key = d.toISOString().slice(0,10)\n      porDia.push({ key, lab: d.toLocaleDateString('pt-BR',{day:'2-digit',month:'2-digit'}),\n        n: chamadas.filter(c => String(c.timestamp||'').slice(0,10) === key).length })\n    }\n    const maxDia = Math.max(1, ...porDia.map(d=>d.n))\n    const colDia = `<div class=\"colbars\">${porDia.map(d=>`<div class=\"col\" title=\"${d.lab}: ${d.n}\">\n      <div class=\"cb\" style=\"height:${Math.round(d.n/maxDia*120)}px\"></div><div class=\"cd\">${d.lab}</div></div>`).join('')}</div>`\n\n    // barras genéricas\n    const barras = (rows, cor) => { const mx = Math.max(1, ...rows.map(r=>r.v)); return rows.length ? rows.map(r=>`\n      <div class=\"bar-row\"><div class=\"lab\" title=\"${esc(r.k)}\">${esc(r.k)}</div>\n        <div class=\"track\"><div class=\"fill\" style=\"width:${Math.round(r.v/mx*100)}%;${cor?`background:${cor}`:''}\"></div></div>\n        <div class=\"val\">${r.v}</div></div>`).join('') : `<div class=\"vazio\">sem dados</div>` }\n\n    const grp = (arr, f) => { const m = {}; arr.forEach(x=>{ const k=f(x)||'—'; m[k]=(m[k]||0)+1 }); \n      return Object.entries(m).map(([k,v])=>({k,v})).sort((a,b)=>b.v-a.v) }\n\n    const porUsecase = grp(servicos, s=>s.usecase).slice(0,10)\n    const porOutcome = grp(chamadas, c=>c.outcome).slice(0,8)\n    const porConsultor = grp(chamadas.filter(c=>c.consultant_id), c=>c.consultant_id).slice(0,8)\n\n    const outPill = (o) => { const k = /retid/i.test(o)?'g':/transfer/i.test(o)?'i':/aband|erro|falha/i.test(o)?'b':/devolv/i.test(o)?'a':'n'\n      return `<span class=\"pill ${k}\">${esc(o||'—')}</span>` }\n\n    const linhas = chamadas.slice(0,120).map(c => `\n      <tr class=\"click\" data-call=\"${esc(c.call_id)}\" data-cid=\"${esc(c.conversation_id||'')}\">\n        <td class=\"mono\">${esc(new Date(c.timestamp).toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',hour:'2-digit',minute:'2-digit'}))}</td>\n        <td>${esc(c.consultant_id||'—')}<div class=\"mono\">${esc(c.caller_number||'')}</div></td>\n        <td>${outPill(c.outcome)}${c.transferred_done?' <span class=\"pill i\">transf✓</span>':(c.transferred_intent?' <span class=\"pill a\">transf?</span>':'')}</td>\n        <td style=\"text-align:right\">${dur(c.duration_s)}</td>\n        <td style=\"text-align:right\">${c.usecases_count||0}</td>\n        <td style=\"text-align:right\">${c.csat_score!=null?esc(c.csat_score):'—'}</td>\n      </tr>`).join('')\n\n    const seg = (v,l) => `<button class=\"${d2.state.periodo===v?'on':''}\" data-periodo=\"${v}\">${l}</button>`\n\n    return `<div class=\"wrap\">\n      <div class=\"top\">\n        <h1>Painel da URA de Voz</h1>\n        <span class=\"sub\">${n} chamadas${d2.state.carregando?' · atualizando…':''}</span>\n        <span class=\"cresce\"></span>\n        <input data-campo=\"busca\" value=\"${esc(d2.state.busca)}\" placeholder=\"🔎 consultora / número / call_id\" style=\"width:210px\">\n        <div class=\"seg\">${seg(7,'7d')}${seg(30,'30d')}${seg(90,'90d')}${seg(0,'tudo')}</div>\n        <button class=\"gh\" data-refresh=\"1\">↻ atualizar</button>\n      </div>\n      <div class=\"body\">\n        <div class=\"kpis\">\n          ${kpi(n,'Chamadas')}\n          ${kpi(dur(durMed),'Duração média')}\n          ${kpi(n?Math.round(retidas/n*100)+'%':'—','Retenção')}\n          ${kpi(n?Math.round(transf/n*100)+'%':'—','Pediram atendente')}\n          ${kpi(servicos.length,'Serviços consumidos')}\n          ${kpi(servicos.length?Math.round(erros/servicos.length*100)+'%':'—','Erros em serviços')}\n          ${kpi(consultores,'Consultoras únicas')}\n          ${kpi(csatMed!=null?csatMed.toFixed(1):'—','CSAT médio')}\n        </div>\n        <div class=\"grid2\">\n          <div class=\"card\"><h2>Chamadas por dia</h2>${colDia}</div>\n          <div class=\"card\"><h2>Desfecho</h2>${barras(porOutcome.map(r=>({k:r.k,v:r.v})),'#16a34a')}</div>\n        </div>\n        <div class=\"grid2b\">\n          <div class=\"card\"><h2>Serviços mais consumidos <span class=\"h2sub\">(use cases)</span></h2>${barras(porUsecase,'#2b6cff')}</div>\n          <div class=\"card\"><h2>Chamadas por consultora</h2>${barras(porConsultor,'#7c5fd0')}</div>\n        </div>\n        <div class=\"card\">\n          <h2>Chamadas <span class=\"h2sub\">— clique para abrir a transcrição, serviços e gravação</span></h2>\n          <table class=\"tbl\"><thead><tr><th>Quando</th><th>Consultora</th><th>Desfecho</th>\n            <th style=\"text-align:right\">Duração</th><th style=\"text-align:right\">Serviços</th><th style=\"text-align:right\">CSAT</th></tr></thead>\n            <tbody>${linhas || `<tr><td colspan=\"6\" class=\"vazio\">nenhuma chamada no período</td></tr>`}</tbody></table>\n        </div>\n      </div>\n      ${d2.state.sel ? this.renderDrawer(d2, esc, dur, outPill) : ''}\n    </div>`\n  },\n\n  renderDrawer(d2, esc, dur, outPill) {\n    const inner = () => {\n      if (d2.state.carregandoDet) return `<div class=\"vazio\">carregando…</div>`\n      const det = d2.state.det; if (!det) return `<div class=\"vazio\">não foi possível carregar o detalhe.</div>`\n      const c = det.chamada || {}; const tr = Array.isArray(det.transcript)?det.transcript:[]; const sv = Array.isArray(det.servicos)?det.servicos:[]\n      const m = (v,l) => `<div class=\"m\"><div class=\"mv\">${v==null||v===''?'—':esc(v)}</div><div class=\"ml\">${esc(l)}</div></div>`\n      const acao = (t) => { try { if (t.tool_calls&&t.tool_calls[0]) { const raw=t.tool_calls[0].params_as_json||(t.tool_calls[0].tool_details&&t.tool_calls[0].tool_details.body); const p=typeof raw==='string'?JSON.parse(raw):raw; return (p&&(p.action||p.name))||null } } catch(e){} return null }\n      const conv = tr.length ? tr.map(t => { const role=t.role||t.source||''; const msg=t.message||t.text||''; const a=acao(t)\n        if (a&&!msg) return `<div class=\"tl\">⚙ ${esc(a)}</div>`; if (!msg&&!a) return ''\n        const u=/user|caller|cliente|consultora/i.test(role)\n        return `<div class=\"bub ${u?'u':'a'}\"><div class=\"q\">${u?'consultora':'assistente'}${a?' · '+esc(a):''}</div>${esc(msg)}</div>` }).join('') : `<div class=\"vazio\">sem transcrição.</div>`\n      const svc = sv.length ? sv.map((s,i)=>`<div class=\"svc\"><div class=\"o\">${esc(s.ordem!=null?s.ordem+1:i+1)}</div>\n        <div><b>${esc(s.usecase||'—')}</b></div>${s.erro?' <span class=\"pill b\">erro</span>':''}\n        <div class=\"lat\">${s.latencia_s!=null?esc(Math.round(s.latencia_s*10)/10)+'s':''}</div></div>`).join('') : `<div class=\"vazio\">nenhum serviço.</div>`\n      const grav = d2.state.audioUrl\n        ? `<div class=\"grav\">Gravação da ligação<audio controls autoplay src=\"${esc(d2.state.audioUrl)}\"></audio></div>`\n        : `<div class=\"grav\"><div>Gravação — <span class=\"mono\">${esc(c.conversation_id||'sem id')}</span></div>\n            <button class=\"btn\" data-ouvir=\"1\" ${d2.state.buscandoAudio?'disabled':''} style=\"margin-top:10px\">\n              ${d2.state.buscandoAudio?'buscando…':'▶ ouvir gravação'}</button>\n            ${d2.state.audioMsg?`<div class=\"err\">${esc(d2.state.audioMsg)}</div>`:''}</div>`\n      return `<div class=\"metg\">\n          ${m(dur(c.duration_s),'duração')}${m(c.csat_score,'CSAT')}${m(c.retention,'retenção')}\n          ${m((c.user_turns||0)+'/'+(c.agent_turns||0),'turnos')}${m(c.usecases_count,'serviços')}\n          ${m(c.tool_errors,'erros')}${m(c.ai_tokens,'tokens')}\n          ${m(c.transferred_done?'sim':(c.transferred_intent?'tentou':'não'),'transferência')}</div>\n        <h2>Transcrição</h2><div class=\"conv\">${conv}</div>\n        <h2>Serviços consumidos</h2>${svc}\n        <h2>Gravação</h2>${grav}`\n    }\n    const c = (d2.state.det && d2.state.det.chamada) || {}\n    return `<div class=\"drawer\">\n      <div class=\"dh\">${outPill(c.outcome)}<span class=\"mono\">${esc(String(d2.state.sel||'').slice(0,24))}</span>\n        <button class=\"x\" data-fechar=\"1\">×</button></div>\n      <div class=\"dc\">${inner()}</div>\n    </div>`\n  }\n}","at":"2026-08-26T11:46:23.040Z"}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a8ed01f6a3098f292ced9c7","component":"data2-core-primitives@Artboard","system":"65a86528721f5a092783289d","displayName":"URA — Painel de Negócios","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"URA — Painel de Negócios"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"EqYad-1ekC0unAbs01cWH","deleteMetadata":{}},{"_id":"d2ab7d5196fe1ddf05511f45","parent":"6a8ed01f6a3098f292ced9c7","component":"natura-br@kUraBiz","system":"65a86528721f5a092783289d","displayName":"Painel de Negócios","params":{"rushBiz":"poc-ura-biz","rushDetalhe":"poc-ura-monitor","rushAudio":"poc-ura-audio","senhaParam":"","super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"W3iCQsQXoS7zWpavlDgg0","deleteMetadata":{}}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a8ed05a1a8b98a061752f63","displayName":"URA — Painel de Negócios","reference":"3z2rLk5CkuDxE9CwS9hvu","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"ura-painel"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"EqYad-1ekC0unAbs01cWH"}}},"system":"65a86528721f5a092783289d","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}