{"context":{"domain":"natura-hr-demo"},"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":"659c0922f17cf6092bc666b3","name":"Chatbot Colaborador","domain":"natura-hr-demo","visibility":"public","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-08-13T23:56:03.403Z","createdAt":"2024-01-08T14:39:30.892Z"}]}},{"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":"6aac102ddca67727d51ec1df","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"Controle_Use_Cases","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const SYS = ['_id','__v','createdAt','updatedAt']\nconst LK1 = { usecase: 'usecases', error_step: 'steps' }\nconst LKN = ['categories','regions_allowlist','regions_blocklist']\nconst ARR = ['requests_before_answer','instructions_variables_blocklist','accepts_file_extensions','envs','sources_list','requests_enhance_variables']\nconst OBJ = ['variables','next_steps','appended_answers','alternatives','examples','dynamic_faq_file']\nconst LONG = ['instructions','description','description_v_2','negative_examples','ocr_instructions','photo_instructions','answer_format','step_format','side_effect']\nconst BOOL = ['active','authentication_required','receber_reports','transfer_agent','launch_survey','answer_skip_reasoning','use_specific_subcategories','required','ignore_monitoring','usecase_is_flux','skip_assistant_answer','text_extraction_for_ocr','start_step','end_step','virtual_step']\nconst NUM = ['index']\nconst FB = {\n  usecases: ['title','label','active','usecase_is_flux','description','description_v_2','negative_examples','instructions','examples','authentication_required','transfer_agent','launch_survey','receber_reports','required','ignore_monitoring','answer_skip_reasoning','use_specific_subcategories','answer_format','envs','regions_allowlist','regions_blocklist','categories','dynamic_faq_file'],\n  steps: ['title','label','index','active','usecase','start_step','end_step','virtual_step','skip_assistant_answer','description','instructions','instructions_variables_blocklist','variables','next_steps','error_step','appended_answers','alternatives','requests_before_answer','requests_enhance_variables','sources_list','accepts_file_extensions','ocr_instructions','text_extraction_for_ocr','photo_instructions','step_format','answer_format','side_effect']\n}\nconst HELP = {\n  usecase: 'Vazio = step global (vale para todos os fluxos), como o CANCELAR_FLUXO_ATUAL.',\n  next_steps: 'Lista de { step: <id>, prompt, check }. O id do step é normalizado ao salvar.',\n  instructions_variables_blocklist: 'Bloquear \"is_cancelling_flow\" desliga TAMBÉM o is_changing_subject.',\n  virtual_step: 'Step virtual faz o orquestrador reinvocar o listener (sem guarda de profundidade).'\n}\n\nfunction esc(v){ return String(v == null ? '' : v).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;') }\nfunction idOf(v){ return v && typeof v === 'object' ? (v._id || '') : (v || '') }\nfunction titleOf(r){ return r ? (r.title || r.label || '(sem titulo)') : '' }\nfunction cnt(ds, rows){\n  const info = (ds && ds.pageInfo && ds.pageInfo()) || {}\n  const total = Number(info.total || 0)\n  return total && rows.length < total ? rows.length + ' de ' + total + '…' : String(rows.length)\n}\nfunction kindOf(k, val){\n  if (LK1[k]) return 'lk1'\n  if (LKN.indexOf(k) >= 0 || ARR.indexOf(k) >= 0 || OBJ.indexOf(k) >= 0) return 'json'\n  if (BOOL.indexOf(k) >= 0) return 'bool'\n  if (NUM.indexOf(k) >= 0) return 'num'\n  if (Array.isArray(val) || (val && typeof val === 'object')) return 'json'\n  if (LONG.indexOf(k) >= 0) return 'text'\n  return 'str'\n}\nfunction fieldsFor(tab, rec){\n  const base = (FB[tab] || []).slice()\n  Object.keys(rec || {}).forEach(function(k){ if (SYS.indexOf(k) < 0 && base.indexOf(k) < 0) base.push(k) })\n  return base\n}\nfunction normalize(rec){\n  const out = {}\n  Object.keys(rec || {}).forEach(function(k){\n    if (k === '__v' || k === 'createdAt' || k === 'updatedAt') return\n    const v = rec[k]\n    if (LK1[k]) { out[k] = idOf(v) || null; return }\n    if (LKN.indexOf(k) >= 0) { out[k] = (Array.isArray(v) ? v : []).map(idOf).filter(Boolean); return }\n    if (k === 'next_steps') { out[k] = (Array.isArray(v) ? v : []).map(function(n){ return Object.assign({}, n, { step: idOf(n && n.step) || null }) }); return }\n    out[k] = v\n  })\n  return out\n}\nfunction jsonDefault(k){ return k === 'dynamic_faq_file' ? {} : [] }\nfunction dsOf(d2, tab){ return tab === 'usecases' ? d2.data('usecases') : d2.data('steps') }\nfunction pick(d2, tab, id){\n  const rows = (dsOf(d2, tab).records() || [])\n  for (let i = 0; i < rows.length; i++) if (rows[i]._id === id) return rows[i]\n  return null\n}\nfunction openRecord(d2, tab, id){\n  const rec = pick(d2, tab, id)\n  if (!rec) return\n  d2.setState({ tab: tab, selId: id, draft: JSON.parse(JSON.stringify(rec)), jsonText: {}, dirty: false, msg: null, delId: null, delTyped: '' })\n}\nfunction newRecord(d2, tab){\n  const draft = tab === 'usecases'\n    ? { title: '', label: '', active: true }\n    : { title: '', label: '', active: true, index: 0, usecase: d2.state.fuc && d2.state.fuc !== '__none' ? d2.state.fuc : null }\n  d2.setState({ tab: tab, selId: null, draft: draft, jsonText: {}, dirty: true, msg: null, delId: null, delTyped: '' })\n}\nfunction setField(d2, k, v){\n  const draft = Object.assign({}, d2.state.draft || {})\n  draft[k] = v\n  d2.setState({ draft: draft, dirty: true })\n}\nfunction impact(d2, tab, id){\n  const steps = d2.data('steps').records() || []\n  if (tab === 'usecases') {\n    const owned = steps.filter(function(s){ return idOf(s.usecase) === id })\n    return owned.length ? owned.length + ' step(s) pertencem a este caso de uso e ficariam orfaos.' : ''\n  }\n  const refs = steps.filter(function(s){\n    if (idOf(s.error_step) === id) return true\n    return (Array.isArray(s.next_steps) ? s.next_steps : []).some(function(n){ return idOf(n && n.step) === id })\n  })\n  return refs.length ? refs.length + ' step(s) apontam para este: ' + refs.slice(0, 6).map(function(s){ return s.label || s.title }).join(', ') + (refs.length > 6 ? '…' : '') : ''\n}\n\nexport default {\n  css: `\n  :host, .app { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; }\n  .app { display:grid; grid-template-columns: 340px minmax(0,1fr); height:100%; background:#f6f6f7; color:#1c1a18; font-size:13px }\n  .pad { padding:24px; font-size:14px }\n  .err { color:#9e2b2b }\n  .side { display:flex; flex-direction:column; min-height:0; border-right:1px solid #e2e0dd; background:#fff }\n  .tabs { display:flex; padding:10px 10px 0; gap:6px }\n  .tabs button { flex:1; padding:8px 10px; border:1px solid #e2e0dd; background:#f6f6f7; border-radius:8px 8px 0 0; cursor:pointer; font-size:12px; font-weight:600; color:#57514b }\n  .tabs button[data-on] { background:#fff; color:#1c1a18; border-bottom-color:#fff }\n  .filters { padding:10px; display:flex; flex-direction:column; gap:6px; border-bottom:1px solid #e2e0dd }\n  .filters input, .filters select { width:100%; box-sizing:border-box; padding:7px 9px; border:1px solid #d8d5d1; border-radius:7px; font-size:12px; background:#fff }\n  .count { font-size:11px; color:#8b837a; padding:0 2px }\n  .list { flex:1; overflow:auto; min-height:0 }\n  .row { padding:8px 12px; border-bottom:1px solid #f0eeec; cursor:pointer }\n  .row:hover { background:#faf9f8 }\n  .row[data-on] { background:#eef3fb; box-shadow: inset 3px 0 0 #2b5a86 }\n  .row .t { font-weight:600; color:#1c1a18 }\n  .row .l { font-family: ui-monospace, Menlo, Consolas, monospace; font-size:11px; color:#8b837a; word-break:break-all }\n  .tags { margin-top:3px; display:flex; gap:4px; flex-wrap:wrap }\n  .tag { font-size:10px; padding:1px 5px; border-radius:4px; border:1px solid #d8d5d1; color:#57514b; background:#f6f6f7 }\n  .tag.off { color:#9e2b2b; border-color:#e6b9b9; background:#fbeaea }\n  .tag.glob { color:#96650c; border-color:#e8d4a8; background:#fdf3e0 }\n  .newbar { padding:10px; border-top:1px solid #e2e0dd }\n  .main { display:flex; flex-direction:column; min-width:0; min-height:0 }\n  .head { padding:12px 16px; border-bottom:1px solid #e2e0dd; background:#fff; display:flex; gap:10px; align-items:center; flex-wrap:wrap }\n  .head h2 { margin:0; font-size:15px; flex:1; min-width:140px }\n  .head .id { font-family: ui-monospace, Menlo, Consolas, monospace; font-size:11px; color:#8b837a }\n  button.act { padding:7px 13px; border-radius:7px; border:1px solid #d8d5d1; background:#fff; cursor:pointer; font-size:12px; font-weight:600; color:#1c1a18 }\n  button.act:hover { background:#f6f6f7 }\n  button.prim { background:#2b5a86; border-color:#2b5a86; color:#fff }\n  button.prim[disabled] { opacity:.45; cursor:default }\n  button.dang { color:#9e2b2b; border-color:#e6b9b9 }\n  button.dangf { background:#9e2b2b; border-color:#9e2b2b; color:#fff }\n  button.dangf[disabled] { opacity:.45; cursor:default }\n  .body { flex:1; overflow:auto; min-height:0; padding:16px }\n  .msg { padding:9px 12px; border-radius:8px; margin-bottom:12px; font-size:12px }\n  .msg.ok { background:#e7f2eb; color:#2f6b46; border:1px solid #bcdcc8 }\n  .msg.bad { background:#fbeaea; color:#9e2b2b; border:1px solid #e6b9b9 }\n  .confirm { border:1px solid #e6b9b9; background:#fbeaea; border-radius:10px; padding:14px; margin-bottom:14px }\n  .confirm h3 { margin:0 0 6px; font-size:13px; color:#9e2b2b }\n  .confirm p { margin:0 0 8px; font-size:12px; color:#57514b }\n  .confirm input { padding:7px 9px; border:1px solid #d8d5d1; border-radius:7px; font-size:12px; width:220px; margin-right:8px }\n  .fld { margin-bottom:12px }\n  .fld label { display:block; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:#57514b; margin-bottom:4px }\n  .fld .hint { font-size:11px; color:#8b837a; margin:3px 0 0 }\n  .fld input[type=text], .fld input[type=number], .fld select, .fld textarea {\n    width:100%; box-sizing:border-box; padding:8px 10px; border:1px solid #d8d5d1; border-radius:8px; font-size:13px; background:#fff; font-family:inherit }\n  .fld textarea { min-height:90px; resize:vertical; line-height:1.5 }\n  .fld textarea.json { font-family: ui-monospace, Menlo, Consolas, monospace; font-size:12px; min-height:120px; background:#fbfbfa }\n  .fld textarea.big { min-height:200px }\n  .chk { display:flex; align-items:center; gap:8px }\n  .chk input { width:16px; height:16px }\n  .chk label { margin:0; text-transform:none; font-size:13px; font-weight:600; letter-spacing:0 }\n  .empty { padding:40px; text-align:center; color:#8b837a }\n  `,\n\n  render(d2){\n    const uc = d2.data('usecases'), st = d2.data('steps')\n    if (!uc || !st) return `<div class=\"pad err\">Os params <b>usecases</b> e <b>steps</b> nao estao vinculados nesta instancia.</div>`\n    const tab = d2.state.tab || 'usecases'\n    const ds = tab === 'usecases' ? uc : st\n    if (ds.loading) return `<div class=\"pad\">Carregando…</div>`\n\n    const ucRows = uc.records() || []\n    const stRows = st.records() || []\n    const rows = tab === 'usecases' ? ucRows : stRows\n    const q = (d2.state.q || '').toLowerCase()\n    const fuc = d2.state.fuc || ''\n\n    let list = rows.filter(function(r){\n      if (q && ((r.title || '') + ' ' + (r.label || '')).toLowerCase().indexOf(q) < 0) return false\n      if (tab === 'steps' && fuc) {\n        const uid = idOf(r.usecase)\n        if (fuc === '__none') return !uid\n        return uid === fuc\n      }\n      return true\n    }).slice()\n\n    list.sort(function(a, b){\n      if (tab === 'steps') {\n        const ua = titleOf(a.usecase && typeof a.usecase === 'object' ? a.usecase : null) || 'zzz'\n        const ub = titleOf(b.usecase && typeof b.usecase === 'object' ? b.usecase : null) || 'zzz'\n        if (ua !== ub) return ua < ub ? -1 : 1\n        return (Number(a.index) || 0) - (Number(b.index) || 0)\n      }\n      return titleOf(a).localeCompare(titleOf(b))\n    })\n\n    const ucOptions = ucRows.slice().sort(function(a,b){ return titleOf(a).localeCompare(titleOf(b)) })\n\n    const side = `\n      <aside class=\"side\">\n        <div class=\"tabs\">\n          <button data-tab=\"usecases\" ${tab === 'usecases' ? 'data-on' : ''}>Casos de uso (${cnt(uc, ucRows)})</button>\n          <button data-tab=\"steps\" ${tab === 'steps' ? 'data-on' : ''}>Steps (${cnt(st, stRows)})</button>\n        </div>\n        <div class=\"filters\">\n          <input class=\"q\" type=\"text\" placeholder=\"Buscar por titulo ou label\" value=\"${esc(d2.state.q || '')}\"/>\n          ${tab === 'steps' ? `<select class=\"fuc\">\n            <option value=\"\">Todos os casos de uso</option>\n            <option value=\"__none\" ${fuc === '__none' ? 'selected' : ''}>— sem caso de uso (globais) —</option>\n            ${ucOptions.map(function(u){ return `<option value=\"${esc(u._id)}\" ${fuc === u._id ? 'selected' : ''}>${esc(titleOf(u))}</option>` }).join('')}\n          </select>` : ''}\n          <div class=\"count\">${list.length} registro(s)</div>\n        </div>\n        <div class=\"list\">\n          ${list.map(function(r, i){\n            const uid = tab === 'steps' ? idOf(r.usecase) : ''\n            return `<div class=\"row\" data-id=\"${esc(r._id || '')}\" data-key=\"${esc(r._id || ('pending-' + i))}\" ${d2.state.selId === r._id ? 'data-on' : ''}>\n              <div class=\"t\">${esc(titleOf(r))}</div>\n              <div class=\"l\">${esc(r.label || '')}</div>\n              <div class=\"tags\">\n                ${r.active === false ? '<span class=\"tag off\">inativo</span>' : ''}\n                ${tab === 'steps' && !uid ? '<span class=\"tag glob\">global</span>' : ''}\n                ${tab === 'steps' && r.start_step ? '<span class=\"tag\">start</span>' : ''}\n                ${tab === 'steps' && r.end_step ? '<span class=\"tag\">end</span>' : ''}\n                ${tab === 'steps' && r.virtual_step ? '<span class=\"tag\">virtual</span>' : ''}\n                ${tab === 'steps' ? `<span class=\"tag\">idx ${esc(r.index != null ? r.index : '-')}</span>` : ''}\n                ${tab === 'usecases' && r.usecase_is_flux ? '<span class=\"tag\">fluxo</span>' : ''}\n              </div>\n            </div>`\n          }).join('')}\n        </div>\n        <div class=\"newbar\"><button class=\"act new\">+ Novo ${tab === 'usecases' ? 'caso de uso' : 'step'}</button></div>\n      </aside>`\n\n    const draft = d2.state.draft\n    if (!draft) {\n      return `<div class=\"app\">${side}<main class=\"main\"><div class=\"empty\">Selecione um registro na lista, ou crie um novo.</div></main></div>`\n    }\n\n    const msg = d2.state.msg\n    const delId = d2.state.delId\n    const imp = delId ? impact(d2, tab, delId) : ''\n    const jt = d2.state.jsonText || {}\n\n    const form = fieldsFor(tab, draft).map(function(k){\n      const v = draft[k]\n      const kind = kindOf(k, v)\n      const hint = HELP[k] ? `<p class=\"hint\">${esc(HELP[k])}</p>` : ''\n      if (kind === 'bool') {\n        return `<div class=\"fld\"><div class=\"chk\"><input type=\"checkbox\" data-f=\"${esc(k)}\" data-kind=\"bool\" ${v ? 'checked' : ''}/><label>${esc(k)}</label></div>${hint}</div>`\n      }\n      if (kind === 'num') {\n        return `<div class=\"fld\"><label>${esc(k)}</label><input type=\"number\" data-f=\"${esc(k)}\" data-kind=\"num\" value=\"${esc(v == null ? '' : v)}\"/>${hint}</div>`\n      }\n      if (kind === 'lk1') {\n        const opts = LK1[k] === 'usecases' ? ucOptions : stRows.slice().sort(function(a,b){ return titleOf(a).localeCompare(titleOf(b)) })\n        const cur = idOf(v)\n        return `<div class=\"fld\"><label>${esc(k)}</label>\n          <select data-f=\"${esc(k)}\" data-kind=\"lk1\">\n            <option value=\"\">— vazio —</option>\n            ${opts.map(function(o){ return `<option value=\"${esc(o._id)}\" ${cur === o._id ? 'selected' : ''}>${esc(titleOf(o))}${o.label ? ' · ' + esc(o.label) : ''}</option>` }).join('')}\n          </select>${hint}</div>`\n      }\n      if (kind === 'json') {\n        const txt = jt[k] != null ? jt[k] : JSON.stringify(v == null ? jsonDefault(k) : v, null, 2)\n        return `<div class=\"fld\"><label>${esc(k)} <span style=\"font-weight:500;text-transform:none;color:#8b837a\">(JSON)</span></label>\n          <textarea class=\"json\" data-f=\"${esc(k)}\" data-kind=\"json\">${esc(txt)}</textarea>${hint}</div>`\n      }\n      if (kind === 'text') {\n        return `<div class=\"fld\"><label>${esc(k)}</label><textarea class=\"${k === 'instructions' || k === 'ocr_instructions' ? 'big' : ''}\" data-f=\"${esc(k)}\" data-kind=\"str\">${esc(v == null ? '' : v)}</textarea>${hint}</div>`\n      }\n      return `<div class=\"fld\"><label>${esc(k)}</label><input type=\"text\" data-f=\"${esc(k)}\" data-kind=\"str\" value=\"${esc(v == null ? '' : v)}\"/>${hint}</div>`\n    }).join('')\n\n    const main = `\n      <main class=\"main\">\n        <div class=\"head\">\n          <h2>${esc(titleOf(draft) || (d2.state.selId ? '(sem titulo)' : 'Novo registro'))}</h2>\n          ${d2.state.selId ? `<span class=\"id\">${esc(d2.state.selId)}</span>` : '<span class=\"id\">novo</span>'}\n          ${d2.state.dirty ? '<span class=\"tag\">alteracoes nao salvas</span>' : ''}\n          <button class=\"act prim save\" ${d2.state.busy || !d2.state.dirty ? 'disabled' : ''}>${d2.state.busy ? 'Salvando…' : 'Salvar'}</button>\n          <button class=\"act close\">Fechar</button>\n          ${d2.state.selId ? '<button class=\"act dang del\">Excluir</button>' : ''}\n        </div>\n        <div class=\"body\">\n          ${msg ? `<div class=\"msg ${msg.type === 'ok' ? 'ok' : 'bad'}\">${esc(msg.text)}</div>` : ''}\n          ${delId ? `<div class=\"confirm\">\n            <h3>Confirmacao dupla — exclusao permanente</h3>\n            <p>Voce vai excluir <b>${esc(titleOf(draft))}</b> (<code>${esc(draft.label || '')}</code>, id ${esc(delId)}). Esta acao nao pode ser desfeita.</p>\n            ${imp ? `<p><b>Impacto:</b> ${esc(imp)}</p>` : ''}\n            <p>Para liberar o botao, digite <b>EXCLUIR</b> no campo abaixo.</p>\n            <input class=\"deltyped\" type=\"text\" placeholder=\"EXCLUIR\" value=\"${esc(d2.state.delTyped || '')}\"/>\n            <button class=\"act dangf delgo\" ${(d2.state.delTyped || '').trim().toUpperCase() === 'EXCLUIR' && !d2.state.busy ? '' : 'disabled'}>Excluir definitivamente</button>\n            <button class=\"act delno\">Cancelar</button>\n          </div>` : ''}\n          ${form}\n        </div>\n      </main>`\n\n    return `<div class=\"app\">${side}${main}</div>`\n  },\n\n  mounted(d2){\n    const timers = []\n    const getUC = function(){ return d2.data('usecases') }\n    const getST = function(){ return d2.data('steps') }\n    const ensureAll = function(get, tries){\n      if (tries <= 0) return\n      const ds = get()\n      if (!ds || !ds.loadAll) return\n      if (ds.loading || ds.fetching || ds.mutating) {\n        timers.push(setTimeout(function(){ ensureAll(get, tries - 1) }, 300))\n        return\n      }\n      const info = (ds.pageInfo && ds.pageInfo()) || {}\n      const have = (ds.records() || []).length\n      if (info.total && have >= Number(info.total)) return\n      Promise.resolve(ds.loadAll()).then(function(){\n        timers.push(setTimeout(function(){ ensureAll(get, tries - 1) }, 300))\n      }).catch(function(){})\n    }\n    ensureAll(getUC, 15)\n    ensureAll(getST, 15)\n    d2.onUnmount(function(){ timers.forEach(clearTimeout) })\n\n    d2.on('.tabs button', 'click', function(e, el){\n      d2.setState({ tab: el.dataset.tab, selId: null, draft: null, jsonText: {}, dirty: false, msg: null, delId: null, delTyped: '', q: '', fuc: '' })\n    })\n    d2.on('.q', 'input', function(e, el){ d2.setState({ q: el.value }) })\n    d2.on('.fuc', 'change', function(e, el){ d2.setState({ fuc: el.value }) })\n\n    d2.on('.row', 'click', async function(e, el){\n      const id = el.dataset.id\n      if (!id) return\n      if (d2.state.dirty) {\n        const ok = await d2.dialog.confirm('Descartar as alteracoes nao salvas?')\n        if (!ok) return\n      }\n      openRecord(d2, d2.state.tab || 'usecases', id)\n    })\n\n    d2.on('.new', 'click', async function(){\n      if (d2.state.dirty) {\n        const ok = await d2.dialog.confirm('Descartar as alteracoes nao salvas?')\n        if (!ok) return\n      }\n      newRecord(d2, d2.state.tab || 'usecases')\n    })\n\n    d2.on('.close', 'click', async function(){\n      if (d2.state.dirty) {\n        const ok = await d2.dialog.confirm('Descartar as alteracoes nao salvas?')\n        if (!ok) return\n      }\n      d2.setState({ selId: null, draft: null, jsonText: {}, dirty: false, msg: null, delId: null, delTyped: '' })\n    })\n\n    d2.on('[data-f]', 'input', function(e, el){\n      const k = el.dataset.f, kind = el.dataset.kind\n      if (kind === 'json') {\n        const jt = Object.assign({}, d2.state.jsonText || {})\n        jt[k] = el.value\n        d2.setState({ jsonText: jt, dirty: true })\n        return\n      }\n      if (kind === 'bool') return\n      if (kind === 'num') { setField(d2, k, el.value === '' ? null : Number(el.value)); return }\n      setField(d2, k, el.value)\n    })\n    d2.on('[data-kind=bool]', 'change', function(e, el){ setField(d2, el.dataset.f, !!el.checked) })\n    d2.on('[data-kind=lk1]', 'change', function(e, el){ setField(d2, el.dataset.f, el.value || null) })\n\n    d2.on('.save', 'click', async function(){\n      const tab = d2.state.tab || 'usecases'\n      const ds = dsOf(d2, tab)\n      const draft = Object.assign({}, d2.state.draft || {})\n      const jt = d2.state.jsonText || {}\n      const keys = Object.keys(jt)\n      for (let i = 0; i < keys.length; i++) {\n        const k = keys[i], txt = (jt[k] || '').trim()\n        if (txt === '') { draft[k] = jsonDefault(k); continue }\n        try { draft[k] = JSON.parse(txt) }\n        catch (err) { d2.setState({ msg: { type: 'bad', text: 'JSON invalido no campo \"' + k + '\": ' + err.message } }); return }\n      }\n      if (!draft.label || !String(draft.label).trim()) {\n        d2.setState({ msg: { type: 'bad', text: 'O campo label e obrigatorio — e por ele que o motor referencia o registro.' } })\n        return\n      }\n      const payload = normalize(draft)\n      d2.setState({ busy: true, msg: null })\n      try {\n        if (payload._id) {\n          await ds.update(payload)\n          d2.setState({ busy: false, dirty: false, jsonText: {}, msg: { type: 'ok', text: 'Registro salvo.' } })\n          openRecord(d2, tab, payload._id)\n          d2.setState({ msg: { type: 'ok', text: 'Registro salvo.' } })\n        } else {\n          await ds.create(payload)\n          d2.setState({ busy: false, dirty: false, draft: null, selId: null, jsonText: {}, msg: { type: 'ok', text: 'Registro criado. Ele aparece na lista a esquerda.' } })\n        }\n      } catch (err) {\n        d2.setState({ busy: false, msg: { type: 'bad', text: 'Falha ao salvar: ' + (err && err.message ? err.message : String(err)) } })\n      }\n    })\n\n    d2.on('.del', 'click', function(){ d2.setState({ delId: d2.state.selId, delTyped: '', msg: null }) })\n    d2.on('.delno', 'click', function(){ d2.setState({ delId: null, delTyped: '' }) })\n    d2.on('.deltyped', 'input', function(e, el){ d2.setState({ delTyped: el.value }) })\n    d2.on('.delgo', 'click', async function(){\n      if ((d2.state.delTyped || '').trim().toUpperCase() !== 'EXCLUIR') return\n      const tab = d2.state.tab || 'usecases'\n      const id = d2.state.delId\n      d2.setState({ busy: true })\n      try {\n        await dsOf(d2, tab).remove(id)\n        d2.setState({ busy: false, delId: null, delTyped: '', selId: null, draft: null, jsonText: {}, dirty: false, msg: { type: 'ok', text: 'Registro excluido.' } })\n      } catch (err) {\n        d2.setState({ busy: false, msg: { type: 'bad', text: 'Falha ao excluir: ' + (err && err.message ? err.message : String(err)) } })\n      }\n    })\n  },\n}"}},"usecases":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"usecases"}}}},"steps":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"steps"}}}}}}}}}},{"_id":"6ab9bd5d496eedc1ad2adc69","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"tb_employee_chat","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const DEMO_KEY = 'tb_demo_state_v1'\nconst demoNow = () => new Date().toISOString()\nconst demoHex = (n) => { let s = ''; for (let i = 0; i < n; i++) s += '0123456789ABCDEF'[Math.floor(Math.random() * 16)]; return s }\nconst demoFresh = () => ({\n  transfer: { id: 'demo_tr_' + Date.now(), status: 'queued', protocol: demoHex(32), queue_code: 'csc', env: 'DEMO', employee_name: 'Colaborador demo', employee_email: 'colaborador.demo@natura.net', queued_at: demoNow(), agent_name: '' },\n  messages: [{ id: 'm' + Date.now(), origin: 'employee', sender: 'SYSTEM', text: 'Você entrou na fila de atendimento. Assim que um atendente estiver disponível, ele fala com você por aqui.', created_at: demoNow() }],\n  agent: { id: 'demo_agent', name: 'Atendente demo', status: 'offline' },\n  bot_history: [\n    { sender: 'HUMAN', text: 'Quero falar com uma pessoa sobre as minhas férias.' },\n    { sender: 'ASSISTANT', text: 'Encaminhei seu pedido para o nosso time de atendimento. Enquanto isso, pode continuar falando comigo por aqui.' },\n  ],\n})\nconst demoRead = () => { try { return JSON.parse(localStorage.getItem(DEMO_KEY) || 'null') } catch (e) { return null } }\nconst demoWrite = (st) => {\n  try { localStorage.setItem(DEMO_KEY, JSON.stringify(st)) } catch (e) {}\n  try { const bc = new BroadcastChannel('tb_demo'); bc.postMessage('changed'); bc.close() } catch (e) {}\n}\nconst demoState = () => { const s = demoRead(); if (s) return s; const f = demoFresh(); demoWrite(f); return f }\nconst sleep = (ms) => new Promise((r) => setTimeout(r, ms))\nconst demoMirror = async (d2, role) => {\n  const errs = []\n  const msgOf = (e) => (e && (e.message || e.error || (typeof e === 'string' ? e : JSON.stringify(e)))) || 'erro'\n  const step = async (label, fn) => { try { return await fn() } catch (e) { errs.push(label + ': ' + msgOf(e)); return undefined } }\n  const run = async () => {\n    const trDs = d2.data('transfers_ds'); const msgDs = d2.data('messages_ds'); const evDs = d2.data('events_ds')\n    if (!trDs || !msgDs || !trDs.raw || !msgDs.raw) { errs.push('datasets nao ligados'); return }\n    const rows = (r) => (Array.isArray(r) ? r : (r && r.data) || [])\n    const stamp = (r) => (r && r.createdAt ? new Date(r.createdAt).getTime() : Number.MAX_SAFE_INTEGER)\n    const st = demoState(); const t = st.transfer\n    const findTransfer = () => step('buscar transferencia', async () => rows(await trDs.raw.find({ token: t.id, env: 'DEMO', $limit: 20 })).filter((r) => r.token === t.id).sort((a, b) => stamp(a) - stamp(b))[0])\n    const owner = (t.status === 'queued' || t.status === 'cancelled' || t.reason === 'closed_by_employee') ? 'employee' : 'agent'\n    const closed = t.status === 'closed' || t.status === 'cancelled'\n    const build = () => {\n      const rec = { chat_id: 'demo_' + t.id, env: 'DEMO', origin: 'demo', protocol: t.protocol, token: t.id, employee_email: t.employee_email, employee_name: t.employee_name, queue_code: t.queue_code, status: t.status, reason: t.reason || '', agent_id: t.agent_name ? st.agent.id : '', agent_name: t.agent_name || '', subject: t.subject || '', ticket_opened: !!t.ticket_opened, queued_at: t.queued_at }\n      if (t.assigned_at) rec.assigned_at = t.assigned_at\n      if (closed) rec.closed_at = demoNow()\n      return rec\n    }\n    const saveEvent = (id, from) => step('gravar evento', async () => { if (evDs && evDs.raw) await evDs.raw.saveRecord({ transfer_id: id, env: 'DEMO', type: 'demo_status', from_status: from || '', to_status: t.status, actor: role }) })\n    let rec = await findTransfer()\n    if (!rec) {\n      if (role !== 'employee') { errs.push('transferencia ainda nao esta na tabela'); return }\n      await step('criar transferencia', () => trDs.raw.saveRecord(build()))\n      rec = await findTransfer()\n      if (!rec) return\n      await saveEvent(String(rec._id), '')\n    } else if (owner === role && (rec.status !== t.status || (rec.subject || '') !== (t.subject || ''))) {\n      const upd = () => trDs.raw.saveRecord(Object.assign(build(), { _id: rec._id }))\n      let ok = true\n      try { await upd() } catch (e1) {\n        try { await trDs.raw.filter({ token: t.id, env: 'DEMO' }, true, true) } catch (e) {}\n        ok = (await step('atualizar transferencia', async () => { await upd(); return true })) === true\n      }\n      if (ok && rec.status !== t.status) await saveEvent(String(rec._id), rec.status)\n    }\n    const id = String(rec._id)\n    const saved = (await step('buscar mensagens', async () => rows(await msgDs.raw.find({ transfer_id: id, env: 'DEMO', $limit: 500 })).filter((m) => String(m.transfer_id) === id))) || null\n    if (!saved) return\n    const have = new Set(saved.map((m) => m.client_id))\n    for (const m of st.messages) {\n      const key = m.client_id || m.id\n      if (m.origin !== role || have.has(key)) continue\n      const done = await step('gravar mensagem', async () => { await msgDs.raw.saveRecord({ transfer_id: id, chat_id: 'demo_' + t.id, env: 'DEMO', sender: m.sender, author_id: m.sender === 'AGENT' ? st.agent.id : '', author_name: m.author_name || '', type: 'text', text: m.text, client_id: key }); return true })\n      if (done) have.add(key)\n    }\n  }\n  try {\n    if (typeof navigator !== 'undefined' && navigator.locks && navigator.locks.request) await navigator.locks.request('tb_demo_mirror', run)\n    else await run()\n  } catch (e) { errs.push(msgOf(e)) }\n  if (errs.length) d2.log('demo mirror', errs.join(' | '))\n  if ((d2.state.mirrorError || '') !== errs.join(' | ')) d2.state.mirrorError = errs.join(' | ')\n}\nconst demoEmployee = async (p) => {\n  if (p.action === 'restart') demoWrite(demoFresh())\n  const st = demoState()\n  const open = st.transfer.status === 'queued' || st.transfer.status === 'in_service'\n  if (p.action === 'send' && open && p.text) {\n    await sleep(350)\n    const s2 = demoState()\n    if (!s2.messages.some((m) => m.client_id === p.client_id)) s2.messages.push({ id: 'm' + Date.now(), origin: 'employee', sender: 'EMPLOYEE', text: p.text, client_id: p.client_id, created_at: demoNow() })\n    s2.transfer.last_employee_message_at = demoNow()\n    demoWrite(s2)\n  }\n  if (p.action === 'leave' && open) {\n    const s2 = demoState(); const q = s2.transfer.status === 'queued'\n    s2.transfer.status = q ? 'cancelled' : 'closed'\n    s2.transfer.reason = q ? 'left_queue' : 'closed_by_employee'\n    s2.messages.push({ id: 'm' + Date.now(), origin: 'employee', sender: 'SYSTEM', text: q ? 'Você saiu da fila de atendimento.' : 'Você encerrou o atendimento.', created_at: demoNow() })\n    demoWrite(s2)\n  }\n  const cur = demoState()\n  return { ok: true, action: p.action, transfer: Object.assign({}, cur.transfer, { position: cur.transfer.status === 'queued' ? 1 : 0, token: 'demo' }), messages: cur.messages }\n}\n\nexport default {\n  css: `\n    :host{--bg:#f4f6f8;--card:#ffffff;--ink:#18212d;--muted:#5b6778;--line:#d9e0e7;--accent:#1c6a86;--me:#1c6a86;--agent:#eef2f5;--sys:#8a95a5;--warn:#9a5a12;--ok:#2c7a4b}\n    .app{height:100%;display:flex;flex-direction:column;background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,-apple-system,\"Segoe UI\",sans-serif;box-sizing:border-box}\n    .demo{display:flex;gap:10px;align-items:center;justify-content:space-between;padding:6px 18px;background:#fbf0e1;color:var(--warn);font-size:12px}\n    .demo button{border:1px solid currentColor;background:transparent;color:inherit;border-radius:999px;padding:2px 10px;font:inherit;cursor:pointer}\n    .top{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;justify-content:space-between;padding:14px 18px;background:var(--card);border-bottom:1px solid var(--line)}\n    .top h1{font-size:16px;margin:0}\n    .meta{font-size:13px;color:var(--muted)}\n    .pill{display:inline-block;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:600;background:var(--agent);color:var(--ink)}\n    .pill.queued{background:#fbf0e1;color:var(--warn)}\n    .pill.in_service{background:#e3f2e8;color:var(--ok)}\n    .log{flex:1;overflow:auto;padding:16px 18px;display:flex;flex-direction:column;gap:8px}\n    .msg{max-width:78%;padding:9px 12px;border-radius:12px;white-space:pre-wrap;word-break:break-word}\n    .msg .who{display:block;font-size:11px;color:var(--muted);margin-bottom:2px}\n    .msg.EMPLOYEE{align-self:flex-end;background:var(--me);color:#fff}\n    .msg.EMPLOYEE .who{color:#d6e9f0}\n    .msg.AGENT{align-self:flex-start;background:var(--card);border:1px solid var(--line)}\n    .msg.SYSTEM{align-self:center;background:transparent;color:var(--sys);font-size:13px;text-align:center;max-width:90%}\n    .msg.pending{opacity:.6}\n    .bar{display:flex;gap:8px;padding:12px 18px;background:var(--card);border-top:1px solid var(--line)}\n    .in{flex:1;min-height:42px;max-height:140px;resize:vertical;padding:10px;border:1px solid var(--line);border-radius:10px;font:inherit}\n    .btn{padding:0 16px;min-height:42px;border:0;border-radius:10px;background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}\n    .btn.ghost{background:transparent;color:var(--muted);border:1px solid var(--line)}\n    .btn[disabled]{opacity:.5;cursor:default}\n    .ended{padding:14px 18px;background:var(--card);border-top:1px solid var(--line);color:var(--muted);font-size:14px}\n    .center{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:24px;text-align:center;background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,sans-serif}\n    .center h2{margin:0;font-size:18px}\n    .center p{margin:0;color:var(--muted)}\n  `,\n  render(d2) {\n    const s = d2.state\n    const esc = (v) => String(v == null ? '' : v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n    if (s.error === 'invalid_link') return `<div class=\"center\"><h2>Link inválido</h2><p>Este atendimento não existe ou não pertence ao seu usuário.</p></div>`\n    if (s.error === 'not_authenticated') return `<div class=\"center\"><h2>Entre para continuar</h2><p>Faça login com o seu e-mail corporativo para abrir o atendimento.</p></div>`\n    if (s.error === 'no_token') return `<div class=\"center\"><h2>Link incompleto</h2><p>Abra o atendimento pelo link enviado pelo assistente no Gemini.</p></div>`\n    if (!s.loaded) return `<div class=\"center\"><p>Carregando o atendimento…</p></div>`\n    const t = s.transfer || {}\n    const labels = { queued: 'Na fila', in_service: 'Em atendimento', closed: 'Encerrado', cancelled: 'Você saiu da fila', expired: 'Encerrado sem atendimento', transferred: 'Transferido', rejected: 'Não iniciado' }\n    const isOpen = t.status === 'queued' || t.status === 'in_service'\n    const detail = t.status === 'queued'\n      ? `Você é o ${esc(t.position)}º da fila`\n      : (t.agent_name ? `Atendente: ${esc(t.agent_name)}` : '')\n    const msgs = (s.messages || []).map((m, i) => {\n      const who = m.sender === 'EMPLOYEE' ? 'Você' : (m.sender === 'AGENT' ? esc(m.author_name || t.agent_name || 'Atendente') : '')\n      return `<div class=\"msg ${esc(m.sender)}\" data-key=\"${esc(m.id || 'm' + i)}\">${who ? `<span class=\"who\">${who}</span>` : ''}${esc(m.text)}</div>`\n    }).join('')\n    const pend = (s.pending || []).map((p) => `<div class=\"msg EMPLOYEE pending\" data-key=\"${esc(p.client_id)}\"><span class=\"who\">Você · enviando</span>${esc(p.text)}</div>`).join('')\n    const bottom = isOpen\n      ? `<div class=\"bar\"><textarea class=\"in\" id=\"tb_emp_input\" placeholder=\"Escreva sua mensagem\" ${s.sending ? 'disabled' : ''}></textarea><button class=\"btn send\" ${s.sending ? 'disabled' : ''}>Enviar</button><button class=\"btn ghost leave\">${t.status === 'queued' ? 'Sair da fila' : 'Encerrar'}</button></div>`\n      : `<div class=\"ended\">${esc(labels[t.status] || 'Atendimento encerrado')}. Se precisar de algo mais, é só falar com o assistente no Gemini.</div>`\n    const demoText = s.demoDb ? 'Modo demonstração · gravando nas tabelas com env DEMO' : 'Modo demonstração · nada é gravado no servidor'\n    const demoBar = s.demo ? `<div class=\"demo\"><span>${demoText} · abra o painel do atendente em outra aba${s.demoDb && s.mirrorError ? ` · <b>erro ao gravar: ${esc(s.mirrorError)}</b>` : ''}</span><button class=\"restart\">Reiniciar</button></div>` : ''\n    return `<div class=\"app\">${demoBar}\n      <div class=\"top\"><div><h1>Atendimento</h1><div class=\"meta\">Protocolo ${esc(t.protocol || '—')}${detail ? ' · ' + detail : ''}</div></div><span class=\"pill ${esc(t.status)}\">${esc(labels[t.status] || t.status || '')}</span></div>\n      <div class=\"log\">${msgs}${pend}</div>\n      ${bottom}\n    </div>`\n  },\n  mounted(d2) {\n    const demo = d2.param('demo') === true || d2.param('demo') === 'true'\n    const demoDb = demo && (d2.param('demo_db') === true || d2.param('demo_db') === 'true')\n    const fromPath = () => {\n      try { const parts = (window.location.pathname || '').split('/').filter(Boolean); return parts[parts.length - 1] || '' } catch (e) { return '' }\n    }\n    const token = demo ? 'demo' : (d2.param('token') || fromPath())\n    d2.setState({ demo, demoDb, loaded: false, error: null, transfer: null, messages: [], pending: [], sending: false, stick: true })\n    if (!token || token.length < 4) { d2.setState({ loaded: true, error: 'no_token' }); return }\n    let mirrorBusy = false\n    let mirrorAgain = false\n    const queueMirror = async () => {\n      if (mirrorBusy) { mirrorAgain = true; return }\n      mirrorBusy = true\n      try { do { mirrorAgain = false; await demoMirror(d2, 'employee') } while (mirrorAgain) } catch (e) { d2.log('tb_employee_chat mirror', e && e.message) } finally { mirrorBusy = false }\n    }\n    const subscribed = {}\n    let sk = null\n    if (!demo) { try { sk = d2.socket('socket') } catch (e) { sk = null } }\n    const subscribe = (t) => {\n      if (!sk || !t || !t.env) return\n      const rooms = [`tb_${t.env}_transfer_${token}`]\n      if (t.status === 'queued' && t.queue_code) rooms.push(`tb_${t.env}_queue_${t.queue_code}`)\n      rooms.forEach((r) => { if (!subscribed[r]) { subscribed[r] = true; try { sk.subscribe(r) } catch (e) {} } })\n    }\n    const apply = (r) => {\n      if (!r || r.ok === false) { d2.setState({ loaded: true, error: (r && r.error) || 'unknown' }); return }\n      const msgs = r.messages || []\n      const pending = (d2.state.pending || []).filter((p) => !msgs.some((m) => m.client_id === p.client_id))\n      d2.setState({ loaded: true, error: null, transfer: r.transfer, messages: msgs, pending, stick: true })\n      subscribe(r.transfer)\n    }\n    const call = async (payload) => {\n      try {\n        const body = Object.assign({ token }, payload)\n        const r = demo ? await demoEmployee(body) : await d2.rush('rush').invoke(body)\n        apply(r)\n        if (demoDb) {\n          queueMirror()\n        }\n        return r\n      } catch (e) { d2.log('tb_employee_chat', e && e.message); return null }\n    }\n    const load = () => call({ action: 'load' })\n    const send = async () => {\n      const el = d2.$('#tb_emp_input'); const text = ((el && el.value) || '').trim()\n      if (!text || d2.state.sending) return\n      const clientId = 'c' + Date.now().toString(36) + Math.random().toString(36).slice(2, 8)\n      el.value = ''\n      d2.setState({ sending: true, pending: [...(d2.state.pending || []), { client_id: clientId, text }] })\n      await call({ action: 'send', text, client_id: clientId })\n      d2.setState({ sending: false })\n      const el2 = d2.$('#tb_emp_input'); if (el2) el2.focus()\n    }\n    if (demo) {\n      let bcOk = false\n      try { const bc = new BroadcastChannel('tb_demo'); bc.onmessage = () => load(); d2.onUnmount(() => bc.close()); bcOk = true } catch (e) {}\n      if (!bcOk) d2.on(window, 'storage', (e) => { if (e.key === DEMO_KEY) load() })\n    } else if (sk) { try { sk.onMessage(() => { load() }) } catch (e) {} }\n    const timer = setInterval(load, demo ? 15000 : 60000)\n    d2.onUnmount(() => clearInterval(timer))\n    d2.on('.send', 'click', send)\n    d2.on('.in', 'keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send() } })\n    d2.on('.leave', 'click', async () => {\n      const ok = await d2.dialog.confirm('Quer mesmo encerrar este atendimento?')\n      if (ok) call({ action: 'leave' })\n    })\n    d2.on('.restart', 'click', () => call({ action: 'restart' }))\n    load()\n  },\n  updated(d2) {\n    if (d2.state.stick) { const log = d2.$('.log'); if (log) log.scrollTop = log.scrollHeight }\n  },\n}"}},"rush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rush"}}}},"socket":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"socket"}}}},"token":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"token"}}}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"demo_db":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo_db"}}}},"transfers_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"transfers_ds"}}}},"messages_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages_ds"}}}},"events_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"events_ds"}}}}}}}}}},{"_id":"6ab9bd923fcf311eb0951d9b","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"tb_agent_panel","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const DEMO_KEY = 'tb_demo_state_v1'\nconst demoNow = () => new Date().toISOString()\nconst demoHex = (n) => { let s = ''; for (let i = 0; i < n; i++) s += '0123456789ABCDEF'[Math.floor(Math.random() * 16)]; return s }\nconst demoFresh = () => ({\n  transfer: { id: 'demo_tr_' + Date.now(), status: 'queued', protocol: demoHex(32), queue_code: 'csc', env: 'DEMO', employee_name: 'Colaborador demo', employee_email: 'colaborador.demo@natura.net', queued_at: demoNow(), agent_name: '' },\n  messages: [{ id: 'm' + Date.now(), origin: 'employee', sender: 'SYSTEM', text: 'Você entrou na fila de atendimento. Assim que um atendente estiver disponível, ele fala com você por aqui.', created_at: demoNow() }],\n  agent: { id: 'demo_agent', name: 'Atendente demo', status: 'offline' },\n  bot_history: [\n    { sender: 'HUMAN', text: 'Quero falar com uma pessoa sobre as minhas férias.' },\n    { sender: 'ASSISTANT', text: 'Encaminhei seu pedido para o nosso time de atendimento. Enquanto isso, pode continuar falando comigo por aqui.' },\n  ],\n})\nconst demoRead = () => { try { return JSON.parse(localStorage.getItem(DEMO_KEY) || 'null') } catch (e) { return null } }\nconst demoWrite = (st) => {\n  try { localStorage.setItem(DEMO_KEY, JSON.stringify(st)) } catch (e) {}\n  try { const bc = new BroadcastChannel('tb_demo'); bc.postMessage('changed'); bc.close() } catch (e) {}\n}\nconst demoState = () => { const s = demoRead(); if (s) return s; const f = demoFresh(); demoWrite(f); return f }\nconst sleep = (ms) => new Promise((r) => setTimeout(r, ms))\nconst demoMirror = async (d2, role) => {\n  const errs = []\n  const msgOf = (e) => (e && (e.message || e.error || (typeof e === 'string' ? e : JSON.stringify(e)))) || 'erro'\n  const step = async (label, fn) => { try { return await fn() } catch (e) { errs.push(label + ': ' + msgOf(e)); return undefined } }\n  const run = async () => {\n    const trDs = d2.data('transfers_ds'); const msgDs = d2.data('messages_ds'); const evDs = d2.data('events_ds')\n    if (!trDs || !msgDs || !trDs.raw || !msgDs.raw) { errs.push('datasets nao ligados'); return }\n    const rows = (r) => (Array.isArray(r) ? r : (r && r.data) || [])\n    const stamp = (r) => (r && r.createdAt ? new Date(r.createdAt).getTime() : Number.MAX_SAFE_INTEGER)\n    const st = demoState(); const t = st.transfer\n    const findTransfer = () => step('buscar transferencia', async () => rows(await trDs.raw.find({ token: t.id, env: 'DEMO', $limit: 20 })).filter((r) => r.token === t.id).sort((a, b) => stamp(a) - stamp(b))[0])\n    const owner = (t.status === 'queued' || t.status === 'cancelled' || t.reason === 'closed_by_employee') ? 'employee' : 'agent'\n    const closed = t.status === 'closed' || t.status === 'cancelled'\n    const build = () => {\n      const rec = { chat_id: 'demo_' + t.id, env: 'DEMO', origin: 'demo', protocol: t.protocol, token: t.id, employee_email: t.employee_email, employee_name: t.employee_name, queue_code: t.queue_code, status: t.status, reason: t.reason || '', agent_id: t.agent_name ? st.agent.id : '', agent_name: t.agent_name || '', subject: t.subject || '', ticket_opened: !!t.ticket_opened, queued_at: t.queued_at }\n      if (t.assigned_at) rec.assigned_at = t.assigned_at\n      if (closed) rec.closed_at = demoNow()\n      return rec\n    }\n    const saveEvent = (id, from) => step('gravar evento', async () => { if (evDs && evDs.raw) await evDs.raw.saveRecord({ transfer_id: id, env: 'DEMO', type: 'demo_status', from_status: from || '', to_status: t.status, actor: role }) })\n    let rec = await findTransfer()\n    if (!rec) {\n      if (role !== 'employee') { errs.push('transferencia ainda nao esta na tabela'); return }\n      await step('criar transferencia', () => trDs.raw.saveRecord(build()))\n      rec = await findTransfer()\n      if (!rec) return\n      await saveEvent(String(rec._id), '')\n    } else if (owner === role && (rec.status !== t.status || (rec.subject || '') !== (t.subject || ''))) {\n      const upd = () => trDs.raw.saveRecord(Object.assign(build(), { _id: rec._id }))\n      let ok = true\n      try { await upd() } catch (e1) {\n        try { await trDs.raw.filter({ token: t.id, env: 'DEMO' }, true, true) } catch (e) {}\n        ok = (await step('atualizar transferencia', async () => { await upd(); return true })) === true\n      }\n      if (ok && rec.status !== t.status) await saveEvent(String(rec._id), rec.status)\n    }\n    const id = String(rec._id)\n    const saved = (await step('buscar mensagens', async () => rows(await msgDs.raw.find({ transfer_id: id, env: 'DEMO', $limit: 500 })).filter((m) => String(m.transfer_id) === id))) || null\n    if (!saved) return\n    const have = new Set(saved.map((m) => m.client_id))\n    for (const m of st.messages) {\n      const key = m.client_id || m.id\n      if (m.origin !== role || have.has(key)) continue\n      const done = await step('gravar mensagem', async () => { await msgDs.raw.saveRecord({ transfer_id: id, chat_id: 'demo_' + t.id, env: 'DEMO', sender: m.sender, author_id: m.sender === 'AGENT' ? st.agent.id : '', author_name: m.author_name || '', type: 'text', text: m.text, client_id: key }); return true })\n      if (done) have.add(key)\n    }\n  }\n  try {\n    if (typeof navigator !== 'undefined' && navigator.locks && navigator.locks.request) await navigator.locks.request('tb_demo_mirror', run)\n    else await run()\n  } catch (e) { errs.push(msgOf(e)) }\n  if (errs.length) d2.log('demo mirror', errs.join(' | '))\n  if ((d2.state.mirrorError || '') !== errs.join(' | ')) d2.state.mirrorError = errs.join(' | ')\n}\nconst demoAgent = async (p) => {\n  if (p.action === 'restart') demoWrite(demoFresh())\n  let st = demoState()\n  if (p.action === 'status' && ['online', 'paused', 'offline'].includes(p.status)) { st.agent.status = p.status; demoWrite(st) }\n  st = demoState()\n  if (st.agent.status === 'online' && st.transfer.status === 'queued') {\n    await sleep(500)\n    st = demoState()\n    if (st.agent.status === 'online' && st.transfer.status === 'queued') {\n      st.transfer.status = 'in_service'; st.transfer.agent_name = st.agent.name; st.transfer.assigned_at = demoNow()\n      st.messages.push({ id: 'm' + Date.now(), origin: 'agent', sender: 'SYSTEM', text: `${st.agent.name} entrou no atendimento.`, created_at: demoNow() })\n      st.messages.push({ id: 'm' + (Date.now() + 1), origin: 'agent', sender: 'AGENT', author_name: st.agent.name, text: 'Olá! Sou do time de atendimento e vou te ajudar a partir daqui.', created_at: demoNow() })\n      demoWrite(st)\n    }\n  }\n  st = demoState()\n  const t = st.transfer\n  const inService = t.status === 'in_service'\n  if (p.action === 'send' && inService && p.text && p.transfer_id === t.id) {\n    await sleep(350)\n    const s2 = demoState()\n    if (!s2.messages.some((m) => m.client_id === p.client_id)) s2.messages.push({ id: 'm' + Date.now(), origin: 'agent', sender: 'AGENT', author_name: s2.agent.name, text: p.text, client_id: p.client_id, created_at: demoNow() })\n    s2.transfer.last_agent_message_at = demoNow()\n    demoWrite(s2)\n  }\n  if (p.action === 'close' && inService && p.transfer_id === t.id) {\n    const s2 = demoState()\n    s2.transfer.status = 'closed'; s2.transfer.reason = 'closed_by_agent'; s2.transfer.subject = p.subject || ''; s2.transfer.ticket_opened = !!p.ticket_opened\n    s2.messages.push({ id: 'm' + Date.now(), origin: 'agent', sender: 'SYSTEM', text: 'O atendente encerrou o atendimento. Se precisar de algo mais, é só falar com o assistente no Gemini.', created_at: demoNow() })\n    demoWrite(s2)\n  }\n  const cur = demoState()\n  const ct = cur.transfer\n  const mine = ct.status === 'in_service' ? [{ id: ct.id, protocol: ct.protocol, employee_name: ct.employee_name, employee_email: ct.employee_email, queue_code: ct.queue_code, assigned_at: ct.assigned_at }] : []\n  const wantsConv = (p.action === 'conversation' || p.action === 'send') && p.transfer_id === ct.id\n  const conversation = wantsConv ? Object.assign({}, ct, { messages: cur.messages, bot_history: cur.bot_history }) : null\n  return { ok: true, action: p.action, me: { id: cur.agent.id, name: cur.agent.name, status: cur.agent.status, active_chats: mine.length }, mine, queued_count: ct.status === 'queued' ? 1 : 0, colleagues_online: [], conversation }\n}\n\nexport default {\n  css: `\n    :host{--bg:#f4f6f8;--card:#ffffff;--ink:#18212d;--muted:#5b6778;--line:#d9e0e7;--accent:#1c6a86;--soft:#e1eef3;--warn:#9a5a12;--ok:#2c7a4b;--bad:#a3322b}\n    .app{height:100%;display:grid;grid-template-columns:300px minmax(0,1fr);grid-template-rows:auto auto minmax(0,1fr);background:var(--bg);color:var(--ink);font:14px/1.5 system-ui,-apple-system,\"Segoe UI\",sans-serif}\n    .demo{grid-column:1/-1;display:flex;gap:10px;align-items:center;justify-content:space-between;padding:6px 18px;background:#fbf0e1;color:var(--warn);font-size:12px}\n    .demo button{border:1px solid currentColor;background:transparent;color:inherit;border-radius:999px;padding:2px 10px;font:inherit;cursor:pointer}\n    .top{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;justify-content:space-between;padding:12px 18px;background:var(--card);border-bottom:1px solid var(--line)}\n    .top h1{margin:0;font-size:16px}\n    .status{display:flex;gap:6px}\n    .st{padding:6px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);font:inherit;cursor:pointer}\n    .st.on{background:var(--accent);border-color:var(--accent);color:#fff}\n    .meta{font-size:13px;color:var(--muted)}\n    .side{border-right:1px solid var(--line);background:var(--card);overflow:auto}\n    .side h2{margin:0;padding:12px 16px;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}\n    .item{display:block;width:100%;text-align:left;padding:10px 16px;border:0;border-top:1px solid var(--line);background:transparent;font:inherit;cursor:pointer}\n    .item.sel{background:var(--soft)}\n    .item b{display:block}\n    .item span{font-size:12px;color:var(--muted)}\n    .empty{padding:16px;color:var(--muted)}\n    .main{display:flex;flex-direction:column;min-height:0}\n    .head{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;justify-content:space-between;padding:12px 18px;background:var(--card);border-bottom:1px solid var(--line)}\n    .log{flex:1;overflow:auto;padding:16px 18px;display:flex;flex-direction:column;gap:8px}\n    .msg{max-width:78%;padding:9px 12px;border-radius:12px;white-space:pre-wrap;word-break:break-word}\n    .msg .who{display:block;font-size:11px;color:var(--muted);margin-bottom:2px}\n    .msg.AGENT{align-self:flex-end;background:var(--accent);color:#fff}\n    .msg.AGENT .who{color:#d6e9f0}\n    .msg.EMPLOYEE{align-self:flex-start;background:var(--card);border:1px solid var(--line)}\n    .msg.SYSTEM{align-self:center;color:#8a95a5;font-size:13px;text-align:center;max-width:90%}\n    .msg.pending{opacity:.6}\n    details.bot{margin:10px 18px 0;padding:8px 12px;background:var(--card);border:1px solid var(--line);border-radius:10px}\n    details.bot summary{cursor:pointer;color:var(--muted);font-size:13px}\n    .botlog{max-height:220px;overflow:auto;display:flex;flex-direction:column;gap:6px;margin-top:8px}\n    .bl{font-size:13px;white-space:pre-wrap}\n    .bl b{color:var(--muted);font-weight:600}\n    .bar{display:flex;gap:8px;padding:12px 18px;background:var(--card);border-top:1px solid var(--line)}\n    .in{flex:1;min-height:42px;max-height:140px;resize:vertical;padding:10px;border:1px solid var(--line);border-radius:10px;font:inherit}\n    .btn{padding:0 14px;min-height:38px;border:0;border-radius:10px;background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}\n    .btn.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}\n    .btn.danger{background:var(--bad)}\n    .btn[disabled]{opacity:.5;cursor:default}\n    .actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px 18px;background:var(--bg);border-top:1px solid var(--line)}\n    .actions input[type=text],.actions select{min-height:36px;padding:0 10px;border:1px solid var(--line);border-radius:8px;font:inherit;background:var(--card)}\n    .actions label{display:flex;gap:6px;align-items:center;font-size:13px}\n    .center{flex:1;display:flex;align-items:center;justify-content:center;color:var(--muted);padding:24px;text-align:center}\n    .alert{grid-column:1/-1;padding:10px 18px;background:#f9e6e4;color:var(--bad)}\n  `,\n  render(d2) {\n    const s = d2.state\n    const esc = (v) => String(v == null ? '' : v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n    if (s.error === 'not_authenticated') return `<div class=\"app\"><div class=\"center\" style=\"grid-column:1/-1;grid-row:1/-1\">Entre no AI Portal para atender.</div></div>`\n    const me = s.me || {}\n    const statuses = [['online', 'Online'], ['paused', 'Pausa'], ['offline', 'Offline']]\n    const statusBtns = statuses.map(([k, l]) => `<button class=\"st ${me.status === k ? 'on' : ''}\" data-status=\"${k}\">${l}</button>`).join('')\n    const list = (s.mine || []).length\n      ? (s.mine || []).map((c) => `<button class=\"item ${s.selectedId === String(c.id) ? 'sel' : ''}\" data-id=\"${esc(c.id)}\" data-key=\"${esc(c.id)}\"><b>${esc(c.employee_name || c.employee_email || 'Colaborador')}</b><span>${esc((c.queue_code || '').toUpperCase())} · ${esc(c.protocol || '')}</span></button>`).join('')\n      : `<div class=\"empty\">Nenhuma conversa com você agora.${me.status !== 'online' ? ' Fique online para receber.' : ''}</div>`\n    const conv = s.conversation\n    let main = `<div class=\"center\">${(s.mine || []).length ? 'Selecione uma conversa.' : 'Aguardando conversas.'}</div>`\n    if (conv) {\n      const msgs = (conv.messages || []).map((m, i) => {\n        const who = m.sender === 'AGENT' ? esc(m.author_name || 'Você') : (m.sender === 'EMPLOYEE' ? esc(conv.employee_name || 'Colaborador') : '')\n        return `<div class=\"msg ${esc(m.sender)}\" data-key=\"${esc(m.id || 'm' + i)}\">${who ? `<span class=\"who\">${who}</span>` : ''}${esc(m.text)}</div>`\n      }).join('')\n      const pend = (s.pending || []).filter((p) => p.transfer_id === String(conv.id)).map((p) => `<div class=\"msg AGENT pending\" data-key=\"${esc(p.client_id)}\"><span class=\"who\">Você · enviando</span>${esc(p.text)}</div>`).join('')\n      const bot = (conv.bot_history || []).filter((b) => b.text).map((b) => `<div class=\"bl\"><b>${b.sender === 'HUMAN' ? 'Colaborador' : 'Assistente'}:</b> ${esc(b.text)}</div>`).join('')\n      const colleagues = (s.colleagues || []).map((c) => `<option value=\"${esc(c.id)}\">${esc(c.name || c.id)} (${esc(c.active_chats || 0)})</option>`).join('')\n      const inService = conv.status === 'in_service'\n      main = `\n        <div class=\"head\"><div><b>${esc(conv.employee_name || conv.employee_email || 'Colaborador')}</b><div class=\"meta\">${esc(conv.employee_email || '')} · ${esc((conv.queue_code || '').toUpperCase())} · protocolo ${esc(conv.protocol || '')}</div></div></div>\n        ${bot ? `<details class=\"bot\"><summary>Conversa com o assistente antes do atendimento</summary><div class=\"botlog\">${bot}</div></details>` : ''}\n        <div class=\"log\">${msgs}${pend}</div>\n        ${inService ? `<div class=\"bar\"><textarea class=\"in\" id=\"tb_agent_input\" placeholder=\"Responder ao colaborador\" ${s.sending ? 'disabled' : ''}></textarea><button class=\"btn send\" ${s.sending ? 'disabled' : ''}>Enviar</button></div>\n        <div class=\"actions\">\n          <input type=\"text\" id=\"tb_agent_subject\" placeholder=\"Tema do atendimento\" value=\"${esc(s.subject || conv.subject || '')}\" />\n          <label><input type=\"checkbox\" id=\"tb_agent_ticket\" ${s.ticket ? 'checked' : ''}/> Chamado aberto</label>\n          <button class=\"btn danger close\">Encerrar</button>\n          ${colleagues ? `<select id=\"tb_agent_target\"><option value=\"\">Transferir para…</option>${colleagues}</select><button class=\"btn ghost transfer\">Transferir</button>` : ''}\n        </div>` : `<div class=\"actions\"><span class=\"meta\">Conversa encerrada.</span></div>`}`\n    }\n    const demoText = s.demoDb ? 'Modo demonstração · gravando nas tabelas com env DEMO' : 'Modo demonstração · nada é gravado no servidor'\n    const demoBar = s.demo ? `<div class=\"demo\"><span>${demoText} · abra a tela do colaborador em outra aba${s.demoDb && s.mirrorError ? ` · <b>erro ao gravar: ${esc(s.mirrorError)}</b>` : ''}</span><button class=\"restart\">Reiniciar</button></div>` : ''\n    return `<div class=\"app\">${demoBar}\n      <div class=\"top\"><div><h1>Atendimento</h1><div class=\"meta\">${esc(me.name || '')} · ${esc(s.queued || 0)} na fila · ${esc(me.active_chats || 0)} em atendimento</div></div><div class=\"status\">${statusBtns}</div></div>\n      ${s.error && s.error !== 'not_authenticated' ? `<div class=\"alert\">Erro: ${esc(s.error)}</div>` : ''}\n      <div class=\"side\"><h2>Minhas conversas</h2>${list}</div>\n      <div class=\"main\">${main}</div>\n    </div>`\n  },\n  mounted(d2) {\n    const demo = d2.param('demo') === true || d2.param('demo') === 'true'\n    const env = d2.param('env') || 'HML'\n    const demoDb = demo && (d2.param('demo_db') === true || d2.param('demo_db') === 'true')\n    d2.setState({ demo, demoDb, me: null, mine: [], queued: 0, colleagues: [], selectedId: null, conversation: null, pending: [], sending: false, subject: '', ticket: false, error: null, stick: true })\n    let mirrorBusy = false\n    let mirrorAgain = false\n    const queueMirror = async () => {\n      if (mirrorBusy) { mirrorAgain = true; return }\n      mirrorBusy = true\n      try { do { mirrorAgain = false; await demoMirror(d2, 'agent') } while (mirrorAgain) } catch (e) { d2.log('tb_agent_panel mirror', e && e.message) } finally { mirrorBusy = false }\n    }\n    const subscribed = {}\n    let sk = null\n    if (!demo) { try { sk = d2.socket('socket') } catch (e) { sk = null } }\n    const subscribe = (me) => {\n      if (!sk || !me || !me.id) return\n      ;[`tb_${env}_agent_${me.id}`, `tb_${env}_supervision`].forEach((r) => { if (!subscribed[r]) { subscribed[r] = true; try { sk.subscribe(r) } catch (e) {} } })\n    }\n    const call = async (payload) => {\n      try {\n        const body = Object.assign({ env }, payload)\n        const r = demo ? await demoAgent(body) : await d2.rush('rush').invoke(body)\n        if (demoDb) queueMirror()\n        if (!r || r.ok === false) { d2.setState({ error: (r && r.error) || 'unknown' }); return null }\n        const upd = { error: null, me: r.me, mine: r.mine || [], queued: r.queued_count || 0, colleagues: r.colleagues_online || [] }\n        if (r.conversation) {\n          const msgs = r.conversation.messages || []\n          upd.conversation = r.conversation\n          upd.pending = (d2.state.pending || []).filter((p) => !msgs.some((m) => m.client_id === p.client_id))\n          upd.stick = true\n        }\n        if (!d2.state.selectedId && (r.mine || []).length === 1) upd.selectedId = String(r.mine[0].id)\n        d2.setState(upd)\n        subscribe(r.me)\n        return r\n      } catch (e) { d2.log('tb_agent_panel', e && e.message); return null }\n    }\n    const refresh = async () => {\n      await call({ action: 'panel' })\n      if (d2.state.selectedId) await call({ action: 'conversation', transfer_id: d2.state.selectedId })\n    }\n    const send = async () => {\n      const el = d2.$('#tb_agent_input'); const text = ((el && el.value) || '').trim()\n      const id = d2.state.selectedId\n      if (!text || !id || d2.state.sending) return\n      const clientId = 'a' + Date.now().toString(36) + Math.random().toString(36).slice(2, 8)\n      el.value = ''\n      d2.setState({ sending: true, pending: [...(d2.state.pending || []), { client_id: clientId, text, transfer_id: id }] })\n      await call({ action: 'send', transfer_id: id, text, client_id: clientId })\n      await call({ action: 'conversation', transfer_id: id })\n      d2.setState({ sending: false })\n      const el2 = d2.$('#tb_agent_input'); if (el2) el2.focus()\n    }\n    if (demo) {\n      let bcOk = false\n      try { const bc = new BroadcastChannel('tb_demo'); bc.onmessage = () => refresh(); d2.onUnmount(() => bc.close()); bcOk = true } catch (e) {}\n      if (!bcOk) d2.on(window, 'storage', (e) => { if (e.key === DEMO_KEY) refresh() })\n    } else if (sk) { try { sk.onMessage(() => { refresh() }) } catch (e) {} }\n    const timer = setInterval(async () => { await call({ action: 'heartbeat' }); if (d2.state.selectedId) await call({ action: 'conversation', transfer_id: d2.state.selectedId }) }, demo ? 15000 : 60000)\n    d2.onUnmount(() => clearInterval(timer))\n    d2.on('.st', 'click', async (e, el) => { await call({ action: 'status', status: el.dataset.status }); refresh() })\n    d2.on('.item', 'click', (e, el) => { d2.setState({ selectedId: el.dataset.id, conversation: null, subject: '', ticket: false }); call({ action: 'conversation', transfer_id: el.dataset.id }) })\n    d2.on('.send', 'click', send)\n    d2.on('.in', 'keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send() } })\n    d2.on('#tb_agent_subject', 'input', (e, el) => { d2.state.subject = el.value })\n    d2.on('#tb_agent_ticket', 'change', (e, el) => { d2.state.ticket = !!el.checked })\n    d2.on('.close', 'click', async () => {\n      const id = d2.state.selectedId; if (!id) return\n      const ok = await d2.dialog.confirm('Encerrar este atendimento?')\n      if (!ok) return\n      await call({ action: 'close', transfer_id: id, subject: d2.state.subject, ticket_opened: !!d2.state.ticket })\n      await call({ action: 'conversation', transfer_id: id })\n      refresh()\n    })\n    d2.on('.transfer', 'click', async () => {\n      const id = d2.state.selectedId; const sel = d2.$('#tb_agent_target'); const target = sel && sel.value\n      if (!id || !target) return\n      const ok = await d2.dialog.confirm('Transferir esta conversa?')\n      if (!ok) return\n      await call({ action: 'transfer', transfer_id: id, target_agent_id: target })\n      d2.setState({ selectedId: null, conversation: null })\n      refresh()\n    })\n    d2.on('.restart', 'click', async () => { d2.setState({ selectedId: null, conversation: null, pending: [] }); await call({ action: 'restart' }); refresh() })\n    refresh()\n  },\n  updated(d2) {\n    if (d2.state.stick) { const log = d2.$('.log'); if (log) log.scrollTop = log.scrollHeight; d2.state.stick = false }\n  },\n}"}},"rush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rush"}}}},"socket":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"socket"}}}},"env":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"env"}}}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"demo_db":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo_db"}}}},"transfers_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"transfers_ds"}}}},"messages_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages_ds"}}}},"events_ds":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"events_ds"}}}}}}}}}},{"_id":"6ab9cd03e69f22645a57a85d","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"tb_gemini_sim","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const simId = () => {\n  try { if (crypto && crypto.randomUUID) return crypto.randomUUID() } catch (e) {}\n  return 'x' + Date.now().toString(16) + Math.random().toString(16).slice(2)\n}\nconst clock = (ms) => {\n  if (!ms) return '—'\n  const d = new Date(ms)\n  const p = (n, s) => String(n).padStart(s || 2, '0')\n  return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${p(d.getMilliseconds(), 3)}`\n}\nconst secs = (ms) => (ms == null ? '—' : (ms / 1000).toFixed(1) + ' s')\n\nexport default {\n  css: `\n    :host{--bg:#f4f6f8;--card:#ffffff;--ink:#18212d;--muted:#5b6778;--line:#d9e0e7;--accent:#1c6a86;--ok:#2c7a4b;--okbg:#e3f2e8;--bad:#a3322b;--badbg:#f9e6e4;--warn:#9a5a12;--warnbg:#fbf0e1}\n    .app{height:100%;display:grid;grid-template-columns:minmax(0,1fr) 420px;background:var(--bg);color:var(--ink);font:14px/1.5 system-ui,-apple-system,\"Segoe UI\",sans-serif}\n    .chat{display:flex;flex-direction:column;min-height:0;border-right:1px solid var(--line)}\n    .top{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;padding:12px 18px;background:var(--card);border-bottom:1px solid var(--line)}\n    .top h1{margin:0 12px 0 0;font-size:16px}\n    .tok{flex:1;min-width:220px;display:flex;gap:6px;align-items:center}\n    .tok input{flex:1;min-height:34px;padding:0 10px;border:1px solid var(--line);border-radius:8px;font:inherit}\n    .pill{display:inline-block;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}\n    .pill.ok{background:var(--okbg);color:var(--ok)}\n    .pill.bad{background:var(--badbg);color:var(--bad)}\n    .pill.warn{background:var(--warnbg);color:var(--warn)}\n    .meta{font-size:12px;color:var(--muted)}\n    .btn{padding:0 14px;min-height:34px;border:0;border-radius:8px;background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}\n    .btn.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}\n    .btn[disabled]{opacity:.5;cursor:default}\n    .log{flex:1;overflow:auto;padding:16px 18px;display:flex;flex-direction:column;gap:10px}\n    .msg{max-width:80%;padding:10px 12px;border-radius:12px;white-space:pre-wrap;word-break:break-word}\n    .msg .who{display:block;font-size:11px;color:var(--muted);margin-bottom:2px}\n    .msg.user{align-self:flex-end;background:var(--accent);color:#fff}\n    .msg.user .who{color:#d6e9f0}\n    .msg.bot{align-self:flex-start;background:var(--card);border:1px solid var(--line)}\n    .msg.bot a{color:var(--accent)}\n    .msg.err{align-self:flex-start;background:var(--badbg);color:var(--bad)}\n    .msg.wait{align-self:flex-start;color:var(--muted);font-style:italic;background:transparent}\n    .empty{margin:auto;text-align:center;color:var(--muted);max-width:420px}\n    .bar{display:flex;gap:8px;padding:12px 18px;background:var(--card);border-top:1px solid var(--line)}\n    .in{flex:1;min-height:42px;max-height:140px;resize:vertical;padding:10px;border:1px solid var(--line);border-radius:10px;font:inherit}\n    .side{display:flex;flex-direction:column;min-height:0;background:var(--card)}\n    .side h2{margin:0;padding:12px 16px;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--line)}\n    .scroll{flex:1;overflow:auto}\n    .sec{padding:12px 16px;border-bottom:1px solid var(--line)}\n    .kv{display:grid;grid-template-columns:130px minmax(0,1fr);gap:3px 10px;font-size:13px}\n    .kv dt{color:var(--muted)}\n    .kv dd{margin:0;word-break:break-word}\n    .turn{padding:12px 16px;border-bottom:1px solid var(--line)}\n    .turn .head{display:flex;justify-content:space-between;gap:8px;align-items:center;margin-bottom:6px}\n    .turn .q{font-size:13px;color:var(--muted);margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n    .big{font-size:20px;font-weight:700}\n    details{margin-top:6px}\n    summary{cursor:pointer;color:var(--muted);font-size:12px}\n    pre{margin:6px 0 0;max-height:240px;overflow:auto;background:var(--bg);padding:8px;border-radius:8px;font-size:11px;white-space:pre-wrap;word-break:break-word}\n  `,\n  render(d2) {\n    const s = d2.state\n    const esc = (v) => String(v == null ? '' : v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n    const md = (t) => esc(t).replace(/\\[([^\\]]+)\\]\\((https?:[^)\\s]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener\">$1</a>').replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>')\n    const msgs = (s.messages || []).map((m) => {\n      if (m.role === 'user') return `<div class=\"msg user\" data-key=\"${esc(m.id)}\"><span class=\"who\">Você · ${esc(clock(m.at))}</span>${esc(m.text)}</div>`\n      if (m.role === 'error') return `<div class=\"msg err\" data-key=\"${esc(m.id)}\"><span class=\"who\">Erro · ${esc(clock(m.at))}</span>${esc(m.text)}</div>`\n      return `<div class=\"msg bot\" data-key=\"${esc(m.id)}\"><span class=\"who\">Bot · ${esc(clock(m.at))}</span>${md(m.text)}</div>`\n    }).join('')\n    const waiting = s.sending ? `<div class=\"msg wait\" data-key=\"wait\">Aguardando o bot… ${esc(secs(s.elapsed))}</div>` : ''\n    const empty = !msgs && !waiting ? `<div class=\"empty\">Cole o token do Google no campo acima e mande uma mensagem. Ela entra pela ponte DEV, igual ao Gemini, e segue o fluxo do bot com os dados de HML.</div>` : ''\n    const sess = s.session\n    const sessHtml = sess && sess.found ? `\n      <dl class=\"kv\">\n        <dt>chat_id</dt><dd>${esc(s.chatId)}</dd>\n        <dt>sessão</dt><dd>${esc(sess.session_id)}</dd>\n        <dt>status</dt><dd>${esc(sess.status)}</dd>\n        <dt>env</dt><dd>${esc(sess.env)}</dd>\n        <dt>colaborador</dt><dd>${esc(sess.employee_name)} (${esc(sess.employee_id)})</dd>\n        <dt>região / país</dt><dd>${esc(sess.region || '—')} / ${esc(sess.country || '—')}</dd>\n        <dt>empresa</dt><dd>${esc(sess.company || '—')}</dd>\n        <dt>local</dt><dd>${esc(sess.location || '—')}</dd>\n        <dt>nível</dt><dd>${esc(sess.management_level || '—')}</dd>\n        <dt>exception_key</dt><dd>${esc(sess.exception_key || '—')}</dd>\n        <dt>transbordo</dt><dd>${esc(String(!!sess.transbordo))}</dd>\n        <dt>mensagens</dt><dd>${esc((sess.messages || []).length)}</dd>\n      </dl>\n      <details><summary>chat_store</summary><pre>${esc(JSON.stringify(sess.chat_store || {}, null, 2))}</pre></details>` : `<div class=\"meta\">${s.chatId ? 'Sessão ainda não encontrada para ' + esc(s.chatId) : 'Nenhuma conversa ainda.'}</div>`\n    const turns = (s.turns || []).slice().reverse().map((t) => {\n      const cls = t.state === 'ok' ? 'ok' : (t.state === 'error' ? 'bad' : 'warn')\n      const label = t.state === 'ok' ? 'deu certo' : (t.state === 'error' ? 'erro' : (t.state === 'empty' ? 'resposta vazia' : 'aguardando'))\n      return `<div class=\"turn\" data-key=\"${esc(t.id)}\">\n        <div class=\"head\"><b>#${esc(t.n)}</b><span class=\"pill ${cls}\">${esc(label)}</span></div>\n        <div class=\"q\" title=\"${esc(t.text)}\">${esc(t.text)}</div>\n        <div class=\"big\">${esc(secs(t.end ? t.end - t.start : null))}</div>\n        <dl class=\"kv\">\n          <dt>use case</dt><dd>${esc(t.usecase || '—')}</dd>\n          <dt>início</dt><dd>${esc(clock(t.start))}</dd>\n          <dt>fim</dt><dd>${esc(clock(t.end))}</dd>\n          <dt>ponte DEV</dt><dd>${esc(t.bridgeMs != null ? secs(t.bridgeMs) + ' · ' + (t.bridgeResult || '') : '—')}</dd>\n          <dt>listener DEV</dt><dd>${esc(t.listenerMs != null ? secs(t.listenerMs) + ' · ' + (t.listenerResult || '') : '—')}</dd>\n          <dt>status sessão</dt><dd>${esc(t.status || '—')}</dd>\n          ${t.error ? `<dt>erro</dt><dd>${esc(t.error)}</dd>` : ''}\n        </dl>\n        <details><summary>resposta bruta</summary><pre>${esc(JSON.stringify(t.raw == null ? null : t.raw, null, 2))}</pre></details>\n      </div>`\n    }).join('')\n    return `<div class=\"app\">\n      <div class=\"chat\">\n        <div class=\"top\">\n          <h1>Simulador Gemini</h1>\n          <div class=\"tok\"><input id=\"tb_sim_token\" type=\"password\" autocomplete=\"off\" placeholder=\"${s.hasToken ? 'token definido — cole outro para trocar' : 'cole aqui o token do Google (sem o Bearer)'}\" /><span class=\"pill ${s.hasToken ? 'ok' : 'bad'}\">${s.hasToken ? 'token ok' : 'sem token'}</span></div>\n          <button class=\"btn ghost newchat\">Nova conversa</button>\n          <div class=\"meta\" style=\"width:100%\">chat_id ${esc(s.chatId || 'novo (a ponte gera no primeiro envio)')} · ponte DEV EPKun… → listener DEV → chatroomEntrypointDev</div>\n        </div>\n        <div class=\"log\">${msgs}${waiting}${empty}</div>\n        <div class=\"bar\"><textarea class=\"in\" id=\"tb_sim_input\" placeholder=\"Mensagem como se fosse no Gemini\" ${s.sending ? 'disabled' : ''}></textarea><button class=\"btn send\" ${s.sending || !s.hasToken ? 'disabled' : ''}>Enviar</button></div>\n      </div>\n      <div class=\"side\">\n        <h2>Debug</h2>\n        <div class=\"scroll\">\n          <div class=\"sec\">${sessHtml}</div>\n          ${turns || '<div class=\"sec meta\">Cada envio aparece aqui com use case, horários e tempo de resposta.</div>'}\n        </div>\n      </div>\n    </div>`\n  },\n  mounted(d2) {\n    let token = ''\n    d2.setState({ hasToken: false, chatId: '', messages: [], turns: [], session: null, sending: false, elapsed: 0, stick: true })\n    let tick = null\n    const stopTick = () => { if (tick) { clearInterval(tick); tick = null } }\n    d2.onUnmount(stopTick)\n    const debug = async (chatId) => {\n      if (!chatId) return null\n      try { const r = await d2.rush('debug').invoke({ chat_id: chatId }); d2.setState({ session: r }); return r } catch (e) { d2.log('tb_gemini_sim debug', e && e.message); return null }\n    }\n    const patchTurn = (id, upd) => { d2.setState({ turns: (d2.state.turns || []).map((t) => (t.id === id ? Object.assign({}, t, upd) : t)) }) }\n    const send = async () => {\n      const el = d2.$('#tb_sim_input'); const text = ((el && el.value) || '').trim()\n      if (!text || d2.state.sending || !token) return\n      el.value = ''\n      const turnId = simId()\n      const start = Date.now()\n      const n = (d2.state.turns || []).length + 1\n      d2.setState({\n        sending: true, elapsed: 0, stick: true,\n        messages: [...d2.state.messages, { id: 'u' + turnId, role: 'user', text, at: start }],\n        turns: [...d2.state.turns, { id: turnId, n, text, start, state: 'wait' }],\n      })\n      tick = setInterval(() => { d2.state.elapsed = Date.now() - start }, 250)\n      const message = { kind: 'message', messageId: simId(), parts: [{ kind: 'text', metadata: { is_user_input: true }, text }], role: 'user' }\n      if (d2.state.chatId) message.contextId = d2.state.chatId\n      const body = { id: simId(), jsonrpc: '2.0', method: 'message/send', params: { configuration: { acceptedOutputModes: [], blocking: true }, message, metadata: {} }, sim_google_token: token }\n      let raw = null; let error = ''\n      try { raw = await d2.rush('bridge').invoke(body) } catch (e) { error = (e && e.message) || String(e) }\n      const end = Date.now()\n      stopTick()\n      const res = raw && (raw.result || (raw.data && raw.data.result))\n      const answer = res && res.artifacts && res.artifacts[0] && res.artifacts[0].parts && res.artifacts[0].parts[0] && res.artifacts[0].parts[0].text\n      const ctx = res && res.contextId\n      if (!error && raw && raw.error) error = typeof raw.error === 'string' ? raw.error : JSON.stringify(raw.error)\n      const state = error ? 'error' : (answer ? 'ok' : 'empty')\n      const chatId = ctx || d2.state.chatId\n      const extra = error ? { id: 'e' + turnId, role: 'error', text: error, at: end } : { id: 'b' + turnId, role: 'bot', text: answer || '(resposta vazia do bot)', at: end }\n      d2.setState({ sending: false, chatId, stick: true, messages: [...d2.state.messages, extra] })\n      patchTurn(turnId, { end, state, raw, error })\n      const r = await debug(chatId)\n      if (r) {\n        const bots = (r.messages || []).filter((m) => m.sender === 'ASSISTANT')\n        const last = bots[bots.length - 1]\n        patchTurn(turnId, {\n          usecase: last && last.assistant && last.assistant.usecase,\n          status: r.status,\n          bridgeMs: r.bridge_log && r.bridge_log.durationInMs,\n          bridgeResult: r.bridge_log && r.bridge_log.result,\n          listenerMs: r.listener_log && r.listener_log.durationInMs,\n          listenerResult: r.listener_log && r.listener_log.result,\n        })\n      }\n      const el2 = d2.$('#tb_sim_input'); if (el2) el2.focus()\n    }\n    d2.on('#tb_sim_token', 'input', (e, el) => {\n      const v = (el.value || '').trim().replace(/^Bearer\\s+/i, '')\n      if (v) { token = v; el.value = ''; d2.setState({ hasToken: true }) }\n    })\n    d2.on('.newchat', 'click', () => { d2.setState({ chatId: '', messages: [], turns: [], session: null }) })\n    d2.on('.send', 'click', send)\n    d2.on('.in', 'keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send() } })\n  },\n  updated(d2) {\n    if (d2.state.stick) { const log = d2.$('.log'); if (log) log.scrollTop = log.scrollHeight; d2.state.stick = false }\n  },\n}"}},"bridge":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"bridge"}}}},"debug":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"debug"}}}}}}}}}},{"_id":"6abfe437272474af816a36b5","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"Testes_Automatizados_HML","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const CATALOGO = [{\"key\":\"bffGetWorkerHml\",\"name\":\"BFF Get worker HML\",\"ref\":\"cWr4PD0-MGKgtJH8EW8GP\",\"client\":\"d193hHMqmkKx3JCKfh_sJ\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"atestado de outra pessoa (busca o colega)\",\"params\":{\"employee_id\":\"{{employee_id}}\",\"is_become_user\":false},\"disabled\":\"\"},{\"key\":\"getDependents\",\"name\":\"getDependents\",\"ref\":\"3iux1nR9mdrm-TG7UUS2Z\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"dependentes\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\"},\"disabled\":\"\"},{\"key\":\"getFeedback\",\"name\":\"getFeedback\",\"ref\":\"yhJeXEKjtciZhF2-lT53S\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"MAPA feedbacks\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\"},\"disabled\":\"\"},{\"key\":\"getPersonalData\",\"name\":\"getPersonalData\",\"ref\":\"5-JQ2g8qmXOunlT_l-wbF\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"dados pessoais / telefone do atestado\",\"params\":{\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"employee_email\":\"{{employee_email}}\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"getSkills\",\"name\":\"getSkills\",\"ref\":\"gBUEj0PmHD7mQ66sF5NEF\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"MAPA skills\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\"},\"disabled\":\"\"},{\"key\":\"getWorker\",\"name\":\"getWorker\",\"ref\":\"JJcFXczR0RrDAKXdRY4SW\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Colaborador (leitura)\",\"usedBy\":\"init worker (BFF HML)\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\"},\"disabled\":\"\"},{\"key\":\"mapaGetFeedbacks\",\"name\":\"MAPA get feedbacks\",\"ref\":\"v-w3MtUJEKVvd_jhapXJ9\",\"client\":\"Lft_OdFevDLp3VQB8p1dy\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"MAPA (leitura)\",\"usedBy\":\"\",\"params\":{\"employee_id\":\"{{employee_id}}\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"mapaGetSkills\",\"name\":\"MAPA get skills\",\"ref\":\"a_3KPV6-rYo3o789VdT9j\",\"client\":\"Lft_OdFevDLp3VQB8p1dy\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"MAPA (leitura)\",\"usedBy\":\"\",\"params\":{\"employee_id\":\"{{employee_id}}\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"getOpenTickets\",\"name\":\"getOpenTickets\",\"ref\":\"mGfk1ukF3WK-dQ4P-EI6K\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"GET\",\"kind\":\"leitura\",\"group\":\"Chamados (leitura)\",\"usedBy\":\"consulta de chamados\",\"params\":{\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"ticket_type\":\"\",\"state\":\"\",\"sys_created_on\":\"\",\"ticket_number\":\"\",\"origin\":\"ti_incidents\",\"employee_email\":\"{{employee_email}}\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"addDependent\",\"name\":\"addDependent\",\"ref\":\"n-zLMPkBi2CvMJjBG05bz\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employeeId\":\"{{employee_id}}\",\"allowedForTaxDeduction\":true,\"autoComplete\":true,\"dependentForPayrollPurposes\":true,\"files\":\"sdf\",\"genderCode\":\"M\",\"birthDate\":\"29/02/2003\",\"cpf\":\"38693874805\",\"relationship\":\"Father\",\"formattedName\":\"ZéRamalho\",\"reportingName\":\"Zé\",\"firstName\":\"Zé\",\"lastName\":\"Ramalho\",\"gemini\":true},\"disabled\":\"\"},{\"key\":\"updateContactData\",\"name\":\"updateContactData\",\"ref\":\"dapLe5g4fk3mZIrefSxVT\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"PATCH\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"option\":\"home_address\",\"email\":\"emailteste@gmail.com\",\"country\":\"BRA\",\"phone\":\"19982250288\",\"gemini\":true,\"phoneDeviceType\":\"mobile\",\"street\":\"Rua teste\",\"additionalAddress\":\"\",\"number\":\"686\",\"streetType\":\"Street\",\"neighborhood\":\"Santa Paula\",\"postalCode\":\"09541-300\",\"city\":\"São Paulo\",\"state\":\"SP\",\"addressName\":\"home\",\"replaceAll\":true,\"isPrimary\":false,\"file\":\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==\",\"filename\":\"teste.png\"},\"disabled\":\"\"},{\"key\":\"updateEmergencyContacts\",\"name\":\"updateEmergencyContacts\",\"ref\":\"kalnilhV3xu2kYov0Bx1L\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"PATCH\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employeeId\":\"{{employee_id}}\",\"country\":\"BR\",\"countryCode\":\"BRA\",\"priority\":1,\"relationship\":\"Father\",\"phone\":\"19993333867\",\"gemini\":true,\"firstName\":\"João\",\"lastName\":\"Antonio\",\"phoneDeviceType\":\"mobile\"},\"disabled\":\"\"},{\"key\":\"updatePaymentElections\",\"name\":\"updatePaymentElections\",\"ref\":\"MHWMh4DDZOrvF40gw2g88\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"PATCH\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"gemini\":true,\"employee_id\":\"{{employee_id}}\",\"account\":\"\"},\"disabled\":\"\"},{\"key\":\"updatePersonalData\",\"name\":\"updatePersonalData\",\"ref\":\"Pj-VTFQJUH2mPTQ0cuT3V\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"PATCH\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"option\":\"legal_name\",\"orientation\":\"\",\"ethnicityCode\":\"\",\"pronoun\":\"\",\"maritalStatusCode\":\"\",\"firstName\":\"THAMIRES\",\"lastName\":\"TESTE\",\"files\":\"\",\"gemini\":true},\"disabled\":\"\"},{\"key\":\"updatePersonPhoto\",\"name\":\"updatePersonPhoto\",\"ref\":\"RYqe6PNUlj8ke_fkf3bqS\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"PATCH\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"fileName\":\"foto_teste.png\",\"fileBase64\":\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==\",\"gemini\":true},\"disabled\":\"\"},{\"key\":\"uploadAttachmentToWd\",\"name\":\"uploadAttachmentToWd\",\"ref\":\"1synU40jLugNx0PloKdDX\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Workday (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"gemini\":true,\"employee_id\":\"{{employee_id}}\",\"fileName\":\"banco.png\",\"fileBase64\":\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==\"},\"disabled\":\"\"},{\"key\":\"bffSubirMapa\",\"name\":\"BFF subir MAPA\",\"ref\":\"pz4RNq01c2a-5rBAQN-Kk\",\"client\":\"Lft_OdFevDLp3VQB8p1dy\",\"method\":\"PUT\",\"kind\":\"escrita\",\"group\":\"MAPA (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"development_item\":\"Teste automatizado HML\",\"additional_information\":\"Criado pela tela Testes Automatizados\",\"category_id\":\"DEVELOPMENT_ITEM_CATEGORY-3-19\",\"start_date\":\"{{hoje_iso}}\",\"completion_date\":\"2026-12-31\",\"status_id\":\"DEVELOPMENT_ITEM_STATUS-3-4\",\"status_note\":\"In progress\",\"updated_by_employee_id\":\"{{employee_id}}\",\"development_item_version\":\"v2\",\"development_item_id\":\"\"},\"disabled\":\"\"},{\"key\":\"putDevelopmentItem\",\"name\":\"putDevelopmentItem\",\"ref\":\"1_KJGQx0_o3ZGDCEi4iX5\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"(sem método)\",\"kind\":\"escrita\",\"group\":\"MAPA (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\"},\"disabled\":\"Requisição sem URL/método configurado\"},{\"key\":\"childcareBenefit\",\"name\":\"childcareBenefit\",\"ref\":\"u3C4ePk84R-okC_R7DMhl\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Chamados (escrita)\",\"usedBy\":\"\",\"params\":{\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"gemini\":true,\"reportingMonthAndYear\":\"03/2026\",\"paymentDate\":\"13/03/2026\",\"option\":\"receipt\",\"dependents\":\"\",\"name\":\"THÉO RODRIGO PASSONI OLIVEIRA\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"requestTransportation\",\"name\":\"requestTransportation\",\"ref\":\"S22Cl4C9_nBElVNOwXxTB\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Chamados (escrita)\",\"usedBy\":\"\",\"params\":{\"env\":\"HML\",\"is_become_user\":false,\"gemini\":true,\"employee_id\":\"{{employee_id}}\",\"option\":\"\",\"transports\":\"\",\"hasAttachment\":false},\"disabled\":\"\"},{\"key\":\"submitMedicalCertificateHml\",\"name\":\"submitMedicalCertificate HML\",\"ref\":\"-20ClsIBfWmVoRAbkZTaW\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Chamados (escrita)\",\"usedBy\":\"LANCAMENTO_ATESTADO (UPLOAD_CERTIFICATE)\",\"params\":{\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"gemini\":true,\"quantityDays\":8,\"date\":\"{{hoje_br}}\",\"phone\":\"11989157336\",\"emailInput\":\"{{employee_email}}\",\"additionalInput\":\"\",\"env\":\"HML\"},\"disabled\":\"\"},{\"key\":\"uploadAttachmentToTicket\",\"name\":\"uploadAttachmentToTicket\",\"ref\":\"ctH7FQ2z2ffgiY4OeuU76\",\"client\":\"UxgGgbH9Kdb_3sSKRq7Gz\",\"method\":\"POST\",\"kind\":\"escrita\",\"group\":\"Chamados (escrita)\",\"usedBy\":\"anexo do atestado no chamado\",\"params\":{\"is_become_user\":false,\"employee_id\":\"{{employee_id}}\",\"gemini\":true,\"ticket_id\":\"3a9defde877bba14ec360e530cbb35aa\",\"filename\":\"Screenshot 2026-03-25 161511.png.png\",\"file\":\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==\",\"file_url\":\"https://natura-hr-demo.data2.media/file/NvxjlolrS5RKP-IucaCEl?e=T7hhBgLfkB7rhDznGZ9Gy\",\"env\":\"HML\"},\"disabled\":\"\"}];\n\nconst GRUPOS = ['Colaborador (leitura)', 'MAPA (leitura)', 'Chamados (leitura)', 'Workday (escrita)', 'MAPA (escrita)', 'Chamados (escrita)'];\nconst LS = 'testes_hml_v1';\nconst MAX_VIEW = 150000;\nconst MAX_LOG_RESP = 400000;\n\nconst esc = (v) => String(v == null ? '' : v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst pad = (n) => String(n).padStart(2, '0');\nconst hojeIso = () => { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; };\nconst hojeBr = () => { const d = new Date(); return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()}`; };\nconst fmtDt = (v) => { if (!v) return ''; const d = new Date(v); if (isNaN(d)) return String(v); return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; };\nconst fmtMs = (ms) => (ms == null || ms === '') ? '-' : (ms >= 1000 ? `${(ms / 1000).toFixed(2)} s` : `${Math.round(ms)} ms`);\nconst fmtBytes = (n) => !n ? '0 B' : n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(1)} KB` : `${(n / 1048576).toFixed(2)} MB`;\nconst novoRunId = (pref) => { const d = new Date(); return `${pref}-${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}-${Math.random().toString(36).slice(2, 6)}`; };\nconst byKey = (k) => CATALOGO.find((c) => c.key === k);\nconst safeStr = (v) => { try { return typeof v === 'string' ? v : JSON.stringify(v, null, 2); } catch (e) { return String(v); } };\nconst pct = (arr, p) => { if (!arr.length) return null; const s = [...arr].sort((a, b) => a - b); return s[Math.min(s.length - 1, Math.ceil((p / 100) * s.length) - 1)]; };\n\nfunction lsGet() { try { return JSON.parse(localStorage.getItem(LS) || '{}'); } catch (e) { return {}; } }\nfunction lsSet(patch) { try { localStorage.setItem(LS, JSON.stringify({ ...lsGet(), ...patch })); } catch (e) { } }\n\n// Troca {{placeholders}} pelos valores do cabeçalho (recursivo)\nfunction resolver(v, ctx) {\n  if (typeof v === 'string') {\n    const m = v.match(/^\\{\\{(\\w+)\\}\\}$/);\n    if (m && ctx[m[1]] !== undefined) return ctx[m[1]];\n    return v.replace(/\\{\\{(\\w+)\\}\\}/g, (all, k) => (ctx[k] !== undefined ? ctx[k] : all));\n  }\n  if (Array.isArray(v)) return v.map((x) => resolver(x, ctx));\n  if (v && typeof v === 'object') { const o = {}; for (const k of Object.keys(v)) o[k] = resolver(v[k], ctx); return o; }\n  return v;\n}\n\n// Nunca leva token e encurta base64 para logs/exports\nfunction sanear(v) {\n  if (typeof v === 'string') return (v.length > 300 && /^[A-Za-z0-9+/=\\s]+$/.test(v)) ? `<base64 ${v.length} chars>` : v;\n  if (Array.isArray(v)) return v.map(sanear);\n  if (v && typeof v === 'object') { const o = {}; for (const k of Object.keys(v)) { if (/^(token|google_token|authorization)$/i.test(k)) continue; o[k] = sanear(v[k]); } return o; }\n  return v;\n}\n\nfunction diagnostico(r) {\n  if (!r || r.ok) return '';\n  const d = r.data || {};\n  const inner = (d && typeof d === 'object') ? (d.data || d) : {};\n  const tipo = String(inner.type || inner.code || '').toUpperCase();\n  const msg = String(inner.message || d.error || r.error || '').toLowerCase();\n  if (tipo === 'UNAUTHORIZED' || msg.includes('unauthorized') || r.status === 401) return 'Token ausente, inválido ou expirado (o BFF responde 424 com type UNAUTHORIZED). Gere um token novo e rode de novo.';\n  if (r.status === 403) return 'Sem permissão: o token não tem acesso a este recurso/colaborador.';\n  if (r.status === 404) return 'Recurso não encontrado: confira employee_id / ids dos parâmetros.';\n  if (r.status === 400 || r.status === 422) return 'Parâmetros rejeitados pelo BFF: revise o JSON de parâmetros.';\n  if (r.status === 424) return 'Falha de dependência no BFF (424): o serviço de trás (Workday/ServiceNow) falhou. Veja o corpo da resposta.';\n  if (r.status >= 500) return 'Erro interno no BFF/serviço de destino.';\n  if (!r.status) return 'Sem status HTTP: falha de rede, timeout ou erro na própria rush.';\n  return '';\n}\n\nfunction extrairErro(e) {\n  let status = e && (e.status || e.statusCode || (e.response && e.response.status) || e.code);\n  status = Number(status) || 0;\n  let data = e && (e.body !== undefined ? e.body : e.data !== undefined ? e.data : (e.response && e.response.data));\n  let message = (e && e.message) || String(e);\n  if (data === undefined || data === null) { try { const j = JSON.parse(message.slice(message.indexOf('{'))); data = j; } catch (x) { data = null; } }\n  if (data && typeof data === 'object' && data.data && typeof data.data === 'object' && data.code && !status) status = Number(data.code) || 0;\n  if (data && typeof data === 'object' && data.error && typeof data.error === 'string') message = data.error;\n  return { status, data, message };\n}\n\nfunction jsonHtml(v) {\n  let s = safeStr(v);\n  if (s === undefined) s = 'undefined';\n  const cortado = s.length > MAX_VIEW;\n  if (cortado) s = s.slice(0, MAX_VIEW);\n  const h = esc(s).replace(/(&quot;(?:\\\\.|[^&]|&(?!quot;))*?&quot;)(\\s*:)?|\\b(true|false|null)\\b|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/g, (m, str, colon, lit, num) => {\n    if (str) return colon ? `<span class=\"jk\">${str}</span>${colon}` : `<span class=\"js\">${str}</span>`;\n    if (lit) return `<span class=\"jl\">${lit}</span>`;\n    return `<span class=\"jn\">${num}</span>`;\n  });\n  return `<pre class=\"json\">${h}${cortado ? `\\n<span class=\"jl\">… (cortado na tela em ${MAX_VIEW} chars: use Copiar/Baixar para ver tudo)</span>` : ''}</pre>`;\n}\n\nfunction baixar(nome, conteudo, tipo) {\n  const blob = conteudo instanceof Blob ? conteudo : new Blob([conteudo], { type: tipo || 'text/plain;charset=utf-8' });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url; a.download = nome; document.body.appendChild(a); a.click();\n  setTimeout(() => { URL.revokeObjectURL(url); a.remove(); }, 1500);\n}\n\nasync function copiar(d2, texto) {\n  try { await navigator.clipboard.writeText(texto); toast(d2, 'Copiado'); } catch (e) { toast(d2, 'Não foi possível copiar', true); }\n}\n\nfunction toast(d2, msg, erro) {\n  d2.setState({ toast: { msg, erro: !!erro, t: Date.now() } });\n  const t = d2.state.toast.t;\n  setTimeout(() => { if (d2.state.toast && d2.state.toast.t === t) d2.setState({ toast: null }); }, 2600);\n}\n\n// ---------- linhas normalizadas (runner e logs usam o mesmo formato p/ exportar) ----------\nfunction linhaDoResultado(item, r) {\n  return {\n    data: r.started_at, run_id: r.run_id, requisicao: item.name, chave: item.key, ref: item.ref, metodo: item.method, tipo: item.kind,\n    ok: r.ok, status: r.status, duracao_ms: r.ms, erro: r.ok ? '' : (r.error || ''), diagnostico: diagnostico(r),\n    tester_email: r.tester_email, employee_id: r.employee_id, params: r.params, resposta: r.data, tamanho: r.size, log_id: r.log_id\n  };\n}\nfunction linhaDoLog(l) {\n  const item = byKey(l.request_key) || {};\n  const r = { ok: l.ok, status: l.status_code, data: l.response, error: l.error_message };\n  return {\n    data: l.started_at || l.createdAt, run_id: l.run_id, requisicao: l.request_name || item.name, chave: l.request_key, ref: l.request_ref, metodo: l.method, tipo: l.kind,\n    ok: l.ok, status: l.status_code, duracao_ms: l.duration_ms, erro: l.ok ? '' : (l.error_message || ''), diagnostico: diagnostico(r),\n    tester_email: l.tester_email, employee_id: l.employee_id, params: l.params, resposta: l.response, tamanho: l.response_size, log_id: l._id\n  };\n}\n\nfunction resumoPorRequisicao(linhas) {\n  const m = {};\n  for (const l of linhas) {\n    const k = l.chave || '?';\n    if (!m[k]) m[k] = { chave: k, requisicao: l.requisicao, metodo: l.metodo, tipo: l.tipo, n: 0, ok: 0, durs: [], ultimo: null };\n    const g = m[k]; g.n++; if (l.ok) g.ok++; if (typeof l.duracao_ms === 'number') g.durs.push(l.duracao_ms);\n    if (!g.ultimo || new Date(l.data) > new Date(g.ultimo.data)) g.ultimo = l;\n  }\n  return Object.values(m).map((g) => ({\n    ...g, taxa: g.n ? Math.round((g.ok / g.n) * 100) : 0,\n    media: g.durs.length ? Math.round(g.durs.reduce((a, b) => a + b, 0) / g.durs.length) : null,\n    p95: pct(g.durs, 95), max: g.durs.length ? Math.max(...g.durs) : null\n  })).sort((a, b) => a.taxa - b.taxa || (b.media || 0) - (a.media || 0));\n}\n\n// ---------- exportação ----------\nconst CSV_COLS = ['data', 'run_id', 'requisicao', 'chave', 'ref', 'metodo', 'tipo', 'ok', 'status', 'duracao_ms', 'erro', 'diagnostico', 'tester_email', 'employee_id', 'params', 'resposta', 'tamanho', 'log_id'];\nfunction exportarCsv(linhas, nome, comResposta) {\n  const cols = comResposta ? CSV_COLS : CSV_COLS.filter((c) => c !== 'resposta');\n  const cel = (v) => {\n    let s = v == null ? '' : (typeof v === 'object' ? JSON.stringify(sanear(v)) : String(v));\n    if (s.length > 30000) s = s.slice(0, 30000) + '…(cortado)';\n    return /[\";\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n  };\n  const out = [cols.join(';')].concat(linhas.map((l) => cols.map((c) => cel(c === 'data' ? fmtDt(l[c]) : c === 'ok' ? (l.ok ? 'sim' : 'nao') : l[c])).join(';')));\n  baixar(nome, '﻿' + out.join('\\r\\n'), 'text/csv;charset=utf-8');\n}\n\nconst asciiPdf = (s) => String(s == null ? '' : s).replace(/[–—]/g, '-').replace(/[‘’]/g, \"'\").replace(/[“”]/g, '\"').replace(/…/g, '...').replace(/[^\\x09\\x0A\\x0D\\x20-\\x7E -ÿ]/g, '?');\n\nfunction exportarPdf(d2, linhas, opts) {\n  const jsMod = d2.lib('jspdf@2.5.1');\n  const atMod = d2.lib('jspdf-autotable@3.8.2');\n  const JsPDF = jsMod && (jsMod.jsPDF || (jsMod.default && (jsMod.default.jsPDF || jsMod.default)));\n  const autoTable = atMod && (atMod.default || atMod.autoTable);\n  if (!JsPDF || typeof autoTable !== 'function') return imprimirHtml(linhas, opts);\n  const doc = new JsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' });\n  const W = doc.internal.pageSize.getWidth();\n  doc.setFontSize(15); doc.text(asciiPdf(opts.titulo), 32, 36);\n  doc.setFontSize(9); doc.setTextColor(90);\n  const ok = linhas.filter((l) => l.ok).length;\n  const linhasCab = [\n    `Sistema: natura-hr-demo  |  Ambiente: HML  |  Gerado em ${fmtDt(new Date())}${opts.por ? `  |  Por: ${opts.por}` : ''}`,\n    `Execucoes: ${linhas.length}  |  Sucesso: ${ok}  |  Falha: ${linhas.length - ok}${opts.filtros ? `  |  Filtros: ${opts.filtros}` : ''}`\n  ];\n  linhasCab.forEach((t, i) => doc.text(asciiPdf(t), 32, 54 + i * 12));\n  doc.setTextColor(0);\n  const res = resumoPorRequisicao(linhas);\n  autoTable(doc, {\n    startY: 84, head: [['Requisicao', 'Chave', 'Metodo', 'Tipo', 'Exec.', 'Sucesso', 'Media', 'p95', 'Max', 'Ultimo status', 'Ultimo erro']],\n    body: res.map((g) => [g.requisicao, g.chave, g.metodo, g.tipo, g.n, `${g.taxa}%`, fmtMs(g.media), fmtMs(g.p95), fmtMs(g.max), g.ultimo ? String(g.ultimo.status || '-') : '-', g.ultimo && !g.ultimo.ok ? (g.ultimo.erro || '').slice(0, 120) : ''].map(asciiPdf)),\n    styles: { fontSize: 7.5, cellPadding: 3 }, headStyles: { fillColor: [33, 37, 41] },\n    didParseCell: (c) => { if (c.section === 'body' && c.column.index === 5) { const v = parseInt(c.cell.raw, 10); c.cell.styles.textColor = v === 100 ? [22, 128, 61] : v === 0 ? [185, 28, 28] : [180, 83, 9]; } }\n  });\n  autoTable(doc, {\n    startY: doc.lastAutoTable.finalY + 18, head: [['Data/hora', 'Requisicao', 'Metodo', 'Status', 'OK', 'Duracao', 'employee_id', 'Erro / diagnostico', 'run_id']],\n    body: linhas.map((l) => [fmtDt(l.data), l.requisicao, l.metodo, String(l.status || '-'), l.ok ? 'sim' : 'nao', fmtMs(l.duracao_ms), l.employee_id || '', l.ok ? '' : [l.erro, l.diagnostico].filter(Boolean).join(' - ').slice(0, 220), l.run_id || ''].map(asciiPdf)),\n    styles: { fontSize: 7, cellPadding: 2.5, overflow: 'linebreak' }, headStyles: { fillColor: [33, 37, 41] },\n    columnStyles: { 7: { cellWidth: 240 } },\n    didParseCell: (c) => { if (c.section === 'body' && c.column.index === 4) c.cell.styles.textColor = c.cell.raw === 'sim' ? [22, 128, 61] : [185, 28, 28]; }\n  });\n  if (opts.detalhe) {\n    for (const l of linhas) {\n      doc.addPage();\n      doc.setFontSize(11); doc.text(asciiPdf(`${l.requisicao} (${l.chave}) - ${l.ok ? 'OK' : 'FALHA'} - status ${l.status || '-'} - ${fmtMs(l.duracao_ms)}`), 32, 34);\n      doc.setFontSize(8); doc.setTextColor(90); doc.text(asciiPdf(`${fmtDt(l.data)}  |  ref ${l.ref || '-'}  |  run ${l.run_id || '-'}  |  log ${l.log_id || '-'}  |  ${l.tester_email || ''}`), 32, 48); doc.setTextColor(0);\n      let y = 66;\n      const bloco = (titulo, obj, limite) => {\n        let s = safeStr(sanear(obj)) || '';\n        if (s.length > limite) s = s.slice(0, limite) + '\\n...(cortado no PDF; resposta completa no CSV/JSON)';\n        doc.setFontSize(9); doc.text(asciiPdf(titulo), 32, y); y += 12;\n        doc.setFont('courier', 'normal'); doc.setFontSize(7);\n        for (const ln of doc.splitTextToSize(asciiPdf(s), W - 64)) { if (y > doc.internal.pageSize.getHeight() - 30) { doc.addPage(); y = 34; } doc.text(ln, 32, y); y += 8.5; }\n        doc.setFont('helvetica', 'normal'); y += 10;\n      };\n      if (!l.ok && l.diagnostico) bloco('Diagnostico', l.diagnostico, 1000);\n      bloco('Parametros enviados (token omitido)', l.params, 6000);\n      if (opts.comResposta) bloco('Resposta', l.resposta, 12000);\n    }\n  }\n  const total = doc.getNumberOfPages();\n  for (let i = 1; i <= total; i++) { doc.setPage(i); doc.setFontSize(7); doc.setTextColor(130); doc.text(`Testes Automatizados HML - pagina ${i}/${total}`, W - 170, doc.internal.pageSize.getHeight() - 14); }\n  doc.save(opts.arquivo);\n  return true;\n}\n\nfunction imprimirHtml(linhas, opts) {\n  const w = window.open('', '_blank');\n  if (!w) return false;\n  const res = resumoPorRequisicao(linhas);\n  const td = (v) => `<td>${esc(v)}</td>`;\n  w.document.write(`<!doctype html><html><head><meta charset=\"utf-8\"><title>${esc(opts.titulo)}</title><style>\n    body{font:11px Arial,sans-serif;margin:24px;color:#111}h1{font-size:16px}table{border-collapse:collapse;width:100%;margin:12px 0}th,td{border:1px solid #ccc;padding:3px 5px;text-align:left;vertical-align:top}th{background:#222;color:#fff}.ok{color:#16803d}.f{color:#b91c1c}pre{white-space:pre-wrap;font-size:9px;background:#f5f5f5;padding:6px}\n    @page{size:A4 landscape;margin:12mm}</style></head><body>\n    <h1>${esc(opts.titulo)}</h1><div>natura-hr-demo | HML | gerado em ${esc(fmtDt(new Date()))}${opts.filtros ? ' | filtros: ' + esc(opts.filtros) : ''}</div>\n    <table><tr><th>Requisição</th><th>Chave</th><th>Método</th><th>Exec.</th><th>Sucesso</th><th>Média</th><th>p95</th><th>Último erro</th></tr>\n    ${res.map((g) => `<tr>${td(g.requisicao)}${td(g.chave)}${td(g.metodo)}${td(g.n)}<td class=\"${g.taxa === 100 ? 'ok' : 'f'}\">${g.taxa}%</td>${td(fmtMs(g.media))}${td(fmtMs(g.p95))}${td(g.ultimo && !g.ultimo.ok ? g.ultimo.erro : '')}</tr>`).join('')}</table>\n    <table><tr><th>Data/hora</th><th>Requisição</th><th>Método</th><th>Status</th><th>OK</th><th>Duração</th><th>employee_id</th><th>Erro / diagnóstico</th></tr>\n    ${linhas.map((l) => `<tr>${td(fmtDt(l.data))}${td(l.requisicao)}${td(l.metodo)}${td(l.status || '-')}<td class=\"${l.ok ? 'ok' : 'f'}\">${l.ok ? 'sim' : 'não'}</td>${td(fmtMs(l.duracao_ms))}${td(l.employee_id)}${td([l.erro, l.diagnostico].filter(Boolean).join(' - '))}</tr>`).join('')}</table>\n    ${opts.detalhe ? linhas.map((l) => `<h3>${esc(l.requisicao)} - ${l.ok ? 'OK' : 'FALHA'} (${esc(l.status || '-')}, ${esc(fmtMs(l.duracao_ms))})</h3><pre>${esc((safeStr(sanear(l.params)) || '').slice(0, 6000))}</pre>${opts.comResposta ? `<pre>${esc((safeStr(sanear(l.resposta)) || '').slice(0, 12000))}</pre>` : ''}`).join('') : ''}\n    <script>setTimeout(()=>window.print(),300)<\\/script></body></html>`);\n  w.document.close();\n  return true;\n}\n\n// ---------- execução ----------\nfunction ctxPlaceholders(s) {\n  return { employee_id: (s.employee_id || '').trim(), employee_email: (s.employee_email || '').trim(), tester_email: (s.tester_email || '').trim(), hoje_iso: hojeIso(), hoje_br: hojeBr() };\n}\nfunction paramsEfetivos(s, item) {\n  const draft = (s.drafts || {})[item.key];\n  const base = draft != null ? JSON.parse(draft) : item.params;\n  return resolver(base, ctxPlaceholders(s));\n}\n\nasync function rodarUm(d2, item, runId) {\n  const s = d2.state;\n  let params;\n  try { params = paramsEfetivos(s, item); } catch (e) {\n    d2.setState({ results: { ...s.results, [item.key]: { ok: false, status: 0, error: `JSON de parâmetros inválido: ${e.message}`, ms: 0, started_at: new Date().toISOString(), params: null, run_id: runId } } });\n    return;\n  }\n  const token = (s.token || '').trim().replace(/^Bearer\\s+/i, '');\n  d2.setState({ running: { ...d2.state.running, [item.key]: Date.now() } });\n  const started = new Date();\n  const t0 = performance.now();\n  let r;\n  try {\n    const res = await d2.rush('runner').invoke({ key: item.key, name: item.name, ref: item.ref, client: item.client, method: item.method, kind: item.kind, params, token, run_id: runId, tester_email: s.tester_email || '', employee_id: s.employee_id || '' });\n    const out = res && res.data !== undefined ? res.data : res;\n    r = { ok: true, status: 200, data: out && out.data !== undefined ? out.data : out, serverMs: out && out.server_duration_ms };\n  } catch (e) {\n    const x = extrairErro(e);\n    r = { ok: false, status: x.status, data: x.data, error: x.message };\n  }\n  r.ms = Math.round(performance.now() - t0);\n  r.started_at = started.toISOString();\n  r.finished_at = new Date().toISOString();\n  r.params = sanear(params);\n  r.run_id = runId;\n  r.tester_email = s.tester_email || '';\n  r.employee_id = s.employee_id || '';\n  let txt = '';\n  try { txt = JSON.stringify(r.data) || ''; } catch (e) { }\n  r.size = txt.length;\n  r.diag = diagnostico(r);\n\n  const running = { ...d2.state.running }; delete running[item.key];\n  d2.setState({ running, results: { ...d2.state.results, [item.key]: r }, historico: [{ key: item.key, ...r, data: undefined }, ...(d2.state.historico || [])].slice(0, 200) });\n\n  // grava o log (token nunca vai junto)\n  try {\n    const resp = txt.length > MAX_LOG_RESP ? { truncado: true, tamanho: txt.length, preview: txt.slice(0, MAX_LOG_RESP) } : r.data;\n    const saved = await d2.rush('salvar').invoke({ log: {\n      run_id: runId, request_key: item.key, request_name: item.name, request_ref: item.ref, client_ref: item.client, method: item.method, kind: item.kind,\n      params: r.params, ok: r.ok, status_code: r.status || 0, error_message: r.ok ? '' : [r.error, r.diag].filter(Boolean).join(' | '),\n      duration_ms: r.ms, response: resp === undefined ? null : resp, response_size: r.size, tester_email: r.tester_email, employee_id: r.employee_id,\n      started_at: r.started_at, finished_at: r.finished_at\n    } });\n    const id = saved && saved.data && saved.data._id;\n    const cur = d2.state.results[item.key];\n    if (cur && cur.started_at === r.started_at) d2.setState({ results: { ...d2.state.results, [item.key]: { ...cur, log_id: id } } });\n  } catch (e) {\n    const cur = d2.state.results[item.key];\n    if (cur) d2.setState({ results: { ...d2.state.results, [item.key]: { ...cur, logErro: (e && e.message) || 'falha ao gravar log' } } });\n  }\n}\n\nasync function rodarLote(d2, itens) {\n  if (!itens.length) return toast(d2, 'Nenhuma requisição selecionada', true);\n  const runId = novoRunId('lote');\n  d2.setState({ lote: { runId, total: itens.length, feitos: 0, parar: false, inicio: Date.now() } });\n  const conc = Math.max(1, Math.min(5, Number(d2.state.concorrencia) || 1));\n  const fila = [...itens];\n  const worker = async () => {\n    while (fila.length && !(d2.state.lote && d2.state.lote.parar)) {\n      const it = fila.shift();\n      await rodarUm(d2, it, runId);\n      if (d2.state.lote) d2.setState({ lote: { ...d2.state.lote, feitos: d2.state.lote.feitos + 1 } });\n    }\n  };\n  await Promise.all(Array.from({ length: conc }, worker));\n  const l = d2.state.lote;\n  d2.setState({ lote: null, ultimoLote: l ? { runId: l.runId, total: l.total, feitos: l.feitos, ms: Date.now() - l.inicio, parado: l.parar } : null });\n  toast(d2, l && l.parar ? 'Lote interrompido' : `Lote concluído: ${runId}`);\n}\n\n// ---------- logs ----------\nfunction montarFiltro(f) {\n  const q = {};\n  if (f.email) q.tester_email = f.email.trim();\n  if (f.employee_id) q.employee_id = f.employee_id.trim();\n  if (f.request_key) q.request_key = f.request_key;\n  if (f.run_id) q.run_id = f.run_id.trim();\n  if (f.kind) q.kind = f.kind;\n  if (f.ok === 'ok') q.ok = true;\n  if (f.ok === 'falha') q.ok = false;\n  if (f.de || f.ate) {\n    q.createdAt = {};\n    if (f.de) q.createdAt.$gte = new Date(`${f.de}T00:00:00-03:00`).toISOString();\n    if (f.ate) q.createdAt.$lte = new Date(`${f.ate}T23:59:59.999-03:00`).toISOString();\n  }\n  return q;\n}\nfunction descreverFiltro(f) {\n  const p = [];\n  if (f.de || f.ate) p.push(`periodo ${f.de || '...'} a ${f.ate || '...'}`);\n  if (f.email) p.push(`email ${f.email}`);\n  if (f.employee_id) p.push(`employee_id ${f.employee_id}`);\n  if (f.request_key) p.push(`requisicao ${f.request_key}`);\n  if (f.run_id) p.push(`run ${f.run_id}`);\n  if (f.kind) p.push(f.kind);\n  if (f.ok) p.push(f.ok);\n  if (f.texto) p.push(`texto \"${f.texto}\"`);\n  return p.join(', ');\n}\nasync function buscarLogs(d2, withResponse) {\n  const f = d2.state.filtros || {};\n  d2.setState({ logsLoading: true, logsErro: '' });\n  try {\n    const res = await d2.rush('listar').invoke({ filter: montarFiltro(f), limit: Number(f.limite) || 1000, withResponse: !!withResponse });\n    const out = (res && res.data) || {};\n    if (withResponse) { d2.setState({ logsLoading: false }); return out.rows || []; }\n    d2.setState({ logs: out.rows || [], logsTotal: out.total || 0, logsLoading: false, logsPage: 0, logsCarregado: Date.now() });\n  } catch (e) {\n    d2.setState({ logsLoading: false, logsErro: (e && e.message) || 'Erro ao buscar logs' });\n  }\n  return null;\n}\nfunction logsFiltradosTexto(s) {\n  const t = ((s.filtros || {}).texto || '').toLowerCase().trim();\n  const rows = s.logs || [];\n  if (!t) return rows;\n  return rows.filter((l) => [l.request_name, l.request_key, l.error_message, l.tester_email, l.employee_id, l.run_id, String(l.status_code)].some((v) => String(v || '').toLowerCase().includes(t)));\n}\nasync function abrirDetalhe(d2, id) {\n  d2.setState({ detalhe: { id, loading: true } });\n  try {\n    const res = await d2.rush('detalhe').invoke({ id });\n    d2.setState({ detalhe: { id, row: res && res.data && res.data.row } });\n  } catch (e) {\n    d2.setState({ detalhe: { id, erro: (e && e.message) || 'Erro ao abrir log' } });\n  }\n}\n\n// ---------- render ----------\nfunction badgeMetodo(m) { return `<span class=\"mt mt-${esc(String(m).toLowerCase().replace(/[^a-z]/g, ''))}\">${esc(m)}</span>`; }\nfunction badgeTipo(k) { return `<span class=\"tp ${k === 'escrita' ? 'tp-w' : 'tp-r'}\">${k === 'escrita' ? 'escrita' : 'leitura'}</span>`; }\nfunction badgeStatus(r) {\n  if (!r) return '<span class=\"st st-none\">não rodou</span>';\n  return r.ok ? `<span class=\"st st-ok\">✓ ${r.status === 200 ? '2xx' : esc(r.status)}</span>` : `<span class=\"st st-err\">✕ ${esc(r.status || 'erro')}</span>`;\n}\n\nfunction viewCabecalho(s) {\n  const tokenOk = !!(s.token || '').trim();\n  return `\n  <div class=\"cfg\">\n    <label class=\"f grow2\">Token Google (só em memória, nunca é salvo)\n      <div class=\"tokwrap\"><input data-in=\"token\" type=\"${s.showToken ? 'text' : 'password'}\" value=\"${esc(s.token || '')}\" placeholder=\"ya29...\" autocomplete=\"off\" spellcheck=\"false\">\n      <button class=\"btn ghost sm\" data-act=\"toggleToken\">${s.showToken ? 'ocultar' : 'mostrar'}</button></div>\n      <span class=\"hint ${tokenOk ? '' : 'warn'}\">${tokenOk ? `${(s.token || '').trim().length} chars` : 'sem token: as requisições vão voltar UNAUTHORIZED'}</span>\n    </label>\n    <label class=\"f\">employee_id ({{employee_id}})<input data-in=\"employee_id\" value=\"${esc(s.employee_id || '')}\" placeholder=\"ex.: 60012345\"></label>\n    <label class=\"f\">E-mail do colaborador ({{employee_email}})<input data-in=\"employee_email\" value=\"${esc(s.employee_email || '')}\" placeholder=\"colaborador@natura.net\"></label>\n    <label class=\"f\">Seu e-mail (testador)<input data-in=\"tester_email\" value=\"${esc(s.tester_email || '')}\" placeholder=\"voce@data2.app\"></label>\n  </div>`;\n}\n\nfunction viewRunner(d2, s) {\n  const results = s.results || {};\n  const running = s.running || {};\n  const busca = (s.busca || '').toLowerCase();\n  const sel = s.sel || {};\n  const itens = CATALOGO.filter((c) => !busca || `${c.name} ${c.key} ${c.group} ${c.usedBy}`.toLowerCase().includes(busca));\n  const feitos = CATALOGO.map((c) => results[c.key]).filter(Boolean);\n  const okN = feitos.filter((r) => r.ok).length;\n  const durs = feitos.map((r) => r.ms).filter((x) => typeof x === 'number');\n  const lote = s.lote;\n  const nSel = Object.keys(sel).filter((k) => sel[k]).length;\n\n  const card = (c) => {\n    const r = results[c.key];\n    const isRun = !!running[c.key];\n    const aberto = (s.abertos || {})[c.key];\n    const draft = (s.drafts || {})[c.key];\n    const txt = draft != null ? draft : JSON.stringify(c.params, null, 2);\n    let jsonErr = '';\n    if (draft != null) { try { JSON.parse(draft); } catch (e) { jsonErr = e.message; } }\n    let preview = '';\n    if (aberto) { try { preview = JSON.stringify(sanear(paramsEfetivos(s, c)), null, 2); } catch (e) { preview = ''; } }\n    return `\n    <div class=\"card ${r ? (r.ok ? 'c-ok' : 'c-err') : ''} ${c.disabled ? 'c-dis' : ''}\" data-key=\"${esc(c.key)}\">\n      <div class=\"crow\">\n        <input type=\"checkbox\" data-chk=\"${esc(c.key)}\" ${sel[c.key] ? 'checked' : ''} ${c.disabled ? 'disabled' : ''} title=\"selecionar para rodar em lote\">\n        <div class=\"cinfo\" data-act=\"toggleCard\" data-k=\"${esc(c.key)}\">\n          <div class=\"cname\">${esc(c.name)} ${badgeMetodo(c.method)} ${badgeTipo(c.kind)} ${draft != null ? '<span class=\"tag\">params editados</span>' : ''}</div>\n          <div class=\"csub\"><code>${esc(c.key)}</code> · ref <code>${esc(c.ref)}</code>${c.usedBy ? ` · usado em: ${esc(c.usedBy)}` : ''}${c.disabled ? ` · <b class=\"warn\">${esc(c.disabled)}</b>` : ''}</div>\n        </div>\n        <div class=\"cres\">\n          ${isRun ? `<span class=\"spin\"></span><span class=\"muted\">rodando…</span>` : badgeStatus(r)}\n          ${r && !isRun ? `<span class=\"dur ${r.ms > 8000 ? 'slow' : r.ms > 3000 ? 'mid' : ''}\">${fmtMs(r.ms)}</span>` : ''}\n        </div>\n        <div class=\"cact\">\n          <button class=\"btn sm ${c.kind === 'escrita' ? 'warnb' : ''}\" data-act=\"run\" data-k=\"${esc(c.key)}\" ${isRun || c.disabled ? 'disabled' : ''}>Rodar</button>\n          <button class=\"btn ghost sm\" data-act=\"toggleCard\" data-k=\"${esc(c.key)}\">${aberto ? 'fechar' : 'detalhes'}</button>\n        </div>\n      </div>\n      ${aberto ? `\n      <div class=\"cbody\">\n        <div class=\"cols\">\n          <div class=\"col\">\n            <div class=\"lbl\">Parâmetros (JSON). Placeholders: {{employee_id}} {{employee_email}} {{tester_email}} {{hoje_iso}} {{hoje_br}}\n              <span class=\"right\">${draft != null ? `<button class=\"btn ghost xs\" data-act=\"resetDraft\" data-k=\"${esc(c.key)}\">restaurar mock</button>` : ''}<button class=\"btn ghost xs\" data-act=\"fmtDraft\" data-k=\"${esc(c.key)}\">formatar</button></span></div>\n            <textarea class=\"ed ${jsonErr ? 'bad' : ''}\" data-draft=\"${esc(c.key)}\" spellcheck=\"false\">${esc(txt)}</textarea>\n            ${jsonErr ? `<div class=\"err\">JSON inválido: ${esc(jsonErr)}</div>` : ''}\n            <details class=\"mini\"><summary>O que vai ser enviado (placeholders resolvidos, token omitido)</summary>${jsonHtml(preview)}</details>\n          </div>\n          <div class=\"col\">\n            ${r ? `\n            <div class=\"meta\">\n              <div><span>Status</span>${badgeStatus(r)}</div>\n              <div><span>Duração (cliente)</span><b>${fmtMs(r.ms)}</b></div>\n              <div><span>Duração (servidor)</span><b>${fmtMs(r.serverMs)}</b></div>\n              <div><span>Tamanho</span><b>${fmtBytes(r.size)}</b></div>\n              <div><span>Início</span><b>${esc(fmtDt(r.started_at))}</b></div>\n              <div><span>run_id</span><code>${esc(r.run_id)}</code></div>\n              <div><span>Log</span>${r.log_id ? `<a data-act=\"openLog\" data-id=\"${esc(r.log_id)}\">${esc(r.log_id)}</a>` : r.logErro ? `<b class=\"warn\">não gravou: ${esc(r.logErro)}</b>` : '<span class=\"muted\">gravando…</span>'}</div>\n            </div>\n            ${!r.ok ? `<div class=\"errbox\"><b>${esc(r.error || 'Falhou')}</b>${diagnostico(r) ? `<div>${esc(diagnostico(r))}</div>` : ''}</div>` : ''}\n            <div class=\"lbl\">Retorno <span class=\"right\"><button class=\"btn ghost xs\" data-act=\"copyResp\" data-k=\"${esc(c.key)}\">copiar</button><button class=\"btn ghost xs\" data-act=\"dlResp\" data-k=\"${esc(c.key)}\">baixar .json</button></span></div>\n            ${jsonHtml(r.data === undefined ? null : r.data)}` : '<div class=\"empty\">Rode a requisição para ver o retorno aqui.</div>'}\n          </div>\n        </div>\n      </div>` : ''}\n    </div>`;\n  };\n\n  const grupos = GRUPOS.map((g) => {\n    const its = itens.filter((c) => c.group === g);\n    if (!its.length) return '';\n    const escrita = g.includes('escrita');\n    return `<div class=\"grp\"><div class=\"gh ${escrita ? 'gw' : ''}\">${esc(g)} <span class=\"muted\">(${its.length})</span>\n      <span class=\"right\"><button class=\"btn ghost xs\" data-act=\"selGroup\" data-g=\"${esc(g)}\">selecionar grupo</button></span></div>${its.map(card).join('')}</div>`;\n  }).join('');\n\n  return `\n  <div class=\"bar\">\n    <input class=\"search\" data-in=\"busca\" value=\"${esc(s.busca || '')}\" placeholder=\"Buscar requisição…\">\n    <button class=\"btn\" data-act=\"runReads\" ${lote ? 'disabled' : ''}>Rodar todas as leituras</button>\n    <button class=\"btn warnb\" data-act=\"runSel\" ${lote || !nSel ? 'disabled' : ''}>Rodar selecionadas (${nSel})</button>\n    <label class=\"inl\">paralelo <select data-in=\"concorrencia\">${[1, 2, 3, 5].map((n) => `<option value=\"${n}\" ${Number(s.concorrencia || 1) === n ? 'selected' : ''}>${n}</option>`).join('')}</select></label>\n    ${lote ? `<button class=\"btn danger\" data-act=\"stop\">Parar</button>` : ''}\n    <span class=\"sp\"></span>\n    <button class=\"btn ghost\" data-act=\"clearSel\" ${!nSel ? 'disabled' : ''}>limpar seleção</button>\n    <button class=\"btn ghost\" data-act=\"clearRes\" ${!feitos.length ? 'disabled' : ''}>limpar resultados</button>\n    <button class=\"btn ghost\" data-act=\"expRunCsv\" ${!feitos.length ? 'disabled' : ''}>CSV</button>\n    <button class=\"btn ghost\" data-act=\"expRunPdf\" ${!feitos.length ? 'disabled' : ''}>PDF</button>\n  </div>\n  ${lote ? `<div class=\"prog\"><div style=\"width:${Math.round((lote.feitos / lote.total) * 100)}%\"></div><span>${lote.feitos}/${lote.total} · ${esc(lote.runId)}</span></div>` : ''}\n  <div class=\"kpis\">\n    <div class=\"kpi\"><span>Executadas</span><b>${feitos.length}/${CATALOGO.length}</b></div>\n    <div class=\"kpi ok\"><span>Sucesso</span><b>${okN}</b></div>\n    <div class=\"kpi err\"><span>Falha</span><b>${feitos.length - okN}</b></div>\n    <div class=\"kpi\"><span>Tempo médio</span><b>${fmtMs(durs.length ? durs.reduce((a, b) => a + b, 0) / durs.length : null)}</b></div>\n    <div class=\"kpi\"><span>p95</span><b>${fmtMs(pct(durs, 95))}</b></div>\n    <div class=\"kpi\"><span>Mais lenta</span><b>${durs.length ? fmtMs(Math.max(...durs)) : '-'}</b></div>\n    ${s.ultimoLote ? `<div class=\"kpi wide\"><span>Último lote</span><b><a data-act=\"logsDoRun\" data-id=\"${esc(s.ultimoLote.runId)}\">${esc(s.ultimoLote.runId)}</a> · ${s.ultimoLote.feitos}/${s.ultimoLote.total} em ${fmtMs(s.ultimoLote.ms)}</b></div>` : ''}\n  </div>\n  <div class=\"note\">“Rodar todas as leituras” nunca dispara escritas. Escritas (laranja) só rodam por clique individual ou seleção, sempre com confirmação: elas criam/alteram dados reais no Workday/ServiceNow de HML.</div>\n  ${grupos || '<div class=\"empty\">Nenhuma requisição encontrada.</div>'}`;\n}\n\nfunction viewLogs(d2, s) {\n  const f = s.filtros || {};\n  const rows = logsFiltradosTexto(s);\n  const linhas = rows.map(linhaDoLog);\n  const per = 50;\n  const page = Math.min(s.logsPage || 0, Math.max(0, Math.ceil(rows.length / per) - 1));\n  const vis = rows.slice(page * per, page * per + per);\n  const okN = rows.filter((r) => r.ok).length;\n  const durs = rows.map((r) => r.duration_ms).filter((x) => typeof x === 'number');\n  const res = s.logsResumo ? resumoPorRequisicao(linhas) : [];\n  return `\n  <div class=\"filters\">\n    <label class=\"f\">De<input type=\"date\" data-flt=\"de\" value=\"${esc(f.de || '')}\"></label>\n    <label class=\"f\">Até<input type=\"date\" data-flt=\"ate\" value=\"${esc(f.ate || '')}\"></label>\n    <label class=\"f\">E-mail testador<input data-flt=\"email\" value=\"${esc(f.email || '')}\" placeholder=\"igual a…\"></label>\n    <label class=\"f\">employee_id<input data-flt=\"employee_id\" value=\"${esc(f.employee_id || '')}\"></label>\n    <label class=\"f\">Requisição<select data-flt=\"request_key\"><option value=\"\">todas</option>${CATALOGO.map((c) => `<option value=\"${esc(c.key)}\" ${f.request_key === c.key ? 'selected' : ''}>${esc(c.name)}</option>`).join('')}</select></label>\n    <label class=\"f\">Resultado<select data-flt=\"ok\"><option value=\"\">todos</option><option value=\"ok\" ${f.ok === 'ok' ? 'selected' : ''}>sucesso</option><option value=\"falha\" ${f.ok === 'falha' ? 'selected' : ''}>falha</option></select></label>\n    <label class=\"f\">Tipo<select data-flt=\"kind\"><option value=\"\">todos</option><option value=\"leitura\" ${f.kind === 'leitura' ? 'selected' : ''}>leitura</option><option value=\"escrita\" ${f.kind === 'escrita' ? 'selected' : ''}>escrita</option></select></label>\n    <label class=\"f\">run_id<input data-flt=\"run_id\" value=\"${esc(f.run_id || '')}\"></label>\n    <label class=\"f\">Limite<select data-flt=\"limite\">${[200, 500, 1000, 2000].map((n) => `<option ${Number(f.limite || 1000) === n ? 'selected' : ''}>${n}</option>`).join('')}</select></label>\n    <div class=\"fbtn\"><button class=\"btn\" data-act=\"buscarLogs\" ${s.logsLoading ? 'disabled' : ''}>${s.logsLoading ? 'Buscando…' : 'Buscar'}</button>\n      <button class=\"btn ghost\" data-act=\"limparFiltros\">limpar</button>\n      <button class=\"btn ghost\" data-act=\"hoje\">hoje</button></div>\n  </div>\n  <div class=\"bar\">\n    <input class=\"search\" data-flt=\"texto\" value=\"${esc(f.texto || '')}\" placeholder=\"Filtrar nos resultados (nome, erro, e-mail, status…)\">\n    <span class=\"sp\"></span>\n    <label class=\"inl\"><input type=\"checkbox\" data-in=\"expResp\" ${s.expResp ? 'checked' : ''}> incluir respostas</label>\n    <label class=\"inl\"><input type=\"checkbox\" data-in=\"expDetalhe\" ${s.expDetalhe ? 'checked' : ''}> PDF com página por teste</label>\n    <button class=\"btn ghost\" data-act=\"expLogsCsv\" ${!rows.length ? 'disabled' : ''}>Exportar CSV</button>\n    <button class=\"btn ghost\" data-act=\"expLogsPdf\" ${!rows.length ? 'disabled' : ''}>Exportar PDF</button>\n  </div>\n  ${s.logsErro ? `<div class=\"errbox\">${esc(s.logsErro)}</div>` : ''}\n  <div class=\"kpis\">\n    <div class=\"kpi\"><span>Registros</span><b>${rows.length}${s.logsTotal > (s.logs || []).length ? ` <small>de ${s.logsTotal}</small>` : ''}</b></div>\n    <div class=\"kpi ok\"><span>Sucesso</span><b>${okN} ${rows.length ? `<small>${Math.round((okN / rows.length) * 100)}%</small>` : ''}</b></div>\n    <div class=\"kpi err\"><span>Falha</span><b>${rows.length - okN}</b></div>\n    <div class=\"kpi\"><span>Tempo médio</span><b>${fmtMs(durs.length ? durs.reduce((a, b) => a + b, 0) / durs.length : null)}</b></div>\n    <div class=\"kpi\"><span>p95</span><b>${fmtMs(pct(durs, 95))}</b></div>\n    <div class=\"kpi wide\"><span>Visão</span><b><a data-act=\"toggleResumo\">${s.logsResumo ? 'ver execuções' : 'ver resumo por requisição'}</a></b></div>\n  </div>\n  ${!s.logsCarregado && !s.logsLoading ? '<div class=\"empty\">Ajuste os filtros e clique em Buscar.</div>' : s.logsResumo ? `\n  <table class=\"tbl\"><thead><tr><th>Requisição</th><th>Método</th><th>Tipo</th><th>Exec.</th><th>Sucesso</th><th>Média</th><th>p95</th><th>Máx</th><th>Último</th><th>Último erro</th></tr></thead><tbody>\n  ${res.map((g) => `<tr data-key=\"${esc(g.chave)}\" class=\"click\" data-act=\"filtrarReq\" data-k=\"${esc(g.chave)}\"><td>${esc(g.requisicao)}<div class=\"muted\"><code>${esc(g.chave)}</code></div></td><td>${badgeMetodo(g.metodo || '-')}</td><td>${badgeTipo(g.tipo)}</td><td>${g.n}</td>\n    <td><div class=\"bar100\"><div style=\"width:${g.taxa}%\"></div></div><b class=\"${g.taxa === 100 ? 'okc' : g.taxa === 0 ? 'errc' : 'warn'}\">${g.taxa}%</b></td><td>${fmtMs(g.media)}</td><td>${fmtMs(g.p95)}</td><td>${fmtMs(g.max)}</td>\n    <td>${g.ultimo ? `${g.ultimo.ok ? '<span class=\"okc\">✓</span>' : '<span class=\"errc\">✕</span>'} ${esc(fmtDt(g.ultimo.data))}` : ''}</td><td class=\"trunc\">${g.ultimo && !g.ultimo.ok ? esc(g.ultimo.erro) : ''}</td></tr>`).join('')}\n  </tbody></table>` : `\n  <table class=\"tbl\"><thead><tr><th>Data/hora</th><th>Requisição</th><th>Método</th><th>Status</th><th>Duração</th><th>Testador</th><th>employee_id</th><th>Erro</th><th>run_id</th></tr></thead><tbody>\n  ${vis.map((l) => `<tr data-key=\"${esc(l._id)}\" class=\"click ${l.ok ? '' : 'rerr'}\" data-act=\"openLog\" data-id=\"${esc(l._id)}\">\n    <td class=\"nw\">${esc(fmtDt(l.started_at || l.createdAt))}</td><td>${esc(l.request_name || l.request_key)} ${badgeTipo(l.kind)}</td><td>${badgeMetodo(l.method || '-')}</td>\n    <td>${l.ok ? `<span class=\"st st-ok\">✓ ${esc(l.status_code === 200 ? '2xx' : l.status_code)}</span>` : `<span class=\"st st-err\">✕ ${esc(l.status_code || 'erro')}</span>`}</td>\n    <td class=\"nw ${l.duration_ms > 8000 ? 'slow' : l.duration_ms > 3000 ? 'mid' : ''}\">${fmtMs(l.duration_ms)}</td><td>${esc(l.tester_email)}</td><td>${esc(l.employee_id)}</td>\n    <td class=\"trunc\">${esc(l.error_message)}</td><td class=\"muted nw\"><a data-act=\"logsDoRun\" data-id=\"${esc(l.run_id)}\">${esc(l.run_id)}</a></td></tr>`).join('')}\n  </tbody></table>\n  ${rows.length > per ? `<div class=\"pager\"><button class=\"btn ghost sm\" data-act=\"pg\" data-d=\"-1\" ${page === 0 ? 'disabled' : ''}>‹</button> página ${page + 1} de ${Math.ceil(rows.length / per)} <button class=\"btn ghost sm\" data-act=\"pg\" data-d=\"1\" ${(page + 1) * per >= rows.length ? 'disabled' : ''}>›</button></div>` : ''}`}`;\n}\n\nfunction viewDetalhe(d2, s) {\n  const d = s.detalhe;\n  if (!d) return '';\n  const l = d.row;\n  const r = l ? { ok: l.ok, status: l.status_code, data: l.response, error: l.error_message } : null;\n  return `\n  <div class=\"ovl\" data-act=\"closeDet\"></div>\n  <div class=\"drawer\">\n    <div class=\"dh\"><b>Detalhe do log</b> <code>${esc(d.id)}</code><span class=\"sp\"></span>\n      ${l ? `<button class=\"btn ghost sm\" data-act=\"rerun\">Reexecutar no runner</button><button class=\"btn ghost sm\" data-act=\"detCopy\">copiar JSON</button><button class=\"btn ghost sm\" data-act=\"detDl\">baixar .json</button><button class=\"btn ghost sm\" data-act=\"detPdf\">PDF</button>` : ''}\n      <button class=\"btn sm\" data-act=\"closeDet\">fechar</button></div>\n    <div class=\"db\">\n    ${d.loading ? '<div class=\"empty\"><span class=\"spin\"></span> carregando…</div>' : d.erro ? `<div class=\"errbox\">${esc(d.erro)}</div>` : !l ? '<div class=\"empty\">Log não encontrado.</div>' : `\n      <div class=\"dtitle\">${esc(l.request_name)} ${badgeMetodo(l.method || '-')} ${badgeTipo(l.kind)} ${badgeStatus({ ok: l.ok, status: l.status_code })}</div>\n      <div class=\"meta\">\n        <div><span>Duração</span><b>${fmtMs(l.duration_ms)}</b></div>\n        <div><span>Tamanho</span><b>${fmtBytes(l.response_size)}</b></div>\n        <div><span>Início</span><b>${esc(fmtDt(l.started_at))}</b></div>\n        <div><span>Fim</span><b>${esc(fmtDt(l.finished_at))}</b></div>\n        <div><span>Testador</span><b>${esc(l.tester_email)}</b></div>\n        <div><span>employee_id</span><b>${esc(l.employee_id)}</b></div>\n        <div><span>Chave</span><code>${esc(l.request_key)}</code></div>\n        <div><span>Request ref</span><code>${esc(l.request_ref)}</code></div>\n        <div><span>Client ref</span><code>${esc(l.client_ref)}</code></div>\n        <div><span>run_id</span><code>${esc(l.run_id)}</code></div>\n        <div><span>Ambiente</span><b>${esc(l.env)}</b></div>\n      </div>\n      ${!l.ok ? `<div class=\"errbox\"><b>${esc(l.error_message || 'Falhou')}</b>${diagnostico(r) && !(l.error_message || '').includes(diagnostico(r)) ? `<div>${esc(diagnostico(r))}</div>` : ''}</div>` : ''}\n      <div class=\"lbl\">Parâmetros enviados (token omitido)</div>${jsonHtml(l.params)}\n      <div class=\"lbl\">Retorno</div>${jsonHtml(l.response)}`}\n    </div>\n  </div>`;\n}\n\n// ---------- conversas HML ----------\nconst LENTA_MS = 15000;\nconst FLAGS = {\n  lenta: 'resposta > 15 s',\n  sem_resposta: 'mensagem sem resposta',\n  multiplas: 'mais de 1 msg do bot no turno',\n  sem_usecase: 'resposta sem usecase',\n  linha_branca: 'começa com linha em branco',\n  divergente: 'Gemini recebeu texto diferente do salvo',\n  erro_exec: 'execução com erro'\n};\nconst tsOf = (v) => { const t = new Date(v).getTime(); return isNaN(t) ? null : t; };\nconst fmtHora = (v) => { const d = new Date(v); return isNaN(d) ? '' : `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; };\nconst textoMsg = (m) => (m && (m.message || (m.text && m.text.body) || (typeof m.text === 'string' ? m.text : ''))) || '';\nconst normTxt = (s) => String(s || '').replace(/\\s+/g, ' ').trim();\nconst ontemIso = () => { const d = new Date(Date.now() - 86400000); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; };\n\nfunction mascarar(v, k) {\n  const sens = k && /token|senha|password|secret|refresh|authorization|cookie|api[_-]?key/i.test(k);\n  if (typeof v === 'string') return (sens || /^ya29\\./.test(v) || /^eyJ[\\w-]{8,}\\.[\\w-]+/.test(v)) ? `<oculto ${v.length} chars>` : v;\n  if (sens && v && typeof v === 'object') return '<oculto>';\n  if (Array.isArray(v)) return v.map((x) => mascarar(x));\n  if (v && typeof v === 'object') { const o = {}; for (const kk of Object.keys(v)) o[kk] = mascarar(v[kk], kk); return o; }\n  return v;\n}\n\nfunction mdLite(s) {\n  let h = esc(s);\n  h = h.replace(/\\*\\*([^*\\n]+)\\*\\*/g, (m, a) => `<b>${a}</b>`);\n  h = h.replace(/\\[([^\\]\\n]+)\\]\\((https?:[^)\\s]+)\\)/g, (m, a, u) => `<a href=\"${u}\" target=\"_blank\" rel=\"noopener\">${a}</a>`);\n  h = h.replace(/(^|[\\s(])(https?:\\/\\/[^\\s<)\"]+)/g, (m, p, u) => `${p}<a href=\"${u}\" target=\"_blank\" rel=\"noopener\">${u}</a>`);\n  return h;\n}\n\nfunction analisarSessao(sess) {\n  const msgs = sess.messages || sess.msgs || [];\n  const turnos = []; let cur = null;\n  for (const m of msgs) {\n    if (m.sender === 'HUMAN') { cur = { human: m, bots: [] }; turnos.push(cur); }\n    else if (m.sender === 'ASSISTANT') { if (!cur) { cur = { human: null, bots: [] }; turnos.push(cur); } cur.bots.push(m); }\n  }\n  const tempos = []; const flags = new Set(); const ucs = []; const steps = [];\n  for (const t of turnos) {\n    if (t.human && t.bots.length) { const d = tsOf(t.bots[0].time) - tsOf(t.human.time); if (d >= 0) { t.ms = d; tempos.push(d); if (d > LENTA_MS) flags.add('lenta'); } }\n    if (t.human && !t.bots.length) flags.add('sem_resposta');\n    if (t.bots.length > 1) flags.add('multiplas');\n    if (t.bots.length && !t.bots.some((b) => b.assistant && b.assistant.usecase)) flags.add('sem_usecase');\n    for (const b of t.bots) {\n      const u = b.assistant && b.assistant.usecase; const st = b.assistant && b.assistant.usecase_step;\n      if (u && !ucs.includes(u)) ucs.push(u);\n      if (st && !steps.includes(st)) steps.push(st);\n      if (/^[ \\t]*\\n/.test(textoMsg(b))) flags.add('linha_branca');\n    }\n  }\n  return {\n    turnos, tempos, ucs, steps, flags: [...flags], nHuman: turnos.filter((t) => t.human).length,\n    media: tempos.length ? tempos.reduce((a, b) => a + b, 0) / tempos.length : null, max: tempos.length ? Math.max(...tempos) : null\n  };\n}\n\n// associa cada execução do orquestrador à mensagem HUMAN mais próxima no tempo\nfunction casarExecucoes(sess, execs) {\n  const humanos = (sess.messages || []).filter((m) => m.sender === 'HUMAN');\n  const porHumano = {}; const usadas = new Set(); const sobras = [];\n  const ord = [...(execs || [])].sort((a, b) => tsOf(a.eventTime || a.createdAt) - tsOf(b.eventTime || b.createdAt));\n  for (const e of ord) {\n    const te = tsOf(e.eventTime || e.createdAt);\n    let best = null; let bd = 90000;\n    for (const h of humanos) { if (usadas.has(h.id)) continue; const d = Math.abs(tsOf(h.time) - te); if (d < bd) { bd = d; best = h; } }\n    if (best) { usadas.add(best.id); porHumano[best.id] = e; } else sobras.push(e);\n  }\n  return { porHumano, sobras };\n}\n\nfunction respostaExec(e) { const d = e && e.output && e.output.body && e.output.body.data; return (d && (d.answer || d.message)) || ''; }\n\nfunction filtroConversas(f) {\n  const q = {};\n  if (f.employee_id) q.employee_id = f.employee_id.trim();\n  if (f.chat_id) q.chat_id = f.chat_id.trim();\n  if (f.transbordo === 'sim') q.transbordo = true;\n  if (f.transbordo === 'nao') q.transbordo = { $ne: true };\n  if (f.gemini === 'sim') q.gemini = true;\n  if (f.gemini === 'nao') q.gemini = { $ne: true };\n  if (f.de || f.ate) {\n    q.createdAt = {};\n    if (f.de) q.createdAt.$gte = new Date(`${f.de}T00:00:00-03:00`).toISOString();\n    if (f.ate) q.createdAt.$lte = new Date(`${f.ate}T23:59:59.999-03:00`).toISOString();\n  }\n  return q;\n}\n\nasync function buscarConversas(d2) {\n  const f = d2.state.cfiltros || {};\n  d2.setState({ convLoading: true, convErro: '' });\n  try {\n    const res = await d2.rush('conversas').invoke({ filter: filtroConversas(f), limit: Number(f.limite) || 300 });\n    const out = (res && res.data) || {};\n    const rows = (out.rows || []).map((r) => ({ ...r, _an: analisarSessao(r) }));\n    d2.setState({ convs: rows, convTotal: out.total || 0, convLoading: false, convCarregado: Date.now(), convPage: 0 });\n  } catch (e) {\n    d2.setState({ convLoading: false, convErro: (e && e.message) || 'Erro ao buscar conversas' });\n  }\n}\n\nfunction convsFiltradas(s) {\n  const f = s.cfiltros || {};\n  const t = (f.texto || '').toLowerCase().trim();\n  return (s.convs || []).filter((c) => {\n    if (f.usecase && !c._an.ucs.includes(f.usecase)) return false;\n    if (f.status && c.status !== f.status) return false;\n    if (f.problema === 'qualquer' && !c._an.flags.length) return false;\n    if (f.problema && f.problema !== 'qualquer' && !c._an.flags.includes(f.problema)) return false;\n    if (t && ![c.employee_name, c.employee_id, c.chat_id, c.primeira, c.status, c.atendimento_tema, c._an.ucs.join(' '), c._an.steps.join(' ')].some((v) => String(v || '').toLowerCase().includes(t))) return false;\n    return true;\n  });\n}\n\nasync function abrirConversa(d2, id) {\n  d2.setState({ convDet: { id, loading: true, aba: 'linha' }, convRaw: {} });\n  try {\n    const res = await d2.rush('conversa').invoke({ id });\n    const sess = res && res.data && res.data.session;\n    if (!sess) { d2.setState({ convDet: { id, erro: 'Conversa não encontrada' } }); return; }\n    d2.setState({ convDet: { ...d2.state.convDet, loading: false, sess, exLoading: true } });\n    try {\n      const r2 = await d2.rush('execucoes').invoke({ chat_id: sess.chat_id });\n      const ex = (r2 && r2.data) || {};\n      if (d2.state.convDet && d2.state.convDet.id === id) d2.setState({ convDet: { ...d2.state.convDet, exLoading: false, execs: ex.execucoes || [], tb: ex.transbordo || [] } });\n    } catch (e) {\n      if (d2.state.convDet && d2.state.convDet.id === id) d2.setState({ convDet: { ...d2.state.convDet, exLoading: false, exErro: (e && e.message) || 'Erro ao buscar execuções' } });\n    }\n  } catch (e) {\n    d2.setState({ convDet: { id, erro: (e && e.message) || 'Erro ao abrir conversa' } });\n  }\n}\n\nasync function abrirUcInfo(d2, usecase, step) {\n  d2.setState({ ucInfo: { usecase, step, loading: true } });\n  try {\n    const res = await d2.rush('ucinfo').invoke({ usecase, step: step || '' });\n    d2.setState({ ucInfo: { usecase, step, ...((res && res.data) || {}) } });\n  } catch (e) {\n    d2.setState({ ucInfo: { usecase, step, erro: (e && e.message) || 'Erro ao buscar usecase' } });\n  }\n}\n\nfunction flagsDaConversa(det) {\n  const sess = det.sess; const an = analisarSessao(sess); const flags = new Set(an.flags);\n  const { porHumano } = casarExecucoes(sess, det.execs || []);\n  for (const t of an.turnos) {\n    const e = t.human && porHumano[t.human.id];\n    if (!e) continue;\n    if (e.result && e.result !== 'success') flags.add('erro_exec');\n    const ans = respostaExec(e);\n    if (ans && t.bots.length && normTxt(ans) !== normTxt(textoMsg(t.bots[0]))) flags.add('divergente');\n  }\n  return [...flags];\n}\n\nfunction relatorioConversa(det) {\n  const s = det.sess; const an = analisarSessao(s); const { porHumano } = casarExecucoes(s, det.execs || []);\n  const L = [];\n  L.push(`# Conversa HML ${s.chat_id}`);\n  L.push(`- Sessão: ${s._id}`);\n  L.push(`- Colaborador: ${s.employee_name || ''} (${s.employee_id || ''})`);\n  L.push(`- Início: ${fmtDt(s.createdAt)} | Status: ${s.status || ''} | Gemini: ${s.gemini ? 'sim' : 'não'} | Transbordo: ${s.transbordo ? 'sim' : 'não'}`);\n  L.push(`- Usecases: ${an.ucs.join(', ') || '-'} | Steps: ${an.steps.join(', ') || '-'}`);\n  const fl = flagsDaConversa(det); if (fl.length) L.push(`- Alertas: ${fl.map((f) => FLAGS[f] || f).join('; ')}`);\n  L.push('');\n  an.turnos.forEach((t, i) => {\n    L.push(`## Turno ${i + 1}`);\n    if (t.human) L.push(`[${fmtHora(t.human.time)}] COLABORADOR: ${textoMsg(t.human) || (t.human.image ? '[arquivo] ' + t.human.image.link : '')}`);\n    const e = t.human && porHumano[t.human.id];\n    if (e) L.push(`   (orquestrador: ${fmtMs(e.durationInMs)}, ${e.result}${respostaExec(e) && t.bots.length && normTxt(respostaExec(e)) !== normTxt(textoMsg(t.bots[0])) ? ', Gemini recebeu: \"' + normTxt(respostaExec(e)).slice(0, 300) + '\"' : ''})`);\n    t.bots.forEach((b) => L.push(`[${fmtHora(b.time)}] BOT${b.assistant && b.assistant.usecase ? ' <' + b.assistant.usecase + (b.assistant.usecase_step ? ' / ' + b.assistant.usecase_step : '') + '>' : ''}${t.ms != null && b === t.bots[0] ? ' (' + fmtMs(t.ms) + ')' : ''}: ${textoMsg(b)}`));\n    L.push('');\n  });\n  if ((det.tb || []).length) {\n    L.push('## Transbordo');\n    det.tb.forEach((x) => L.push(`[${fmtHora(x.createdAt)}] ${x.sender}${x.author_name ? ' ' + x.author_name : ''}: ${x.text || (x.file ? '[arquivo]' : '')}`));\n  }\n  return L.join('\\n');\n}\n\nfunction exportarConversasCsv(rows) {\n  const cols = ['data', 'chat_id', 'sessao', 'employee_id', 'employee_name', 'status', 'gemini', 'transbordo', 'turnos', 'usecases', 'steps', 'tempo_medio_ms', 'tempo_max_ms', 'alertas', 'primeira_mensagem'];\n  const cel = (v) => { const s = v == null ? '' : String(v); return /[\";\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s; };\n  const linhas = rows.map((c) => [fmtDt(c.createdAt), c.chat_id, c._id, c.employee_id, c.employee_name, c.status, c.gemini ? 'sim' : 'nao', c.transbordo ? 'sim' : 'nao', c._an.nHuman, c._an.ucs.join(' | '), c._an.steps.join(' | '), c._an.media == null ? '' : Math.round(c._an.media), c._an.max == null ? '' : c._an.max, c._an.flags.map((f) => FLAGS[f] || f).join(' | '), c.primeira].map(cel).join(';'));\n  baixar(`conversas_hml_${hojeIso()}.csv`, '﻿' + [cols.join(';')].concat(linhas).join('\\r\\n'), 'text/csv;charset=utf-8');\n}\n\nfunction exportarConversaPdf(d2, det) {\n  const jsMod = d2.lib('jspdf@2.5.1');\n  const JsPDF = jsMod && (jsMod.jsPDF || (jsMod.default && (jsMod.default.jsPDF || jsMod.default)));\n  const txt = relatorioConversa(det);\n  if (!JsPDF) { const w = window.open('', '_blank'); if (!w) return false; w.document.write(`<pre style=\"white-space:pre-wrap;font:11px monospace\">${esc(txt)}</pre><script>setTimeout(()=>window.print(),300)<\\/script>`); w.document.close(); return true; }\n  const doc = new JsPDF({ unit: 'pt', format: 'a4' });\n  const W = doc.internal.pageSize.getWidth(); const H = doc.internal.pageSize.getHeight();\n  let y = 36; doc.setFont('courier', 'normal'); doc.setFontSize(8);\n  for (const ln of doc.splitTextToSize(asciiPdf(txt), W - 56)) { if (y > H - 30) { doc.addPage(); y = 36; } doc.text(ln, 28, y); y += 10; }\n  doc.save(`conversa_hml_${det.sess.chat_id}.pdf`);\n  return true;\n}\n\nfunction chipUc(u, st) { return u ? `<span class=\"uc\" data-act=\"ucInfo\" data-uc=\"${esc(u)}\" data-st=\"${esc(st || '')}\" title=\"ver configuração do usecase/step\">${esc(u)}${st ? ` <i>› ${esc(st)}</i>` : ''}</span>` : ''; }\nfunction chipsFlags(fl) { return fl.map((f) => `<span class=\"fl fl-${esc(f)}\" title=\"${esc(FLAGS[f] || f)}\">⚠ ${esc(FLAGS[f] || f)}</span>`).join(''); }\n\nfunction viewConversas(d2, s) {\n  const f = s.cfiltros || {};\n  const rows = convsFiltradas(s);\n  const todas = s.convs || [];\n  const ucsAll = {}; const stAll = {}; const flAll = {};\n  for (const c of todas) { c._an.ucs.forEach((u) => { ucsAll[u] = (ucsAll[u] || 0) + 1; }); stAll[c.status || '-'] = (stAll[c.status || '-'] || 0) + 1; c._an.flags.forEach((x) => { flAll[x] = (flAll[x] || 0) + 1; }); }\n  const tempos = rows.flatMap((c) => c._an.tempos);\n  const nTurnos = rows.reduce((a, c) => a + c._an.nHuman, 0);\n  const nTb = rows.filter((c) => c.transbordo).length;\n  const nAl = rows.filter((c) => c._an.flags.length).length;\n  const per = 50; const page = Math.min(s.convPage || 0, Math.max(0, Math.ceil(rows.length / per) - 1));\n  const vis = rows.slice(page * per, page * per + per);\n  const topUcs = Object.entries(ucsAll).sort((a, b) => b[1] - a[1]).slice(0, 12);\n  return `\n  <div class=\"filters\">\n    <label class=\"f\">De<input type=\"date\" data-cflt=\"de\" value=\"${esc(f.de || '')}\"></label>\n    <label class=\"f\">Até<input type=\"date\" data-cflt=\"ate\" value=\"${esc(f.ate || '')}\"></label>\n    <label class=\"f\">employee_id<input data-cflt=\"employee_id\" value=\"${esc(f.employee_id || '')}\"></label>\n    <label class=\"f\">chat_id<input data-cflt=\"chat_id\" value=\"${esc(f.chat_id || '')}\"></label>\n    <label class=\"f\">Transbordo<select data-cflt=\"transbordo\"><option value=\"\">todos</option><option value=\"sim\" ${f.transbordo === 'sim' ? 'selected' : ''}>com transbordo</option><option value=\"nao\" ${f.transbordo === 'nao' ? 'selected' : ''}>sem transbordo</option></select></label>\n    <label class=\"f\">Interface<select data-cflt=\"gemini\"><option value=\"\">todas</option><option value=\"sim\" ${f.gemini === 'sim' ? 'selected' : ''}>Gemini</option><option value=\"nao\" ${f.gemini === 'nao' ? 'selected' : ''}>app antigo</option></select></label>\n    <label class=\"f\">Limite<select data-cflt=\"limite\">${[100, 300, 500, 1000].map((n) => `<option ${Number(f.limite || 300) === n ? 'selected' : ''}>${n}</option>`).join('')}</select></label>\n    <div class=\"fbtn\"><button class=\"btn\" data-act=\"buscarConvs\" ${s.convLoading ? 'disabled' : ''}>${s.convLoading ? 'Buscando…' : 'Buscar'}</button>\n      <button class=\"btn ghost\" data-act=\"convHoje\">hoje</button><button class=\"btn ghost\" data-act=\"conv7d\">7 dias</button></div>\n  </div>\n  <div class=\"bar\">\n    <input class=\"search\" data-cflt=\"texto\" value=\"${esc(f.texto || '')}\" placeholder=\"Filtrar: nome, mensagem, usecase, step, chat_id…\">\n    <select data-cflt=\"usecase\"><option value=\"\">todos os usecases</option>${Object.keys(ucsAll).sort().map((u) => `<option value=\"${esc(u)}\" ${f.usecase === u ? 'selected' : ''}>${esc(u)} (${ucsAll[u]})</option>`).join('')}</select>\n    <select data-cflt=\"status\"><option value=\"\">todos os status</option>${Object.keys(stAll).sort().map((u) => `<option value=\"${esc(u)}\" ${f.status === u ? 'selected' : ''}>${esc(u)} (${stAll[u]})</option>`).join('')}</select>\n    <select data-cflt=\"problema\"><option value=\"\">sem filtro de alerta</option><option value=\"qualquer\" ${f.problema === 'qualquer' ? 'selected' : ''}>com qualquer alerta</option>${Object.keys(FLAGS).filter((k) => flAll[k]).map((k) => `<option value=\"${k}\" ${f.problema === k ? 'selected' : ''}>${esc(FLAGS[k])} (${flAll[k]})</option>`).join('')}</select>\n    <span class=\"sp\"></span>\n    <button class=\"btn ghost\" data-act=\"expConvCsv\" ${!rows.length ? 'disabled' : ''}>Exportar CSV</button>\n  </div>\n  ${s.convErro ? `<div class=\"errbox\">${esc(s.convErro)}</div>` : ''}\n  <div class=\"kpis\">\n    <div class=\"kpi\"><span>Conversas</span><b>${rows.length}${s.convTotal > todas.length ? ` <small>de ${s.convTotal} (aumente o limite)</small>` : ''}</b></div>\n    <div class=\"kpi\"><span>Turnos</span><b>${nTurnos}</b></div>\n    <div class=\"kpi\"><span>Resposta média</span><b>${fmtMs(tempos.length ? tempos.reduce((a, b) => a + b, 0) / tempos.length : null)}</b></div>\n    <div class=\"kpi\"><span>p95</span><b>${fmtMs(pct(tempos, 95))}</b></div>\n    <div class=\"kpi\"><span>Transbordo</span><b>${nTb} ${rows.length ? `<small>${Math.round((nTb / rows.length) * 100)}%</small>` : ''}</b></div>\n    <div class=\"kpi err\"><span>Com alertas</span><b>${nAl}</b></div>\n  </div>\n  ${topUcs.length ? `<div class=\"ucbar\">${topUcs.map(([u, n]) => `<span class=\"uc ${f.usecase === u ? 'on' : ''}\" data-act=\"filtraUc\" data-uc=\"${esc(u)}\">${esc(u)} <b>${n}</b></span>`).join('')}</div>` : ''}\n  ${!s.convCarregado && !s.convLoading ? '<div class=\"empty\">Ajuste os filtros e clique em Buscar.</div>' : `\n  <table class=\"tbl\"><thead><tr><th>Início</th><th>Colaborador</th><th>Primeira mensagem</th><th>Turnos</th><th>Usecases / steps</th><th>Status</th><th>Resp. média</th><th>Máx</th><th>Alertas</th></tr></thead><tbody>\n  ${vis.map((c) => `<tr data-key=\"${esc(c._id)}\" class=\"click ${c._an.flags.length ? 'rwarn' : ''}\" data-act=\"abrirConv\" data-id=\"${esc(c._id)}\">\n    <td class=\"nw\">${esc(fmtDt(c.createdAt))}</td>\n    <td>${esc(c.employee_name || '-')}<div class=\"muted\">${esc(c.employee_id || '')}${c.gemini ? ' · Gemini' : ' · app'}</div></td>\n    <td class=\"tmsg\">${esc((c.primeira || '').slice(0, 140))}</td>\n    <td>${c._an.nHuman}</td>\n    <td class=\"ucs\">${c._an.ucs.map((u) => `<span class=\"uc sm\">${esc(u)}</span>`).join('')}${c._an.steps.length ? `<div class=\"muted\">${esc(c._an.steps.join(' › '))}</div>` : ''}</td>\n    <td>${esc(c.status || '')}${c.transbordo ? `<div class=\"muted\">↪ transbordo${c.agent_name ? ' · ' + esc(c.agent_name) : ''}</div>` : ''}</td>\n    <td class=\"nw ${c._an.media > LENTA_MS ? 'slow' : c._an.media > 8000 ? 'mid' : ''}\">${fmtMs(c._an.media)}</td>\n    <td class=\"nw ${c._an.max > LENTA_MS ? 'slow' : ''}\">${fmtMs(c._an.max)}</td>\n    <td>${chipsFlags(c._an.flags)}</td></tr>`).join('')}\n  </tbody></table>\n  ${rows.length > per ? `<div class=\"pager\"><button class=\"btn ghost sm\" data-act=\"cpg\" data-d=\"-1\" ${page === 0 ? 'disabled' : ''}>‹</button> página ${page + 1} de ${Math.ceil(rows.length / per)} <button class=\"btn ghost sm\" data-act=\"cpg\" data-d=\"1\" ${(page + 1) * per >= rows.length ? 'disabled' : ''}>›</button></div>` : ''}`}`;\n}\n\nfunction viewTimings(e) {\n  const tm = (e && e.output && e.output.timings) || [];\n  const fases = tm.filter((t) => /^0\\d_[a-z]+$/.test(t.label) && t.label !== '04_op' || t.label === '04_op_response');\n  const tot = (e && e.durationInMs) || fases.reduce((a, t) => a + (t.dur || 0), 0) || 1;\n  if (!fases.length) return '';\n  const cores = ['#93c5fd', '#a5b4fc', '#c4b5fd', '#f9a8d4', '#fca5a5', '#fcd34d', '#86efac'];\n  return `<div class=\"tbar\">${fases.map((t, i) => `<div style=\"width:${Math.max(0.5, (t.dur / tot) * 100)}%;background:${cores[i % cores.length]}\" title=\"${esc(t.label)}: ${fmtMs(t.dur)}\"></div>`).join('')}</div>\n    <div class=\"tleg\">${fases.map((t, i) => `<span><i style=\"background:${cores[i % cores.length]}\"></i>${esc(t.label.replace(/^0\\d_/, ''))} ${fmtMs(t.dur)}</span>`).join('')}</div>`;\n}\n\nfunction viewConversaDetalhe(d2, s) {\n  const det = s.convDet;\n  if (!det) return '';\n  const sess = det.sess;\n  const raw = s.convRaw || {};\n  let corpo = '';\n  if (det.loading) corpo = '<div class=\"empty\"><span class=\"spin\"></span> carregando conversa…</div>';\n  else if (det.erro) corpo = `<div class=\"errbox\">${esc(det.erro)}</div>`;\n  else if (sess) {\n    const an = analisarSessao(sess);\n    const { porHumano, sobras } = casarExecucoes(sess, det.execs || []);\n    const turnoDoHumano = {}; an.turnos.forEach((t, i) => { if (t.human) turnoDoHumano[t.human.id] = { t, i }; });\n    const fl = flagsDaConversa(det);\n    const aba = det.aba || 'linha';\n    const itens = [];\n    (sess.messages || []).forEach((m, i) => itens.push({ k: 'msg', t: tsOf(m.time), o: i, m }));\n    (det.tb || []).forEach((x, i) => itens.push({ k: 'tb', t: tsOf(x.createdAt), o: 10000 + i, x }));\n    itens.sort((a, b) => (a.t - b.t) || (a.o - b.o));\n    const linha = itens.map((it) => {\n      if (it.k === 'tb') {\n        const x = it.x;\n        return `<div class=\"msg tb tb-${esc(String(x.sender || '').toLowerCase())}\"><div class=\"mh\"><b>${x.sender === 'AGENT' ? '🎧 Atendente' : x.sender === 'HUMAN' ? '👤 Colaborador' : x.sender === 'SYSTEM' ? '⚙ Sistema' : '🤖 Bot'}</b> ${esc(x.author_name || '')} <span class=\"tag2\">transbordo</span><span class=\"sp\"></span><span class=\"muted\">${esc(fmtHora(x.createdAt))}</span></div>\n          <div class=\"mt2\">${x.text ? mdLite(x.text) : ''}${x.file ? `<div><a href=\"${esc(x.file.url || x.file.link || '')}\" target=\"_blank\">📎 ${esc(x.file.name || 'arquivo')}</a></div>` : ''}</div></div>`;\n      }\n      const m = it.m; const id = m.id || `i${it.o}`;\n      const isH = m.sender === 'HUMAN';\n      const txt = textoMsg(m);\n      const td = isH ? turnoDoHumano[m.id] : null;\n      const turno = !isH ? an.turnos.find((t) => t.bots.includes(m)) : null;\n      const primeiroBot = turno && turno.bots[0] === m;\n      const ex = isH ? porHumano[m.id] : null;\n      const ansEx = ex ? respostaExec(ex) : '';\n      const divergente = ex && ansEx && td && td.t.bots.length && normTxt(ansEx) !== normTxt(textoMsg(td.t.bots[0]));\n      const lb = !isH && /^[ \\t]*\\n/.test(txt);\n      return `<div class=\"msg ${isH ? 'hu' : 'bo'}\" data-key=\"${esc(id)}\">\n        <div class=\"mh\"><b>${isH ? '👤 Colaborador' : '🤖 Bot'}</b>${td ? ` <span class=\"muted\">turno ${td.i + 1}</span>` : ''} ${!isH && m.assistant ? chipUc(m.assistant.usecase, m.assistant.usecase_step) : ''}\n          ${!isH && !(m.assistant && m.assistant.usecase) ? '<span class=\"fl\">sem usecase</span>' : ''}${lb ? '<span class=\"fl\">começa com linha em branco</span>' : ''}${turno && !primeiroBot ? '<span class=\"fl\">msg extra no turno</span>' : ''}\n          <span class=\"sp\"></span>${primeiroBot && turno.ms != null ? `<span class=\"dur ${turno.ms > LENTA_MS ? 'slow' : turno.ms > 8000 ? 'mid' : ''}\">⏱ ${fmtMs(turno.ms)}</span>` : ''}<span class=\"muted\">${esc(fmtHora(m.time))}</span>\n          <button class=\"btn ghost xs\" data-act=\"convRaw\" data-id=\"${esc(id)}\">{ }</button></div>\n        <div class=\"mt2\">${txt ? mdLite(txt) : ''}${m.image && m.image.link ? `<div class=\"img\"><a href=\"${esc(m.image.link)}\" target=\"_blank\"><img src=\"${esc(m.image.link)}\" alt=\"anexo\" loading=\"lazy\"></a><div class=\"muted\">📎 ${esc(m.type || 'arquivo')} · <a href=\"${esc(m.image.link)}\" target=\"_blank\">abrir</a></div></div>` : ''}${m.document && (m.document.link || m.document.url) ? `<div><a href=\"${esc(m.document.link || m.document.url)}\" target=\"_blank\">📄 documento</a></div>` : ''}</div>\n        ${raw[id] ? jsonHtml(mascarar(m)) : ''}\n      </div>\n      ${ex ? `<div class=\"exec ${ex.result !== 'success' ? 'exerr' : ''} ${divergente ? 'exdiv' : ''}\">\n        <div class=\"mh\">⚙ <b>Orquestrador HML</b> <span class=\"muted\">${esc(fmtHora(ex.eventTime))}</span> · <b>${fmtMs(ex.durationInMs)}</b> · ${ex.result === 'success' ? '<span class=\"okc\">success</span>' : `<span class=\"errc\">${esc(ex.result || 'erro')}</span>`}${ex.output && ex.output.body && ex.output.body.data && ex.output.body.data.usecase ? ' · ' + chipUc(ex.output.body.data.usecase) : ''}\n          <span class=\"sp\"></span><button class=\"btn ghost xs\" data-act=\"convRaw\" data-id=\"ex_${esc(ex._id)}\">{ }</button></div>\n        ${viewTimings(ex)}\n        ${ex.error ? `<div class=\"errbox\">${esc(safeStr(ex.error))}</div>` : ''}\n        ${divergente ? `<div class=\"divbox\"><b>⚠ O Gemini recebeu um texto diferente do que foi salvo na sessão:</b><div class=\"mt2\">${mdLite(ansEx)}</div></div>` : ''}\n        ${raw['ex_' + ex._id] ? jsonHtml(mascarar(ex)) : ''}\n      </div>` : ''}`;\n    }).join('');\n\n    const tabExec = `\n      ${det.exLoading ? '<div class=\"empty\"><span class=\"spin\"></span> buscando execuções…</div>' : det.exErro ? `<div class=\"errbox\">${esc(det.exErro)}</div>` : !(det.execs || []).length ? '<div class=\"empty\">Nenhuma execução do orquestrador HML encontrada para este chat_id (conversas do app antigo não passam por ele).</div>' : `\n      <table class=\"tbl\"><thead><tr><th>Hora</th><th>Mensagem enviada</th><th>Usecase</th><th>Duração</th><th>Resultado</th><th>Origem</th><th>Fases</th></tr></thead><tbody>\n      ${[...det.execs].sort((a, b) => tsOf(a.eventTime) - tsOf(b.eventTime)).map((e) => `<tr data-key=\"${esc(e._id)}\" class=\"click\" data-act=\"convRaw\" data-id=\"ex_${esc(e._id)}\"><td class=\"nw\">${esc(fmtHora(e.eventTime))}</td><td class=\"tmsg\">${esc((e.body && e.body.message && (e.body.message.text || (e.body.message.file ? '[arquivo]' : ''))) || '')}</td>\n        <td>${e.output && e.output.body && e.output.body.data && e.output.body.data.usecase ? `<span class=\"uc sm\">${esc(e.output.body.data.usecase)}</span>` : '-'}</td><td class=\"nw ${e.durationInMs > LENTA_MS ? 'slow' : ''}\">${fmtMs(e.durationInMs)}</td>\n        <td>${e.result === 'success' ? '<span class=\"okc\">success</span>' : `<span class=\"errc\">${esc(e.result || '')}</span>`}</td><td class=\"muted\">${esc(e.caller || '')}</td><td style=\"min-width:220px\">${viewTimings(e)}</td></tr>\n        ${raw['ex_' + e._id] ? `<tr><td colspan=\"7\">${jsonHtml(mascarar(e))}</td></tr>` : ''}`).join('')}\n      </tbody></table>\n      ${sobras.length ? `<div class=\"note\">${sobras.length} execução(ões) sem mensagem correspondente na sessão (ex.: mensagem que não foi salva, ou reenvio).</div>` : ''}`}`;\n\n    const campos = ['_id', 'chat_id', 'employee_id', 'employee_name', 'status', 'gemini', 'transbordo', 'atendimento_tema', 'fila_atendimento', 'agent_name', 'agent_email', 'ia_concluido_em', 'atendimento_aberto_em', 'atendimento_iniciado_em', 'atendimento_concluido_em', 'chamado_aberto', 'management_level', 'compensation_grade', 'region', 'country', 'location', 'company', 'tempo_de_casa', 'exception_key', 'varejo', 'venda_direta', 'first_employee_session', 'createdAt', 'updatedAt'];\n    const tabSessao = `<div class=\"meta\">${campos.filter((k) => sess[k] !== undefined && sess[k] !== null && sess[k] !== '').map((k) => `<div><span>${esc(k)}</span><b title=\"${esc(sess[k])}\">${esc(/(_em|At)$/.test(k) ? fmtDt(sess[k]) : typeof sess[k] === 'boolean' ? (sess[k] ? 'sim' : 'não') : sess[k])}</b></div>`).join('')}</div>\n      ${sess.transbordo_link ? `<div class=\"note\">${mdLite(sess.transbordo_link)}</div>` : ''}\n      <div class=\"lbl\">chat_store (sensíveis ocultos)</div>${jsonHtml(mascarar(sess.chat_store || {}))}\n      <div class=\"lbl\">domain_store (sensíveis ocultos)</div>${jsonHtml(mascarar(sess.domain_store || {}))}`;\n\n    corpo = `\n      <div class=\"dtitle\">${esc(sess.employee_name || '-')} <span class=\"muted\">${esc(sess.employee_id || '')}</span> <code>${esc(sess.chat_id)}</code>\n        <span class=\"st ${sess.transbordo ? 'st-err' : 'st-ok'}\">${esc(sess.status || '')}</span>${sess.gemini ? '<span class=\"tag\">Gemini</span>' : '<span class=\"tag\">app antigo</span>'}</div>\n      <div class=\"sumrow\"><span>${an.nHuman} turnos</span><span>resposta média <b>${fmtMs(an.media)}</b></span><span>máx <b>${fmtMs(an.max)}</b></span><span>${an.ucs.map((u) => chipUc(u)).join(' ')}</span></div>\n      ${fl.length ? `<div class=\"flrow\">${chipsFlags(fl)}</div>` : ''}\n      <div class=\"subtabs\">\n        <button class=\"stab ${aba === 'linha' ? 'on' : ''}\" data-act=\"convAba\" data-v=\"linha\">Linha do tempo</button>\n        <button class=\"stab ${aba === 'exec' ? 'on' : ''}\" data-act=\"convAba\" data-v=\"exec\">Execuções do orquestrador ${det.exLoading ? '<span class=\"spin\"></span>' : `(${(det.execs || []).length})`}</button>\n        <button class=\"stab ${aba === 'sessao' ? 'on' : ''}\" data-act=\"convAba\" data-v=\"sessao\">Sessão</button>\n      </div>\n      ${aba === 'linha' ? `${det.exLoading ? '<div class=\"note\"><span class=\"spin\"></span> carregando execuções do orquestrador…</div>' : ''}<div class=\"timeline\">${linha || '<div class=\"empty\">Sem mensagens.</div>'}</div>` : aba === 'exec' ? tabExec : tabSessao}`;\n  }\n  return `\n  <div class=\"ovl\" data-act=\"closeConv\"></div>\n  <div class=\"drawer wide\">\n    <div class=\"dh\"><b>Conversa HML</b> ${sess ? `<code>${esc(sess._id)}</code>` : ''}<span class=\"sp\"></span>\n      ${sess ? `<button class=\"btn ghost sm\" data-act=\"convCopy\">copiar relatório</button><button class=\"btn ghost sm\" data-act=\"convTxt\">.txt</button><button class=\"btn ghost sm\" data-act=\"convJson\">.json</button><button class=\"btn ghost sm\" data-act=\"convPdf\">PDF</button><button class=\"btn ghost sm\" data-act=\"convReload\">recarregar</button>` : ''}\n      <button class=\"btn sm\" data-act=\"closeConv\">fechar</button></div>\n    <div class=\"db\">${corpo}</div>\n  </div>`;\n}\n\nfunction viewUcInfo(d2, s) {\n  const u = s.ucInfo;\n  if (!u) return '';\n  const envs = (x) => (x && x.length ? x.map((e) => `<span class=\"tag\">${esc(e)}</span>`).join('') : '<span class=\"tag\">todos os ambientes</span>');\n  let corpo = '';\n  if (u.loading) corpo = '<div class=\"empty\"><span class=\"spin\"></span> carregando…</div>';\n  else if (u.erro) corpo = `<div class=\"errbox\">${esc(u.erro)}</div>`;\n  else {\n    corpo = `<div class=\"lbl\">Usecase ${esc(u.usecase)} (${(u.usecases || []).length} registro(s))</div>\n    ${(u.usecases || []).map((x) => `<div class=\"card pad\"><div class=\"cname\">${esc(x.title)} ${x.active ? '<span class=\"st st-ok\">ativo</span>' : '<span class=\"st st-err\">inativo</span>'} ${envs(x.envs)} ${x.usecase_is_flux ? '<span class=\"tag\">fluxo</span>' : ''}</div>\n      <div class=\"csub\"><code>${esc(x._id)}</code> · atualizado ${esc(fmtDt(x.updatedAt))}</div>\n      ${x.instructions ? `<div class=\"lbl\">Instruções</div><pre class=\"pre\">${esc(x.instructions)}</pre>` : ''}\n      ${x.description_v_2 ? `<details class=\"mini\"><summary>Exemplos de gatilho</summary><pre class=\"pre\">${esc(x.description_v_2)}</pre></details>` : ''}\n      ${x.negative_examples ? `<details class=\"mini\"><summary>Exemplos negativos</summary><pre class=\"pre\">${esc(x.negative_examples)}</pre></details>` : ''}</div>`).join('') || '<div class=\"empty\">Nenhum usecase com esse label.</div>'}\n    ${u.step ? `<div class=\"lbl\">Step ${esc(u.step)} (${(u.steps || []).length} registro(s))</div>\n    ${(u.steps || []).map((x) => `<div class=\"card pad\"><div class=\"cname\">${esc(x.title)} ${x.active ? '<span class=\"st st-ok\">ativo</span>' : '<span class=\"st st-err\">inativo</span>'} ${x.start_step ? '<span class=\"tag\">step inicial</span>' : ''} ${envs(x.usecase_envs)} <span class=\"muted\">index ${esc(x.index)}</span></div>\n      <div class=\"csub\"><code>${esc(x._id)}</code> · usecase: ${esc(x.usecase_title || '')}${x.side_effect ? ` · side effect <code>${esc(x.side_effect)}</code>` : ''}</div>\n      ${(x.requests_before_answer || []).length ? `<div class=\"csub\">requests antes da resposta: ${x.requests_before_answer.map((r) => `<code>${esc(r)}</code>`).join(' ')}</div>` : ''}\n      ${x.instructions ? `<div class=\"lbl\">Instruções</div><pre class=\"pre\">${esc(x.instructions)}</pre>` : ''}\n      ${(x.variables || []).length ? `<div class=\"lbl\">Variáveis extraídas</div><table class=\"tbl\"><tbody>${x.variables.map((v) => `<tr><td><code>${esc(v.name)}</code></td><td>${esc(v.type || '')}</td><td>${esc(v.prompt || '')}</td><td>${v.remember ? 'lembra' : ''}</td></tr>`).join('')}</tbody></table>` : ''}\n      ${(x.next_steps || []).length ? `<div class=\"lbl\">Próximos steps</div><table class=\"tbl\"><tbody>${x.next_steps.map((n) => `<tr><td><span class=\"uc sm\" data-act=\"ucInfo\" data-uc=\"${esc(u.usecase)}\" data-st=\"${esc(n.label || '')}\">${esc(n.label || '')}</span></td><td><code>${esc(n.check || '')}</code></td><td>${esc(n.prompt || '')}</td></tr>`).join('')}</tbody></table>` : ''}\n      ${(x.alternatives || []).length ? `<div class=\"lbl\">Alternativas (botões)</div>${jsonHtml(x.alternatives)}` : ''}</div>`).join('') || '<div class=\"empty\">Nenhum step com esse label.</div>'}` : ''}`;\n  }\n  return `<div class=\"ovl top\" data-act=\"closeUc\"></div>\n  <div class=\"drawer uci\"><div class=\"dh\"><b>Configuração</b> <code>${esc(u.usecase)}</code>${u.step ? ` › <code>${esc(u.step)}</code>` : ''}<span class=\"sp\"></span><button class=\"btn sm\" data-act=\"closeUc\">fechar</button></div><div class=\"db\">${corpo}</div></div>`;\n}\n\nexport default {\n  css: `\n  :host{display:block;width:100%;height:100%}\n  *{box-sizing:border-box}\n  .app{height:100%;overflow:auto;background:#f4f5f7;color:#1f2328;font:13px/1.45 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}\n  .top{position:sticky;top:0;z-index:5;background:#111827;color:#fff;display:flex;align-items:center;gap:18px;padding:10px 20px}\n  .top h1{font-size:15px;margin:0;font-weight:650;letter-spacing:.2px}.top .env{background:#f59e0b;color:#111;border-radius:4px;padding:1px 7px;font-size:11px;font-weight:700}\n  .tabs{display:flex;gap:4px}.tab{background:transparent;border:0;color:#cbd5e1;padding:7px 12px;border-radius:6px;cursor:pointer;font:inherit}\n  .tab:hover{background:#1f2937;color:#fff}.tab.on{background:#374151;color:#fff;font-weight:600}\n  .wrap{padding:16px 20px 60px;max-width:1500px;margin:0 auto}\n  .cfg,.filters{display:flex;flex-wrap:wrap;gap:12px;background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:12px 14px;margin-bottom:12px}\n  .f{display:flex;flex-direction:column;gap:4px;font-size:11px;color:#57606a;font-weight:600;min-width:150px;flex:1}.f.grow2{flex:2;min-width:280px}\n  input,select,textarea{font:inherit;color:inherit;border:1px solid #d0d7de;border-radius:6px;padding:6px 8px;background:#fff;outline:none}\n  input:focus,select:focus,textarea:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb22}\n  .tokwrap{display:flex;gap:6px}.tokwrap input{flex:1;font-family:ui-monospace,Consolas,monospace}\n  .hint{font-weight:400;color:#6b7280}.warn{color:#b45309}\n  .fbtn{display:flex;align-items:flex-end;gap:6px}\n  .bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px}.sp{flex:1}\n  .search{min-width:260px;flex:0 1 360px}\n  .inl{display:flex;align-items:center;gap:6px;color:#57606a;font-size:12px}\n  .btn{border:1px solid #1f2937;background:#1f2937;color:#fff;border-radius:6px;padding:6px 12px;cursor:pointer;font:inherit;font-weight:550;white-space:nowrap}\n  .btn:hover{filter:brightness(1.15)}.btn:disabled{opacity:.45;cursor:not-allowed;filter:none}\n  .btn.ghost{background:#fff;color:#1f2328;border-color:#d0d7de}.btn.ghost:hover{background:#f6f8fa}\n  .btn.warnb{background:#c2410c;border-color:#c2410c}.btn.danger{background:#b91c1c;border-color:#b91c1c}\n  .btn.sm{padding:4px 10px;font-size:12px}.btn.xs{padding:1px 7px;font-size:11px;margin-left:4px}\n  .kpis{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:10px}\n  .kpi{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:8px 14px;min-width:120px}.kpi.wide{flex:1}\n  .kpi span{display:block;font-size:11px;color:#6b7280}.kpi b{font-size:17px}.kpi small{font-size:11px;color:#6b7280;font-weight:500}\n  .kpi.ok b{color:#16803d}.kpi.err b{color:#b91c1c}\n  .note{font-size:12px;color:#6b7280;margin:0 0 12px}\n  .grp{margin-bottom:16px}.gh{font-weight:650;font-size:12px;text-transform:uppercase;letter-spacing:.5px;color:#374151;margin:4px 2px 6px;display:flex;align-items:center;gap:6px}.gh.gw{color:#c2410c}\n  .right{margin-left:auto;display:inline-flex;gap:2px}\n  .card{background:#fff;border:1px solid #e5e7eb;border-left:4px solid #d1d5db;border-radius:8px;margin-bottom:6px}\n  .card.c-ok{border-left-color:#16a34a}.card.c-err{border-left-color:#dc2626}.card.c-dis{opacity:.6}\n  .crow{display:flex;align-items:center;gap:12px;padding:8px 12px}\n  .cinfo{flex:1;min-width:0;cursor:pointer}.cname{font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .csub{font-size:11px;color:#6b7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n  code{font-family:ui-monospace,Consolas,monospace;font-size:11px;background:#f3f4f6;padding:0 4px;border-radius:3px}\n  .cres{display:flex;align-items:center;gap:8px;min-width:150px;justify-content:flex-end}.cact{display:flex;gap:6px}\n  .mt{font-size:10px;font-weight:700;padding:1px 6px;border-radius:4px;background:#e5e7eb;color:#374151}\n  .mt-get{background:#dbeafe;color:#1d4ed8}.mt-post{background:#dcfce7;color:#15803d}.mt-put,.mt-patch{background:#fef3c7;color:#b45309}.mt-delete{background:#fee2e2;color:#b91c1c}\n  .tp{font-size:10px;padding:1px 6px;border-radius:999px;border:1px solid}.tp-r{color:#2563eb;border-color:#bfdbfe}.tp-w{color:#c2410c;border-color:#fed7aa;background:#fff7ed}\n  .tag{font-size:10px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:4px}\n  .st{font-size:11px;font-weight:700;padding:2px 8px;border-radius:999px}.st-ok{background:#dcfce7;color:#15803d}.st-err{background:#fee2e2;color:#b91c1c}.st-none{background:#f3f4f6;color:#6b7280;font-weight:500}\n  .dur{font-variant-numeric:tabular-nums;font-weight:600;font-size:12px}.slow{color:#b91c1c}.mid{color:#b45309}\n  .muted{color:#6b7280}.okc{color:#16803d}.errc{color:#b91c1c}\n  .cbody{border-top:1px solid #eef0f2;padding:12px}\n  .cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.3fr);gap:14px}\n  .lbl{font-size:11px;font-weight:650;color:#57606a;margin:8px 0 4px;display:flex;align-items:center;gap:6px}\n  .ed{width:100%;min-height:220px;font-family:ui-monospace,Consolas,monospace;font-size:12px;resize:vertical;background:#fbfbfc}.ed.bad{border-color:#dc2626}\n  .err{color:#b91c1c;font-size:12px;margin-top:4px}\n  .errbox{background:#fef2f2;border:1px solid #fecaca;color:#7f1d1d;border-radius:8px;padding:8px 10px;margin:8px 0;font-size:12px}.errbox div{margin-top:3px;color:#991b1b}\n  .json{background:#0f172a;color:#e2e8f0;border-radius:8px;padding:10px 12px;font:12px/1.5 ui-monospace,Consolas,monospace;overflow:auto;max-height:460px;margin:0;white-space:pre-wrap;word-break:break-word}\n  .jk{color:#93c5fd}.js{color:#86efac}.jn{color:#fca5a5}.jl{color:#fcd34d}\n  details.mini summary{cursor:pointer;font-size:11px;color:#57606a;margin:8px 0 4px}\n  .meta{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:6px 14px;background:#f9fafb;border:1px solid #eef0f2;border-radius:8px;padding:8px 10px}\n  .meta div{display:flex;flex-direction:column;font-size:12px;min-width:0}.meta span{font-size:10px;color:#6b7280;text-transform:uppercase;letter-spacing:.4px}\n  .meta code,.meta b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  a{color:#2563eb;cursor:pointer;text-decoration:none}a:hover{text-decoration:underline}\n  .empty{background:#fff;border:1px dashed #d0d7de;border-radius:8px;padding:24px;text-align:center;color:#6b7280}.empty.big{padding:60px;font-size:15px}\n  .prog{position:relative;height:22px;background:#e5e7eb;border-radius:6px;overflow:hidden;margin-bottom:10px}.prog div{height:100%;background:#2563eb;transition:width .3s}\n  .prog span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}\n  .spin{width:14px;height:14px;border:2px solid #cbd5e1;border-top-color:#2563eb;border-radius:50%;display:inline-block;animation:sp .8s linear infinite}@keyframes sp{to{transform:rotate(360deg)}}\n  .tbl{width:100%;border-collapse:collapse;background:#fff;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;font-size:12px}\n  .tbl th{background:#f9fafb;text-align:left;font-size:11px;color:#57606a;padding:7px 8px;border-bottom:1px solid #e5e7eb;position:sticky;top:44px}\n  .tbl td{padding:6px 8px;border-bottom:1px solid #f0f1f3;vertical-align:top}.tbl tr.click{cursor:pointer}.tbl tr.click:hover td{background:#f6f8fa}\n  .tbl tr.rerr td:first-child{box-shadow:inset 3px 0 #dc2626}\n  .nw{white-space:nowrap}.trunc{max-width:380px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#7f1d1d}\n  .bar100{display:inline-block;width:60px;height:6px;background:#fee2e2;border-radius:3px;margin-right:6px;vertical-align:middle}.bar100 div{height:100%;background:#16a34a;border-radius:3px}\n  .pager{display:flex;align-items:center;justify-content:center;gap:10px;margin:12px}\n  .ovl{position:fixed;inset:0;background:#0006;z-index:20}\n  .drawer{position:fixed;top:0;right:0;bottom:0;width:min(920px,96%);background:#fff;z-index:21;display:flex;flex-direction:column;box-shadow:-10px 0 30px #0003}\n  .dh{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid #e5e7eb}.db{padding:14px 16px;overflow:auto;flex:1}\n  .dtitle{font-size:15px;font-weight:650;display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}\n  .toast{position:fixed;bottom:18px;left:50%;transform:translateX(-50%);background:#111827;color:#fff;padding:8px 16px;border-radius:8px;z-index:30;font-size:12px}.toast.e{background:#b91c1c}\n  .drawer.wide{width:min(1180px,98%)}\n  .drawer.uci{width:min(760px,94%);z-index:24}.ovl.top{z-index:23}\n  .uc{display:inline-flex;align-items:center;gap:4px;font-size:11px;background:#eef2ff;color:#3730a3;border:1px solid #c7d2fe;border-radius:999px;padding:1px 8px;cursor:pointer;margin:1px 3px 1px 0;white-space:nowrap}.uc:hover{background:#e0e7ff}.uc.on{background:#3730a3;color:#fff}.uc i{font-style:normal;color:#6d28d9}.uc.sm{font-size:10px;padding:0 6px}\n  .ucbar{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 10px}\n  .fl{display:inline-block;font-size:10px;background:#fff7ed;color:#9a3412;border:1px solid #fed7aa;border-radius:4px;padding:0 5px;margin:1px 3px 1px 0;white-space:nowrap}\n  .tbl tr.rwarn td:first-child{box-shadow:inset 3px 0 #f59e0b}\n  .tmsg{max-width:320px;overflow:hidden;text-overflow:ellipsis}.ucs{max-width:300px}\n  .sumrow{display:flex;flex-wrap:wrap;gap:14px;align-items:center;font-size:12px;color:#57606a;margin:-4px 0 8px}.flrow{margin-bottom:8px}\n  .subtabs{display:flex;gap:4px;border-bottom:1px solid #e5e7eb;margin:6px 0 12px}.stab{background:none;border:0;border-bottom:2px solid transparent;padding:6px 10px;cursor:pointer;font:inherit;color:#57606a}.stab.on{border-bottom-color:#2563eb;color:#1f2328;font-weight:600}\n  .timeline{display:flex;flex-direction:column;gap:8px}\n  .msg{border:1px solid #e5e7eb;border-radius:10px;padding:8px 12px;max-width:86%;background:#fff}\n  .msg.hu{align-self:flex-end;background:#eff6ff;border-color:#bfdbfe}.msg.bo{align-self:flex-start}\n  .msg.tb{align-self:center;background:#f5f3ff;border-color:#ddd6fe;max-width:80%}.msg.tb-agent{align-self:flex-start;background:#ecfdf5;border-color:#a7f3d0}.msg.tb-human{align-self:flex-end}\n  .mh{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:11px;margin-bottom:4px}\n  .mt2{white-space:pre-wrap;word-break:break-word;font-size:13px}\n  .img img{max-width:180px;max-height:180px;border-radius:6px;border:1px solid #e5e7eb;margin-top:4px;display:block}\n  .tag2{font-size:10px;background:#ede9fe;color:#5b21b6;border-radius:4px;padding:0 5px}\n  .exec{align-self:stretch;border:1px dashed #cbd5e1;border-radius:8px;padding:6px 10px;background:#f8fafc;font-size:12px;margin:-2px 0 2px}.exec.exerr{border-color:#fca5a5;background:#fef2f2}.exec.exdiv{border-color:#f59e0b}\n  .divbox{background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:6px 8px;margin-top:6px;color:#78350f}\n  .tbar{display:flex;height:8px;border-radius:4px;overflow:hidden;background:#e5e7eb;margin:4px 0}\n  .tleg{display:flex;flex-wrap:wrap;gap:8px;font-size:10px;color:#57606a}.tleg i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:3px;vertical-align:middle}\n  .card.pad{padding:10px 12px;border-left-width:1px}.pre{white-space:pre-wrap;background:#f9fafb;border:1px solid #eef0f2;border-radius:6px;padding:8px;font:12px/1.45 ui-monospace,Consolas,monospace;max-height:320px;overflow:auto;margin:0}\n  @media (max-width:900px){.cols{grid-template-columns:1fr}.crow{flex-wrap:wrap}.cres{min-width:0}}\n  `,\n\n  render(d2) {\n    const s = d2.state;\n    const view = s.view || 'runner';\n    if (view !== 'conversas') { d2.lib('jspdf@2.5.1'); d2.lib('jspdf-autotable@3.8.2'); }\n    const nLeit = CATALOGO.filter((c) => c.kind !== 'escrita').length;\n    return `\n    <div class=\"app\">\n      <div class=\"top\">\n        <h1>🧪 Testes Automatizados</h1><span class=\"env\">HML</span>\n        <div class=\"tabs\">\n          <button class=\"tab ${view === 'runner' ? 'on' : ''}\" data-act=\"nav\" data-v=\"runner\">Executar requisições <span class=\"muted\">(${CATALOGO.length})</span></button>\n          <button class=\"tab ${view === 'logs' ? 'on' : ''}\" data-act=\"nav\" data-v=\"logs\">Logs de testes</button>\n          <button class=\"tab ${view === 'conversas' ? 'on' : ''}\" data-act=\"nav\" data-v=\"conversas\">Conversas HML</button>\n        </div>\n        <span class=\"sp\"></span><span class=\"muted\" style=\"font-size:11px\">${nLeit} leituras · ${CATALOGO.length - nLeit} escritas</span>\n      </div>\n      <div class=\"wrap\">\n        ${view === 'runner' ? viewCabecalho(s) + viewRunner(d2, s) : view === 'logs' ? viewLogs(d2, s) : viewConversas(d2, s)}\n      </div>\n      ${viewDetalhe(d2, s)}${viewConversaDetalhe(d2, s)}${viewUcInfo(d2, s)}\n      ${s.toast ? `<div class=\"toast ${s.toast.erro ? 'e' : ''}\">${esc(s.toast.msg)}</div>` : ''}\n    </div>`;\n  },\n\n  mounted(d2) {\n    const salvo = lsGet();\n    d2.setState({\n      view: 'runner', results: {}, running: {}, abertos: {}, sel: {}, historico: [],\n      drafts: salvo.drafts || {}, tester_email: salvo.tester_email || '', employee_id: salvo.employee_id || '', employee_email: salvo.employee_email || '',\n      concorrencia: salvo.concorrencia || 1, filtros: { de: hojeIso(), ate: hojeIso(), limite: 1000, ...(salvo.filtros || {}) }, logs: [], token: '',\n      cfiltros: { de: ontemIso(), ate: hojeIso(), limite: 300, ...(salvo.cfiltros || {}) }, convs: []\n    });\n\n    const persist = () => { const s = d2.state; lsSet({ drafts: s.drafts, tester_email: s.tester_email, employee_id: s.employee_id, employee_email: s.employee_email, concorrencia: s.concorrencia, filtros: { ...s.filtros, texto: '' }, cfiltros: { ...s.cfiltros, texto: '' } }); };\n\n    d2.on('[data-in]', 'input', (e) => {\n      const el = e.target.closest('[data-in]'); const k = el.getAttribute('data-in');\n      const v = el.type === 'checkbox' ? el.checked : el.value;\n      d2.setState({ [k]: k === 'concorrencia' ? Number(v) : v });\n      if (k !== 'token') persist();\n    });\n    d2.on('[data-in]', 'change', (e) => {\n      const el = e.target.closest('[data-in]'); if (el.type !== 'checkbox' && el.tagName !== 'SELECT') return;\n      const k = el.getAttribute('data-in'); d2.setState({ [k]: el.type === 'checkbox' ? el.checked : (k === 'concorrencia' ? Number(el.value) : el.value) }); persist();\n    });\n    d2.on('[data-flt]', 'input', (e) => {\n      const el = e.target.closest('[data-flt]');\n      d2.setState({ filtros: { ...d2.state.filtros, [el.getAttribute('data-flt')]: el.value }, logsPage: 0 }); persist();\n    });\n    d2.on('[data-flt]', 'change', (e) => {\n      const el = e.target.closest('[data-flt]');\n      d2.setState({ filtros: { ...d2.state.filtros, [el.getAttribute('data-flt')]: el.value }, logsPage: 0 }); persist();\n    });\n    d2.on('[data-flt]', 'keydown', (e) => { if (e.key === 'Enter') buscarLogs(d2); });\n    d2.on('[data-cflt]', 'input', (e) => { const el = e.target.closest('[data-cflt]'); d2.setState({ cfiltros: { ...d2.state.cfiltros, [el.getAttribute('data-cflt')]: el.value }, convPage: 0 }); persist(); });\n    d2.on('[data-cflt]', 'change', (e) => { const el = e.target.closest('[data-cflt]'); d2.setState({ cfiltros: { ...d2.state.cfiltros, [el.getAttribute('data-cflt')]: el.value }, convPage: 0 }); persist(); });\n    d2.on('[data-cflt]', 'keydown', (e) => { if (e.key === 'Enter') buscarConversas(d2); });\n    d2.on('[data-draft]', 'input', (e) => {\n      const el = e.target.closest('[data-draft]'); const k = el.getAttribute('data-draft');\n      d2.setState({ drafts: { ...d2.state.drafts, [k]: el.value } }); persist();\n    });\n    d2.on('[data-chk]', 'change', (e) => {\n      const el = e.target.closest('[data-chk]');\n      d2.setState({ sel: { ...d2.state.sel, [el.getAttribute('data-chk')]: el.checked } });\n    });\n    if (typeof window !== 'undefined') d2.on(window, 'keydown', (e) => { if (e.key !== 'Escape') return; if (d2.state.ucInfo) d2.setState({ ucInfo: null }); else if (d2.state.convDet) d2.setState({ convDet: null }); else if (d2.state.detalhe) d2.setState({ detalhe: null }); });\n\n    const confirmarEscritas = async (itens) => {\n      const w = itens.filter((c) => c.kind === 'escrita');\n      if (!w.length) return true;\n      return d2.dialog.confirm(`Atenção: ${w.length} requisição(ões) de ESCRITA vão alterar dados reais em HML:\\n\\n${w.map((c) => '• ' + c.name).join('\\n')}\\n\\nemployee_id: ${d2.state.employee_id || '(vazio)'}\\n\\nContinuar?`);\n    };\n    const exigirToken = () => { if (!(d2.state.token || '').trim()) { toast(d2, 'Cole o token antes de rodar', true); return false; } return true; };\n\n    d2.on('[data-act]', 'click', async (e) => {\n      const el = e.target.closest('[data-act]'); if (!el || el.disabled) return;\n      const act = el.getAttribute('data-act'); const k = el.getAttribute('data-k'); const s = d2.state;\n      if (act === 'nav') { d2.setState({ view: el.getAttribute('data-v') }); if (el.getAttribute('data-v') === 'logs' && !s.logsCarregado) buscarLogs(d2); if (el.getAttribute('data-v') === 'conversas' && !s.convCarregado) buscarConversas(d2); return; }\n      if (act === 'toggleToken') return d2.setState({ showToken: !s.showToken });\n      if (act === 'toggleCard') { if (e.target.closest('input')) return; return d2.setState({ abertos: { ...s.abertos, [k]: !s.abertos[k] } }); }\n      if (act === 'run') {\n        const it = byKey(k); if (!exigirToken()) return;\n        if (!(await confirmarEscritas([it]))) return;\n        d2.setState({ abertos: { ...d2.state.abertos, [k]: true } });\n        return rodarUm(d2, it, novoRunId('unit'));\n      }\n      if (act === 'runReads') { if (!exigirToken()) return; return rodarLote(d2, CATALOGO.filter((c) => c.kind !== 'escrita' && !c.disabled)); }\n      if (act === 'runSel') {\n        if (!exigirToken()) return;\n        const its = CATALOGO.filter((c) => s.sel[c.key] && !c.disabled);\n        if (!(await confirmarEscritas(its))) return;\n        return rodarLote(d2, its);\n      }\n      if (act === 'stop') return d2.setState({ lote: { ...s.lote, parar: true } });\n      if (act === 'selGroup') { const g = el.getAttribute('data-g'); const sel = { ...s.sel }; const its = CATALOGO.filter((c) => c.group === g && !c.disabled); const all = its.every((c) => sel[c.key]); its.forEach((c) => { sel[c.key] = !all; }); return d2.setState({ sel }); }\n      if (act === 'clearSel') return d2.setState({ sel: {} });\n      if (act === 'clearRes') return d2.setState({ results: {}, ultimoLote: null });\n      if (act === 'resetDraft') { const dr = { ...s.drafts }; delete dr[k]; d2.setState({ drafts: dr }); persist(); return; }\n      if (act === 'fmtDraft') { const it = byKey(k); try { const v = s.drafts[k] != null ? JSON.parse(s.drafts[k]) : it.params; d2.setState({ drafts: { ...s.drafts, [k]: JSON.stringify(v, null, 2) } }); persist(); } catch (x) { toast(d2, 'JSON inválido', true); } return; }\n      if (act === 'copyResp') return copiar(d2, safeStr(s.results[k] && s.results[k].data));\n      if (act === 'dlResp') { const r = s.results[k]; return baixar(`${k}_${(r && r.run_id) || ''}.json`, safeStr({ requisicao: k, ok: r.ok, status: r.status, duracao_ms: r.ms, params: r.params, resposta: r.data }), 'application/json'); }\n      if (act === 'expRunCsv' || act === 'expRunPdf') {\n        const linhas = CATALOGO.filter((c) => s.results[c.key]).map((c) => linhaDoResultado(c, s.results[c.key]));\n        const nome = `testes_hml_execucao_${hojeIso()}`;\n        if (act === 'expRunCsv') return exportarCsv(linhas, `${nome}.csv`, true);\n        if (!exportarPdf(d2, linhas, { titulo: 'Testes de requisicoes BFF - HML (execucao atual)', arquivo: `${nome}.pdf`, por: s.tester_email, detalhe: true, comResposta: true })) toast(d2, 'Libere pop-ups para gerar o PDF', true);\n        return;\n      }\n      if (act === 'buscarLogs') return buscarLogs(d2);\n      if (act === 'limparFiltros') { d2.setState({ filtros: { limite: 1000 } }); persist(); return buscarLogs(d2); }\n      if (act === 'hoje') { d2.setState({ filtros: { ...s.filtros, de: hojeIso(), ate: hojeIso() } }); persist(); return buscarLogs(d2); }\n      if (act === 'toggleResumo') return d2.setState({ logsResumo: !s.logsResumo });\n      if (act === 'filtrarReq') { d2.setState({ filtros: { ...s.filtros, request_key: k }, logsResumo: false }); persist(); return buscarLogs(d2); }\n      if (act === 'logsDoRun') { e.stopPropagation(); const id = el.getAttribute('data-id'); d2.setState({ view: 'logs', logsResumo: false, filtros: { limite: 1000, run_id: id } }); return buscarLogs(d2); }\n      if (act === 'pg') return d2.setState({ logsPage: Math.max(0, (s.logsPage || 0) + Number(el.getAttribute('data-d'))) });\n      if (act === 'openLog') { if (e.target.closest('[data-act=\"logsDoRun\"]')) return; return abrirDetalhe(d2, el.getAttribute('data-id')); }\n      if (act === 'closeDet') return d2.setState({ detalhe: null });\n      if (act === 'detCopy') return copiar(d2, safeStr(s.detalhe.row));\n      if (act === 'detDl') { const l = s.detalhe.row; return baixar(`log_${l.request_key}_${l._id}.json`, safeStr(l), 'application/json'); }\n      if (act === 'detPdf') { const l = s.detalhe.row; exportarPdf(d2, [linhaDoLog(l)], { titulo: `Teste ${l.request_name} - HML`, arquivo: `teste_${l.request_key}_${l._id}.pdf`, por: s.tester_email, detalhe: true, comResposta: true }); return; }\n      if (act === 'rerun') {\n        const l = s.detalhe.row; const it = byKey(l.request_key); if (!it) return toast(d2, 'Requisição não está no catálogo', true);\n        const p = { ...(l.params || {}) };\n        for (const pk of Object.keys(p)) if (typeof p[pk] === 'string' && /^<base64 \\d+ chars>$/.test(p[pk])) p[pk] = it.params[pk];\n        d2.setState({ drafts: { ...s.drafts, [it.key]: JSON.stringify(p, null, 2) }, detalhe: null, view: 'runner', abertos: { ...s.abertos, [it.key]: true }, busca: it.key });\n        persist(); toast(d2, 'Parâmetros do log carregados: confira e clique em Rodar'); return;\n      }\n      if (act === 'buscarConvs') return buscarConversas(d2);\n      if (act === 'convHoje') { d2.setState({ cfiltros: { ...s.cfiltros, de: hojeIso(), ate: hojeIso() } }); persist(); return buscarConversas(d2); }\n      if (act === 'conv7d') { const d = new Date(Date.now() - 6 * 86400000); d2.setState({ cfiltros: { ...s.cfiltros, de: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`, ate: hojeIso() } }); persist(); return buscarConversas(d2); }\n      if (act === 'filtraUc') { const u = el.getAttribute('data-uc'); d2.setState({ cfiltros: { ...s.cfiltros, usecase: (s.cfiltros || {}).usecase === u ? '' : u }, convPage: 0 }); return; }\n      if (act === 'cpg') return d2.setState({ convPage: Math.max(0, (s.convPage || 0) + Number(el.getAttribute('data-d'))) });\n      if (act === 'expConvCsv') return exportarConversasCsv(convsFiltradas(s));\n      if (act === 'abrirConv') return abrirConversa(d2, el.getAttribute('data-id'));\n      if (act === 'closeConv') return d2.setState({ convDet: null });\n      if (act === 'convAba') return d2.setState({ convDet: { ...s.convDet, aba: el.getAttribute('data-v') } });\n      if (act === 'convRaw') { const id = el.getAttribute('data-id'); return d2.setState({ convRaw: { ...(s.convRaw || {}), [id]: !(s.convRaw || {})[id] } }); }\n      if (act === 'convReload') return abrirConversa(d2, s.convDet.id);\n      if (act === 'convCopy') return copiar(d2, relatorioConversa(s.convDet));\n      if (act === 'convTxt') return baixar(`conversa_hml_${s.convDet.sess.chat_id}.txt`, relatorioConversa(s.convDet));\n      if (act === 'convJson') return baixar(`conversa_hml_${s.convDet.sess.chat_id}.json`, safeStr(mascarar({ sessao: s.convDet.sess, execucoes: s.convDet.execs || [], transbordo: s.convDet.tb || [] })), 'application/json');\n      if (act === 'convPdf') { if (!exportarConversaPdf(d2, s.convDet)) toast(d2, 'Libere pop-ups para gerar o PDF', true); return; }\n      if (act === 'ucInfo') { e.stopPropagation(); return abrirUcInfo(d2, el.getAttribute('data-uc'), el.getAttribute('data-st')); }\n      if (act === 'closeUc') return d2.setState({ ucInfo: null });\n      if (act === 'expLogsCsv' || act === 'expLogsPdf') {\n        const comResp = !!s.expResp;\n        let rows = logsFiltradosTexto(s);\n        if (comResp) {\n          const full = await buscarLogs(d2, true);\n          if (full) { const ids = new Set(rows.map((r) => r._id)); rows = full.filter((r) => ids.has(r._id)); }\n        }\n        const linhas = rows.map(linhaDoLog);\n        const nome = `testes_hml_logs_${hojeIso()}`;\n        const filtros = descreverFiltro(s.filtros || {});\n        if (act === 'expLogsCsv') return exportarCsv(linhas, `${nome}.csv`, comResp);\n        if (!exportarPdf(d2, linhas, { titulo: 'Testes de requisicoes BFF - HML', arquivo: `${nome}.pdf`, por: s.tester_email, filtros, detalhe: !!s.expDetalhe, comResposta: comResp })) toast(d2, 'Libere pop-ups para gerar o PDF', true);\n      }\n    });\n  }\n};\n"}},"runner":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"runner"}}}},"salvar":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"salvar"}}}},"listar":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"listar"}}}},"detalhe":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"detalhe"}}}},"conversa":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"conversa"}}}},"conversas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"conversas"}}}},"execucoes":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"execucoes"}}}},"ucinfo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ucinfo"}}}}}}}}}},{"_id":"6ac87d2074abf47a44603d51","component":"data2-core-types@Component","system":"659c0922f17cf6092bc666b3","params":{"extends":"data2-core-primitives@Block","component":"kMaiaSprint","package":"natura-hr-demo","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Deck \"Cinco frentes para a próxima sprint do MAIA\" (proposta para a squad Natura, 10/10/2026).\n// O módulo completo (CSS + slides + notas) vive no drive `assets` e é carregado em runtime.\n// Para editar: natura-hr-demo/deck-sprint/ → python3 build.py → subir kMaiaSprint.js no drive assets\n// e trocar o SRC abaixo → publicar.\nconst SRC='https://natura-hr-demo.data2.media/file/n4OweabxIkUTiPlPGo72B'\nlet MOD=null, LOADING=null, BOOTED=false\n\nfunction load(){\n  if(!LOADING){\n    LOADING=fetch(SRC,{cache:'no-cache'})\n      .then(r=>r.text())\n      .then(code=>import(URL.createObjectURL(new Blob([code],{type:'text/javascript'}))))\n      .then(m=>{ MOD=m.default; return MOD })\n  }\n  return LOADING\n}\n\nexport default {\n  css:`:host{display:block}\n  .ld{height:100vh;height:100svh;background:#FBF7F2;display:flex;align-items:center;justify-content:center;\n    font-family:-apple-system,BlinkMacSystemFont,sans-serif;font-size:11px;letter-spacing:.24em;text-transform:uppercase;color:#6E6259}`,\n  render(d2){\n    if(!d2.state.ready||!MOD) return '<div class=\"ld\">carregando</div>'\n    return '<style>'+MOD.css+'</style>'+MOD.render(d2)\n  },\n  mounted(d2){\n    load().then(()=>{\n      d2.state.ready=1\n      // preview do builder (data2.qa) já exige login de builder: pula o gate\n      try{ if(/\\.data2\\.qa$/.test(location.hostname)) d2.state.unlocked=true }catch(e){}\n      setTimeout(()=>{ if(!BOOTED){ BOOTED=true; MOD.mounted(d2) } },0)\n    }).catch(()=>{})\n  },\n  updated(d2){\n    if(BOOTED&&MOD&&MOD.updated) MOD.updated(d2)\n  }\n}\n"}}}}}}}}]}},{"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":{"component":"data2-core-flow@If","displayName":"management exception never picks the system","params":{"compare":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}}}]}},"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"system":{"component":"data2-core-primitives@String","params":{"content":"63611bdff62ab6060b8396ac"}}}}},"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-10-14T16:52:02.312Z","updateMetadata":{"updatedBy":{"user":"5f1609be1ca96def427e1559"}}},{"_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":[{"_id":"67f02b56aad49ba1b09fddac","component":"data2-core-connect@HttpRequest","reference":"cWr4PD0-MGKgtJH8EW8GP","system":"659c0922f17cf6092bc666b3","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"d193hHMqmkKx3JCKfh_sJ","component":"data2-core-connect@HttpClient"}},"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}},"data":{"params":{"string":{"component":"data2-core-primitives@String","params":{"content":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<env:Envelope\n    xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"\n    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n    xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n    <env:Body>\n        <wd:Get_Workers_Request xmlns:wd=\"urn:com.workday/bsvc\" wd:version=\"v42.1\">\n            <wd:Request_References\n                wd:Skip_Non_Existing_Instances=\"true\"\n                wd:Ignore_Invalid_References=\"true\">\n                <wd:Worker_Reference>\n                    <wd:ID wd:type=\"Employee_ID\">{{employee_id}}</wd:ID>\n                </wd:Worker_Reference>\n            </wd:Request_References>\n            <wd:Request_Criteria>\n                <wd:Field_And_Parameter_Criteria_Data>\n                    <wd:Provider_Reference>\n                        <wd:ID wd:type=\"Integration_System_ID\">{{integration_system_id}}</wd:ID>\n                    </wd:Provider_Reference>\n                </wd:Field_And_Parameter_Criteria_Data>\n            </wd:Request_Criteria>\n            <wd:Response_Filter>\n                <wd:Page>1</wd:Page>\n                <wd:Count>100</wd:Count>\n            </wd:Response_Filter>\n            <wd:Response_Group>\n                <wd:Include_Reference>false</wd:Include_Reference>\n                    <wd:Include_Personal_Information>false</wd:Include_Personal_Information>\n                    <wd:Show_All_Personal_Information>false</wd:Show_All_Personal_Information>\n                    <wd:Include_Additional_Jobs>false</wd:Include_Additional_Jobs>\n                    <wd:Include_Employment_Information>false</wd:Include_Employment_Information>\n                    <wd:Include_Compensation>false</wd:Include_Compensation>\n                    <wd:Include_Organizations>false</wd:Include_Organizations>\n                    <wd:Exclude_Organization_Support_Role_Data>false</wd:Exclude_Organization_Support_Role_Data>\n                    <wd:Exclude_Location_Hierarchies>false</wd:Exclude_Location_Hierarchies>\n                    <wd:Exclude_Cost_Centers>false</wd:Exclude_Cost_Centers>\n                    <wd:Exclude_Cost_Center_Hierarchies>false</wd:Exclude_Cost_Center_Hierarchies>\n                    <wd:Exclude_Companies>false</wd:Exclude_Companies>\n                    <wd:Exclude_Company_Hierarchies>false</wd:Exclude_Company_Hierarchies>\n                    <wd:Exclude_Matrix_Organizations>false</wd:Exclude_Matrix_Organizations>\n                    <wd:Exclude_Pay_Groups>false</wd:Exclude_Pay_Groups>\n                    <wd:Exclude_Regions>false</wd:Exclude_Regions>\n                    <wd:Exclude_Region_Hierarchies>false</wd:Exclude_Region_Hierarchies>\n                    <wd:Exclude_Supervisory_Organizations>false</wd:Exclude_Supervisory_Organizations>\n                    <wd:Exclude_Teams>false</wd:Exclude_Teams>\n                    <wd:Exclude_Custom_Organizations>false</wd:Exclude_Custom_Organizations>\n                    <wd:Include_Roles>false</wd:Include_Roles>\n                    <wd:Include_Management_Chain_Data>false</wd:Include_Management_Chain_Data>\n                    <wd:Include_Multiple_Managers_in_Management_Chain_Data>false</wd:Include_Multiple_Managers_in_Management_Chain_Data>\n                    <wd:Include_Benefit_Enrollments>false</wd:Include_Benefit_Enrollments>\n                    <wd:Include_Benefit_Eligibility>false</wd:Include_Benefit_Eligibility>\n                    <wd:Include_Related_Persons>false</wd:Include_Related_Persons>\n                    <wd:Include_Qualifications>false</wd:Include_Qualifications>\n                    <wd:Include_Employee_Review>false</wd:Include_Employee_Review>\n                    <wd:Include_Goals>false</wd:Include_Goals>\n                    <wd:Include_Development_Items>false</wd:Include_Development_Items>\n                    <wd:Include_Skills>false</wd:Include_Skills>\n                    <wd:Include_Photo>false</wd:Include_Photo>\n                    <wd:Include_Worker_Documents>false</wd:Include_Worker_Documents>\n                    <wd:Include_Transaction_Log_Data>false</wd:Include_Transaction_Log_Data>\n                    <wd:Include_Subevents_for_Corrected_Transaction>false</wd:Include_Subevents_for_Corrected_Transaction>\n                    <wd:Include_Subevents_for_Rescinded_Transaction>false</wd:Include_Subevents_for_Rescinded_Transaction>\n                    <wd:Include_Succession_Profile>false</wd:Include_Succession_Profile>\n                    <wd:Include_Talent_Assessment>false</wd:Include_Talent_Assessment>\n                    <wd:Include_Employee_Contract_Data>false</wd:Include_Employee_Contract_Data>\n                    <wd:Include_Contracts_for_Terminated_Workers>false</wd:Include_Contracts_for_Terminated_Workers>\n                    <wd:Include_Collective_Agreement_Data>false</wd:Include_Collective_Agreement_Data>\n                    <wd:Include_Probation_Period_Data>false</wd:Include_Probation_Period_Data>\n                    <wd:Include_Extended_Employee_Contract_Details>false</wd:Include_Extended_Employee_Contract_Details>\n                    <wd:Include_Feedback_Received>false</wd:Include_Feedback_Received>\n                    <wd:Include_User_Account>false</wd:Include_User_Account>\n                    <wd:Include_Career>false</wd:Include_Career>\n                    <wd:Include_Account_Provisioning>false</wd:Include_Account_Provisioning>\n                    <wd:Include_Background_Check_Data>false</wd:Include_Background_Check_Data>\n                    <wd:Include_Contingent_Worker_Tax_Authority_Form_Information>false</wd:Include_Contingent_Worker_Tax_Authority_Form_Information>\n                    <wd:Exclude_Funds>false</wd:Exclude_Funds>\n                    <wd:Exclude_Fund_Hierarchies>false</wd:Exclude_Fund_Hierarchies>\n                    <wd:Exclude_Grants>false</wd:Exclude_Grants>\n                    <wd:Exclude_Grant_Hierarchies>false</wd:Exclude_Grant_Hierarchies>\n                    <wd:Exclude_Business_Units>false</wd:Exclude_Business_Units>\n                    <wd:Exclude_Business_Unit_Hierarchies>false</wd:Exclude_Business_Unit_Hierarchies>\n                    <wd:Exclude_Programs>false</wd:Exclude_Programs>\n                    <wd:Exclude_Program_Hierarchies>false</wd:Exclude_Program_Hierarchies>\n                    <wd:Exclude_Gifts>false</wd:Exclude_Gifts>\n                    <wd:Exclude_Gift_Hierarchies>false</wd:Exclude_Gift_Hierarchies>\n            </wd:Response_Group>\n        </wd:Get_Workers_Request>\n    </env:Body>\n</env:Envelope>"}},"data":{"employee_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}}}},"integration_system_id":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Chatbot"}},"compare":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"else":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Prove_Of_Content"}},"notes":{"component":"data2-core-primitives@String","params":{"content":"HML: INT317_DT_Chatbot\nPRD: INT317_DT_Prove_Of_Content\n\nWe forced to use the PRD integration id after avon6 refresh (we lost HML credentials)"}}},"component":"data2-core-flow@If"}}},"component":"data2-core-functions@Template"},"responseHeaderPrefix":{"component":"data2-core-primitives@String","params":{"content":"x-wd-"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}}],"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"_id":"65dc7e583cbde7a8a2b500e6","component":"data2-core-connect@HttpClient","reference":"d193hHMqmkKx3JCKfh_sJ","system":"659c0922f17cf6092bc666b3","params":{}},{"_id":"699300a9c1cc490079f2241d","component":"data2-core-connect@HttpRequest","reference":"3iux1nR9mdrm-TG7UUS2Z","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}}],"method":"GET","data":{"params":{"string":{"component":"data2-core-primitives@String","params":{"content":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<env:Envelope\n    xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"\n    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n    xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n    <env:Body>\n        <wd:Get_Workers_Request xmlns:wd=\"urn:com.workday/bsvc\" wd:version=\"v42.1\">\n            <wd:Request_References\n                wd:Skip_Non_Existing_Instances=\"true\"\n                wd:Ignore_Invalid_References=\"true\">\n                <wd:Worker_Reference>\n                    <wd:ID wd:type=\"Employee_ID\">{{employee_id}}</wd:ID>\n                </wd:Worker_Reference>\n            </wd:Request_References>\n            <wd:Request_Criteria>\n                <wd:Field_And_Parameter_Criteria_Data>\n                    <wd:Provider_Reference>\n                        <wd:ID wd:type=\"Integration_System_ID\">{{integration_system_id}}</wd:ID>\n                    </wd:Provider_Reference>\n                </wd:Field_And_Parameter_Criteria_Data>\n            </wd:Request_Criteria>\n            <wd:Response_Filter>\n                <wd:Page>1</wd:Page>\n                <wd:Count>100</wd:Count>\n            </wd:Response_Filter>\n            <wd:Response_Group>\n                <wd:Include_Reference>false</wd:Include_Reference>\n                    <wd:Include_Personal_Information>false</wd:Include_Personal_Information>\n                    <wd:Show_All_Personal_Information>false</wd:Show_All_Personal_Information>\n                    <wd:Include_Additional_Jobs>false</wd:Include_Additional_Jobs>\n                    <wd:Include_Employment_Information>false</wd:Include_Employment_Information>\n                    <wd:Include_Compensation>false</wd:Include_Compensation>\n                    <wd:Include_Organizations>false</wd:Include_Organizations>\n                    <wd:Exclude_Organization_Support_Role_Data>false</wd:Exclude_Organization_Support_Role_Data>\n                    <wd:Exclude_Location_Hierarchies>false</wd:Exclude_Location_Hierarchies>\n                    <wd:Exclude_Cost_Centers>false</wd:Exclude_Cost_Centers>\n                    <wd:Exclude_Cost_Center_Hierarchies>false</wd:Exclude_Cost_Center_Hierarchies>\n                    <wd:Exclude_Companies>false</wd:Exclude_Companies>\n                    <wd:Exclude_Company_Hierarchies>false</wd:Exclude_Company_Hierarchies>\n                    <wd:Exclude_Matrix_Organizations>false</wd:Exclude_Matrix_Organizations>\n                    <wd:Exclude_Pay_Groups>false</wd:Exclude_Pay_Groups>\n                    <wd:Exclude_Regions>false</wd:Exclude_Regions>\n                    <wd:Exclude_Region_Hierarchies>false</wd:Exclude_Region_Hierarchies>\n                    <wd:Exclude_Supervisory_Organizations>false</wd:Exclude_Supervisory_Organizations>\n                    <wd:Exclude_Teams>false</wd:Exclude_Teams>\n                    <wd:Exclude_Custom_Organizations>false</wd:Exclude_Custom_Organizations>\n                    <wd:Include_Roles>false</wd:Include_Roles>\n                    <wd:Include_Management_Chain_Data>false</wd:Include_Management_Chain_Data>\n                    <wd:Include_Multiple_Managers_in_Management_Chain_Data>false</wd:Include_Multiple_Managers_in_Management_Chain_Data>\n                    <wd:Include_Benefit_Enrollments>false</wd:Include_Benefit_Enrollments>\n                    <wd:Include_Benefit_Eligibility>false</wd:Include_Benefit_Eligibility>\n                    <wd:Include_Related_Persons>false</wd:Include_Related_Persons>\n                    <wd:Include_Qualifications>false</wd:Include_Qualifications>\n                    <wd:Include_Employee_Review>false</wd:Include_Employee_Review>\n                    <wd:Include_Goals>false</wd:Include_Goals>\n                    <wd:Include_Development_Items>false</wd:Include_Development_Items>\n                    <wd:Include_Skills>false</wd:Include_Skills>\n                    <wd:Include_Photo>false</wd:Include_Photo>\n                    <wd:Include_Worker_Documents>false</wd:Include_Worker_Documents>\n                    <wd:Include_Transaction_Log_Data>false</wd:Include_Transaction_Log_Data>\n                    <wd:Include_Subevents_for_Corrected_Transaction>false</wd:Include_Subevents_for_Corrected_Transaction>\n                    <wd:Include_Subevents_for_Rescinded_Transaction>false</wd:Include_Subevents_for_Rescinded_Transaction>\n                    <wd:Include_Succession_Profile>false</wd:Include_Succession_Profile>\n                    <wd:Include_Talent_Assessment>false</wd:Include_Talent_Assessment>\n                    <wd:Include_Employee_Contract_Data>false</wd:Include_Employee_Contract_Data>\n                    <wd:Include_Contracts_for_Terminated_Workers>false</wd:Include_Contracts_for_Terminated_Workers>\n                    <wd:Include_Collective_Agreement_Data>false</wd:Include_Collective_Agreement_Data>\n                    <wd:Include_Probation_Period_Data>false</wd:Include_Probation_Period_Data>\n                    <wd:Include_Extended_Employee_Contract_Details>false</wd:Include_Extended_Employee_Contract_Details>\n                    <wd:Include_Feedback_Received>false</wd:Include_Feedback_Received>\n                    <wd:Include_User_Account>false</wd:Include_User_Account>\n                    <wd:Include_Career>false</wd:Include_Career>\n                    <wd:Include_Account_Provisioning>false</wd:Include_Account_Provisioning>\n                    <wd:Include_Background_Check_Data>false</wd:Include_Background_Check_Data>\n                    <wd:Include_Contingent_Worker_Tax_Authority_Form_Information>false</wd:Include_Contingent_Worker_Tax_Authority_Form_Information>\n                    <wd:Exclude_Funds>false</wd:Exclude_Funds>\n                    <wd:Exclude_Fund_Hierarchies>false</wd:Exclude_Fund_Hierarchies>\n                    <wd:Exclude_Grants>false</wd:Exclude_Grants>\n                    <wd:Exclude_Grant_Hierarchies>false</wd:Exclude_Grant_Hierarchies>\n                    <wd:Exclude_Business_Units>false</wd:Exclude_Business_Units>\n                    <wd:Exclude_Business_Unit_Hierarchies>false</wd:Exclude_Business_Unit_Hierarchies>\n                    <wd:Exclude_Programs>false</wd:Exclude_Programs>\n                    <wd:Exclude_Program_Hierarchies>false</wd:Exclude_Program_Hierarchies>\n                    <wd:Exclude_Gifts>false</wd:Exclude_Gifts>\n                    <wd:Exclude_Gift_Hierarchies>false</wd:Exclude_Gift_Hierarchies>\n            </wd:Response_Group>\n        </wd:Get_Workers_Request>\n    </env:Body>\n</env:Envelope>"}},"data":{"employee_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}}}},"integration_system_id":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Chatbot"}},"compare":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"else":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Prove_Of_Content"}},"notes":{"component":"data2-core-primitives@String","params":{"content":"HML: INT317_DT_Chatbot\nPRD: INT317_DT_Prove_Of_Content\n\nWe forced to use the PRD integration id after avon6 refresh (we lost HML credentials)"}}},"component":"data2-core-flow@If"}}},"component":"data2-core-functions@Template"},"responseHeaderPrefix":{"component":"data2-core-primitives@String","params":{"content":"x-wd-"}}}},{"_id":"6993008dc1cc490079f2241b","component":"data2-core-connect@HttpClient","reference":"UxgGgbH9Kdb_3sSKRq7Gz","system":"659c0922f17cf6092bc666b3","params":{}},{"_id":"699300a9c1cc490079f2241e","component":"data2-core-connect@HttpRequest","reference":"yhJeXEKjtciZhF2-lT53S","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}}],"method":"GET"}},{"_id":"69b1c671eb23737ce1e6568c","component":"data2-core-connect@HttpRequest","reference":"5-JQ2g8qmXOunlT_l-wbF","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"method":"GET","requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_email"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}]}},{"_id":"699300aac1cc490079f2241f","component":"data2-core-connect@HttpRequest","reference":"gBUEj0PmHD7mQ66sF5NEF","system":"659c0922f17cf6092bc666b3","params":{"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}}],"method":"GET"}},{"_id":"699300a6c1cc490079f2241c","component":"data2-core-connect@HttpRequest","reference":"JJcFXczR0RrDAKXdRY4SW","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"method":"GET","requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}}],"data":{"params":{"string":{"component":"data2-core-primitives@String","params":{"content":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<env:Envelope\n    xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"\n    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n    xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n    <env:Body>\n        <wd:Get_Workers_Request xmlns:wd=\"urn:com.workday/bsvc\" wd:version=\"v42.1\">\n            <wd:Request_References\n                wd:Skip_Non_Existing_Instances=\"true\"\n                wd:Ignore_Invalid_References=\"true\">\n                <wd:Worker_Reference>\n                    <wd:ID wd:type=\"Employee_ID\">{{employee_id}}</wd:ID>\n                </wd:Worker_Reference>\n            </wd:Request_References>\n            <wd:Request_Criteria>\n                <wd:Field_And_Parameter_Criteria_Data>\n                    <wd:Provider_Reference>\n                        <wd:ID wd:type=\"Integration_System_ID\">{{integration_system_id}}</wd:ID>\n                    </wd:Provider_Reference>\n                </wd:Field_And_Parameter_Criteria_Data>\n            </wd:Request_Criteria>\n            <wd:Response_Filter>\n                <wd:Page>1</wd:Page>\n                <wd:Count>100</wd:Count>\n            </wd:Response_Filter>\n            <wd:Response_Group>\n                <wd:Include_Reference>false</wd:Include_Reference>\n                    <wd:Include_Personal_Information>false</wd:Include_Personal_Information>\n                    <wd:Show_All_Personal_Information>false</wd:Show_All_Personal_Information>\n                    <wd:Include_Additional_Jobs>false</wd:Include_Additional_Jobs>\n                    <wd:Include_Employment_Information>false</wd:Include_Employment_Information>\n                    <wd:Include_Compensation>false</wd:Include_Compensation>\n                    <wd:Include_Organizations>false</wd:Include_Organizations>\n                    <wd:Exclude_Organization_Support_Role_Data>false</wd:Exclude_Organization_Support_Role_Data>\n                    <wd:Exclude_Location_Hierarchies>false</wd:Exclude_Location_Hierarchies>\n                    <wd:Exclude_Cost_Centers>false</wd:Exclude_Cost_Centers>\n                    <wd:Exclude_Cost_Center_Hierarchies>false</wd:Exclude_Cost_Center_Hierarchies>\n                    <wd:Exclude_Companies>false</wd:Exclude_Companies>\n                    <wd:Exclude_Company_Hierarchies>false</wd:Exclude_Company_Hierarchies>\n                    <wd:Exclude_Matrix_Organizations>false</wd:Exclude_Matrix_Organizations>\n                    <wd:Exclude_Pay_Groups>false</wd:Exclude_Pay_Groups>\n                    <wd:Exclude_Regions>false</wd:Exclude_Regions>\n                    <wd:Exclude_Region_Hierarchies>false</wd:Exclude_Region_Hierarchies>\n                    <wd:Exclude_Supervisory_Organizations>false</wd:Exclude_Supervisory_Organizations>\n                    <wd:Exclude_Teams>false</wd:Exclude_Teams>\n                    <wd:Exclude_Custom_Organizations>false</wd:Exclude_Custom_Organizations>\n                    <wd:Include_Roles>false</wd:Include_Roles>\n                    <wd:Include_Management_Chain_Data>false</wd:Include_Management_Chain_Data>\n                    <wd:Include_Multiple_Managers_in_Management_Chain_Data>false</wd:Include_Multiple_Managers_in_Management_Chain_Data>\n                    <wd:Include_Benefit_Enrollments>false</wd:Include_Benefit_Enrollments>\n                    <wd:Include_Benefit_Eligibility>false</wd:Include_Benefit_Eligibility>\n                    <wd:Include_Related_Persons>false</wd:Include_Related_Persons>\n                    <wd:Include_Qualifications>false</wd:Include_Qualifications>\n                    <wd:Include_Employee_Review>false</wd:Include_Employee_Review>\n                    <wd:Include_Goals>false</wd:Include_Goals>\n                    <wd:Include_Development_Items>false</wd:Include_Development_Items>\n                    <wd:Include_Skills>false</wd:Include_Skills>\n                    <wd:Include_Photo>false</wd:Include_Photo>\n                    <wd:Include_Worker_Documents>false</wd:Include_Worker_Documents>\n                    <wd:Include_Transaction_Log_Data>false</wd:Include_Transaction_Log_Data>\n                    <wd:Include_Subevents_for_Corrected_Transaction>false</wd:Include_Subevents_for_Corrected_Transaction>\n                    <wd:Include_Subevents_for_Rescinded_Transaction>false</wd:Include_Subevents_for_Rescinded_Transaction>\n                    <wd:Include_Succession_Profile>false</wd:Include_Succession_Profile>\n                    <wd:Include_Talent_Assessment>false</wd:Include_Talent_Assessment>\n                    <wd:Include_Employee_Contract_Data>false</wd:Include_Employee_Contract_Data>\n                    <wd:Include_Contracts_for_Terminated_Workers>false</wd:Include_Contracts_for_Terminated_Workers>\n                    <wd:Include_Collective_Agreement_Data>false</wd:Include_Collective_Agreement_Data>\n                    <wd:Include_Probation_Period_Data>false</wd:Include_Probation_Period_Data>\n                    <wd:Include_Extended_Employee_Contract_Details>false</wd:Include_Extended_Employee_Contract_Details>\n                    <wd:Include_Feedback_Received>false</wd:Include_Feedback_Received>\n                    <wd:Include_User_Account>false</wd:Include_User_Account>\n                    <wd:Include_Career>false</wd:Include_Career>\n                    <wd:Include_Account_Provisioning>false</wd:Include_Account_Provisioning>\n                    <wd:Include_Background_Check_Data>false</wd:Include_Background_Check_Data>\n                    <wd:Include_Contingent_Worker_Tax_Authority_Form_Information>false</wd:Include_Contingent_Worker_Tax_Authority_Form_Information>\n                    <wd:Exclude_Funds>false</wd:Exclude_Funds>\n                    <wd:Exclude_Fund_Hierarchies>false</wd:Exclude_Fund_Hierarchies>\n                    <wd:Exclude_Grants>false</wd:Exclude_Grants>\n                    <wd:Exclude_Grant_Hierarchies>false</wd:Exclude_Grant_Hierarchies>\n                    <wd:Exclude_Business_Units>false</wd:Exclude_Business_Units>\n                    <wd:Exclude_Business_Unit_Hierarchies>false</wd:Exclude_Business_Unit_Hierarchies>\n                    <wd:Exclude_Programs>false</wd:Exclude_Programs>\n                    <wd:Exclude_Program_Hierarchies>false</wd:Exclude_Program_Hierarchies>\n                    <wd:Exclude_Gifts>false</wd:Exclude_Gifts>\n                    <wd:Exclude_Gift_Hierarchies>false</wd:Exclude_Gift_Hierarchies>\n            </wd:Response_Group>\n        </wd:Get_Workers_Request>\n    </env:Body>\n</env:Envelope>"}},"data":{"employee_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}}}},"integration_system_id":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Chatbot"}},"compare":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"else":{"component":"data2-core-primitives@String","params":{"content":"INT317_DT_Prove_Of_Content"}},"notes":{"component":"data2-core-primitives@String","params":{"content":"HML: INT317_DT_Chatbot\nPRD: INT317_DT_Prove_Of_Content\n\nWe forced to use the PRD integration id after avon6 refresh (we lost HML credentials)"}}},"component":"data2-core-flow@If"}}},"component":"data2-core-functions@Template"},"responseHeaderPrefix":{"component":"data2-core-primitives@String","params":{"content":"x-wd-"}}}},{"_id":"696a52ad1cfa0cc37dac869d","component":"data2-core-connect@HttpRequest","reference":"v-w3MtUJEKVvd_jhapXJ9","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"Lft_OdFevDLp3VQB8p1dy","component":"data2-core-connect@HttpClient"}},"method":"GET","requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}]}},{"_id":"66e881f1d2ea82ff066188b7","component":"data2-core-connect@HttpClient","reference":"Lft_OdFevDLp3VQB8p1dy","system":"659c0922f17cf6092bc666b3","params":{}},{"_id":"696904939c69c0c7e73b8783","component":"data2-core-connect@HttpRequest","reference":"a_3KPV6-rYo3o789VdT9j","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"Lft_OdFevDLp3VQB8p1dy","component":"data2-core-connect@HttpClient"}},"method":"GET","requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}]}},{"_id":"6993031fc1cc490079f2242c","component":"data2-core-connect@HttpRequest","reference":"mGfk1ukF3WK-dQ4P-EI6K","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"ticket_type"}},"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"auxilio_creche"}},{"component":"data2-core-primitives@String","params":{"content":"atestados"}},{"component":"data2-core-primitives@String","params":{"content":"fretado"}}]}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"state"}},"component":"data2-core-primitives@String","oneOf":{"params":{"needle":{"component":"data2-core-primitives@String","params":{"content":"\n"}},"haystack":{"component":"data2-core-primitives@String","params":{"content":"open\nin progress\nclosed complete\nclosed incomplete\nclosed skipped\nresolved\npending"}}},"component":"data2-core-functions@Split"}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"sys_created_on"}},"component":"data2-core-primitives@String","oneOf":{"params":{"needle":{"component":"data2-core-primitives@String","params":{"content":"\n"}},"haystack":{"component":"data2-core-primitives@String","params":{"content":"today\nyesterday\nlast week\nlast month"}}},"component":"data2-core-functions@Split"}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"ticket_number"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"origin"}},"component":"data2-core-primitives@String","oneOf":[]}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_email"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}],"method":{"component":"data2-core-primitives@String","params":{"content":"GET"}}}},{"_id":"699300abc1cc490079f22420","component":"data2-core-connect@HttpRequest","reference":"n-zLMPkBi2CvMJjBG05bz","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employeeId"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"allowedForTaxDeduction"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"dependentForPayrollPurposes"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"files"}}},"break":false},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"genderCode"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"birthDate"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"cpf"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"relationship"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"formattedName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"reportingName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"firstName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"lastName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}}],"method":"POST","data":{"autoComplete":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}}},"component":"data2-core-types@Reference"},"relationship":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"relationship"}}},"component":"data2-core-types@Reference"},"formattedName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"formattedName"}}},"component":"data2-core-types@Reference"},"reportingName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reportingName"}}},"component":"data2-core-types@Reference"},"firstName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"firstName"}}},"component":"data2-core-types@Reference"},"lastName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lastName"}}},"component":"data2-core-types@Reference"},"cpf":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"cpf"}}},"component":"data2-core-types@Reference"},"birthDate":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"birthDate"}}},"component":"data2-core-types@Reference"},"files":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"files"}}},"component":"data2-core-types@Reference"},"allowedForTaxDeduction":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"allowedForTaxDeduction"}}},"component":"data2-core-types@Reference"},"dependentForPayrollPurposes":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dependentForPayrollPurposes"}}},"component":"data2-core-types@Reference"},"genderCode":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"genderCode"}}},"component":"data2-core-types@Reference"},"employeeId":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"employeeId"}}},"component":"data2-core-types@Reference"}}}},{"_id":"699300adc1cc490079f22423","component":"data2-core-connect@HttpRequest","reference":"dapLe5g4fk3mZIrefSxVT","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"email"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"country"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"phone"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"phoneDeviceType"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"street"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"additionalAddress"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"streetType"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"neighborhood"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"postalCode"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"city"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"state"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"addressName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@Boolean","key":{"component":"data2-core-primitives@String","params":{"content":"replaceAll"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"isPrimary"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"file"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"component":"data2-core-primitives@String"}}],"method":"PATCH","query":[{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}},"component":"data2-core-types@Reference"}}],"data":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"value":{"country":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}},"component":"data2-core-types@Reference"},"phone":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"phone"}}},"component":"data2-core-types@Reference"},"phoneDeviceType":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"phoneDeviceType"}}},"component":"data2-core-types@Reference"},"replaceAll":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"replaceAll"}}},"component":"data2-core-types@Reference"},"isPrimary":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"isPrimary"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"phone_number"}}}},{"component":"data2-core-flow@Case","params":{"value":{"email":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"email"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"personal_email"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"home_address"}},"value":{"street":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"street"}}},"component":"data2-core-types@Reference"},"additionalAddress":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"additionalAddress"}}},"component":"data2-core-types@Reference"},"number":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}},"component":"data2-core-types@Reference"},"streetType":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"streetType"}}},"component":"data2-core-types@Reference"},"neighborhood":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"neighborhood"}}},"component":"data2-core-types@Reference"},"postalCode":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"postalCode"}}},"component":"data2-core-types@Reference"},"city":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"city"}}},"component":"data2-core-types@Reference"},"state":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"state"}}},"component":"data2-core-types@Reference"},"addressName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"street"}}},"component":"data2-core-types@Reference"},"files":[{"filename":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filename"}}},"component":"data2-core-types@Reference"},"file":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"file"}}},"component":"data2-core-types@Reference"}}]}}}]},"component":"data2-core-flow@Switch"}}},{"_id":"699300adc1cc490079f22424","component":"data2-core-connect@HttpRequest","reference":"kalnilhV3xu2kYov0Bx1L","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employeeId"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"country"}},"component":"data2-core-primitives@String","oneOf":{"params":{},"component":"data2-core-primitives@String"}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"countryCode"}},"component":"data2-core-primitives@String","oneOf":{"params":{},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"priority"}},"component":"data2-core-primitives@Boolean","list":{"params":{},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"relationship"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"phone"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"firstName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"lastName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"phoneDeviceType"}},"component":"data2-core-primitives@String"}}],"method":"PATCH","data":{"firstName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"firstName"}}},"component":"data2-core-types@Reference"},"lastName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lastName"}}},"component":"data2-core-types@Reference"},"phone":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"phone"}}},"component":"data2-core-types@Reference"},"priority":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"priority"}}},"component":"data2-core-types@Reference"},"relationship":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"relationship"}}},"component":"data2-core-types@Reference"},"country":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}},"component":"data2-core-types@Reference"},"phoneDeviceType":{"params":{"string":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"phoneDeviceType"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@toLowerCase"},"phoneCode":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"phoneCode"}}}},"countryCode":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"countryCode"}}},"component":"data2-core-types@Reference"}}}},{"_id":"699300aec1cc490079f22425","component":"data2-core-connect@HttpRequest","reference":"MHWMh4DDZOrvF40gw2g88","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"account"}}}}],"data":{"account":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"account"}}},"component":"data2-core-types@Reference"}},"method":"PATCH"}},{"_id":"699300abc1cc490079f22421","component":"data2-core-connect@HttpRequest","reference":"Pj-VTFQJUH2mPTQ0cuT3V","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"orientation"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"ethnicityCode"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"pronoun"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"maritalStatusCode"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"firstName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"lastName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"files"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}}],"method":"PATCH","query":[{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}},"component":"data2-core-types@Reference"}}],"data":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"value":{"firstName":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"firstName"}}}},"lastName":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lastName"}}}},"files":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"files"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"legal_name"}}}},{"component":"data2-core-flow@Case","params":{"value":{"firstName":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"firstName"}}}},"lastName":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lastName"}}}}},"expression":{"component":"data2-core-primitives@String","params":{"content":"preferred_name"}}}},{"component":"data2-core-flow@Case","params":{"value":{"orientation":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"orientation"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"sexual_orientation"}}}},{"component":"data2-core-flow@Case","params":{"value":{"ethnicityCode":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ethnicityCode"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"race_ethnicity"}}}},{"component":"data2-core-flow@Case","params":{"value":{"pronoun":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pronoun"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"preferred_pronouns"}}}},{"component":"data2-core-flow@Case","params":{"value":{"maritalStatusCode":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"maritalStatusCode"}}},"component":"data2-core-types@Reference"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"marital_status"}}}}]},"component":"data2-core-flow@Switch"}}},{"_id":"699300acc1cc490079f22422","component":"data2-core-connect@HttpRequest","reference":"RYqe6PNUlj8ke_fkf3bqS","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileBase64"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}}],"method":"PATCH","data":{"fileName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fileName"}}},"component":"data2-core-types@Reference"},"fileBase64":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fileBase64"}}},"component":"data2-core-types@Reference"}}}},{"_id":"699300afc1cc490079f22426","component":"data2-core-connect@HttpRequest","reference":"1synU40jLugNx0PloKdDX","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileName"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileBase64"}},"component":"data2-core-primitives@String"}}],"method":"POST","data":{"fileName":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fileName"}}},"component":"data2-core-types@Reference"},"fileBase64":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fileBase64"}}},"component":"data2-core-types@Reference"}}}},{"_id":"693c6cc668ada26a2fb0302f","component":"data2-core-connect@HttpRequest","reference":"pz4RNq01c2a-5rBAQN-Kk","system":"659c0922f17cf6092bc666b3","params":{"useProxy":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"Lft_OdFevDLp3VQB8p1dy","component":"data2-core-connect@HttpClient"}},"method":"PUT","requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"development_item"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"additional_information"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"category_id"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"start_date"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"completion_date"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"status_id"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"status_note"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"updated_by_employee_id"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"development_item_version"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"component":"data2-core-primitives@String","key":{"component":"data2-core-primitives@String","params":{"content":"development_item_id"}}}}],"rawResponse":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"data":{"employeeId":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}}},"component":"data2-core-types@Reference"},"developmentItem":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"development_item"}}},"component":"data2-core-types@Reference"},"additionalInformation":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"additional_information"}}},"component":"data2-core-types@Reference"},"startDate":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"start_date"}}},"component":"data2-core-types@Reference"},"statusId":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status_id"}}},"component":"data2-core-types@Reference"},"statusNote":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status_note"}}},"component":"data2-core-types@Reference"},"updatedByEmployeeId":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"updated_by_employee_id"}}},"component":"data2-core-types@Reference"},"categoryId":[{"component":"data2-core-primitives@String","params":{"content":"DEVELOPMENT_ITEM_CATEGORY-3-19"}},{"component":"data2-core-primitives@String","params":{"content":"DEVELOPMENT_ITEM_CATEGORY-3-20"}},{"component":"data2-core-primitives@String","params":{"content":"DEVELOPMENT_ITEM_CATEGORY-3-21"}}]}}},{"_id":"699302d2c1cc490079f22427","component":"data2-core-connect@HttpRequest","reference":"1_KJGQx0_o3ZGDCEi4iX5","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}}]}},{"_id":"699302e4c1cc490079f22428","component":"data2-core-connect@HttpRequest","reference":"u3C4ePk84R-okC_R7DMhl","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"reportingMonthAndYear"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"paymentDate"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"component":"data2-core-primitives@String","oneOf":[{"component":"data2-core-primitives@String","params":{"content":"receipt"}},{"component":"data2-core-primitives@String","params":{"content":"ticket + receipt"}},{"component":"data2-core-primitives@String","params":{"content":"invoice + receipt"}}]}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"dependents"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"name"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}],"method":"POST","query":[{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}},"component":"data2-core-types@Reference"}}],"data":{"name":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"name"}}},"component":"data2-core-types@Reference"},"paymentDate":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"paymentDate"}}},"component":"data2-core-types@Reference"},"reportingMonthAndYear":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reportingMonthAndYear"}}},"component":"data2-core-types@Reference"},"dependents":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dependents"}}}}},"responseHeaderPrefix":{"component":"data2-core-primitives@String","params":{"content":"x-sn-"}}}},{"_id":"699302e5c1cc490079f22429","component":"data2-core-connect@HttpRequest","reference":"S22Cl4C9_nBElVNOwXxTB","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"transports"}}}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hasAttachment"}},"component":"data2-core-primitives@Boolean"}}],"method":"POST","query":[{"key":{"component":"data2-core-primitives@String","params":{"content":"option"}},"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"option"}}},"component":"data2-core-types@Reference"}}],"data":{"transports":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"transports"}}}},"hasAttachment":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"hasAttachment"}}}}}}},{"_id":"6abea9e9e9158024f93dc065","component":"data2-core-connect@HttpRequest","reference":"-20ClsIBfWmVoRAbkZTaW","system":"659c0922f17cf6092bc666b3","params":{"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"method":{"component":"data2-core-primitives@String","params":{"content":"POST"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":"is_become_user","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"employee_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"google_token","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"gemini","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"quantityDays","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"date","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"phone","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"emailInput","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"additionalInput","component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":"env","component":"data2-core-primitives@String"}}],"useProxy":true,"data":{"quantityDays":{"component":"data2-core-types@Reference","params":{"reference":"quantityDays"}},"date":{"component":"data2-core-types@Reference","params":{"reference":"date"}},"phone":{"component":"data2-core-types@Reference","params":{"reference":"phone"}},"additionalComments":{"component":"data2-core-types@Reference","params":{"reference":"additionalInput"}},"forAnotherPersonEmail":{"component":"data2-core-types@Reference","params":{"reference":"emailInput"}}}}},{"_id":"699302e6c1cc490079f2242b","component":"data2-core-connect@HttpRequest","reference":"ctH7FQ2z2ffgiY4OeuU76","system":"659c0922f17cf6092bc666b3","params":{"useProxy":true,"parent":{"component":"data2-core-types@InstanceReference","params":{"reference":"UxgGgbH9Kdb_3sSKRq7Gz","component":"data2-core-connect@HttpClient"}},"requestParameters":[{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"is_become_user"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"employee_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"google_token"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"gemini"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"ticket_id"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"filename"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"file"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"file_url"}},"component":"data2-core-primitives@String"}},{"component":"data2-core-types@PrimitiveParameter","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"env"}},"component":"data2-core-primitives@String"}}],"method":{"component":"data2-core-primitives@String","params":{"content":"POST"}},"query":[{"key":{"component":"data2-core-primitives@String","params":{"content":"ticket_id"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ticket_id"}}}}},{"value":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"filename"}}},"component":"data2-core-types@Reference"},"key":{"component":"data2-core-primitives@String","params":{"content":"file_name"}}}],"data":{"fileBase64":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"file"}}}}}}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6ac87d28e8d9a3133c7b659c","component":"data2-core-primitives@Artboard","system":"659c0922f17cf6092bc666b3","displayName":"Deck — MAIA próxima sprint","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Deck — MAIA próxima sprint"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"6UuxNr6tlulN6lUpWxOrf"},{"_id":"284e1c195f8f7a04796be6c3","parent":"6ac87d28e8d9a3133c7b659c","component":"natura-hr-demo@kMaiaSprint","system":"659c0922f17cf6092bc666b3","displayName":"deck","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false,"growH":true,"growV":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"EqUpnqeiLw6MSD88SKnCx"}]}},{"_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":"6ac87d4f74abf47a44603d7c","displayName":"Proposta sprint — MAIA","reference":"yRq6LengCEdGAuzpjsW2t","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"proposta-sprint"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"6UuxNr6tlulN6lUpWxOrf"}}},"system":"659c0922f17cf6092bc666b3","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}