UNPKG

21.8 kBJavaScriptView Raw
1!function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t){e.exports=require("@harvestr-api/utils")},function(e,t){e.exports=require("@harvestr-api/common")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.intercomApiService=void 0;const s=n(0),c=n(11),d=o(n(12)),l=a(n(13)),u=n(3);t.intercomApiService={async findAdmins(e){const t=d.defer();return new c.Client({token:e.integration_access_token}).admins.list(async(e,n)=>{try{if(e)throw new Error(e);t.resolve(n.body.admins)}catch(e){t.reject(e)}}),t.promise},async findAdmin(e,t){const n=d.defer();return new c.Client({token:t.integration_access_token}).admins.find(e,async(e,t)=>{try{if(e)throw new Error(e);n.resolve(t.body)}catch(e){n.reject(e)}}),n.promise},async findUser(e,t){const n=d.defer();return new c.Client({token:t.integration_access_token}).users.find(e,async(e,t)=>{try{if(e)throw new Error(e);const r=t.body;let i=null;switch(r.type){case"user.list":i=(t.body.users||[])[0];break;case"contact.list":i=(t.body.contacts||[])[0];break;case"user":case"contact":i=t.body}n.resolve(i)}catch(e){n.reject(e)}}),n.promise},async findCompany(e,t){const n=d.defer();return new c.Client({token:t.integration_access_token}).companies.find(e,async(e,t)=>{try{if(e)throw new Error(e);s.logger.debug("Debugging intercom findCompany: ",JSON.stringify(t.body)),n.resolve(t.body)}catch(e){n.reject(e)}}),n.promise},async findCompanyFromName(e,t){const n=d.defer(),r={url:"https://api.intercom.io/companies?name="+e,method:"GET",headers:{Authorization:"Bearer "+t.integration_access_token,Accept:"application/json"}};return l.default(r,async(e,t,r)=>{try{if(e)throw new Error(e);n.resolve(JSON.parse(r))}catch(e){n.reject(e)}}),n.promise},async getConversation(e,t){const n=d.defer(),r={url:"https://api.intercom.io/conversations/"+e,method:"GET",headers:{Authorization:"Bearer "+t.integration_access_token,Accept:"application/json"}};return l.default(r,async(e,t,r)=>{try{if(e)throw new Error(e);if(200!==t.statusCode)throw new Error("intercom request not sending a 200 : "+JSON.stringify(t));n.resolve(JSON.parse(r))}catch(e){n.reject(e)}}),n.promise},async legacyCreateWebhookSubscription(e,t){const n=d.defer(),r={url:"https://api.intercom.io/subscriptions",method:"POST",headers:{Authorization:"Bearer "+t,Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(e)};return l.default(r,async(e,t,r)=>{try{if(e)throw new Error(e);if(200!==t.statusCode)throw s.logger.error("intercom request not sending a 200 :\n "+JSON.stringify(t)),new Error("Request Error");{const e=JSON.parse(r);n.resolve(e)}}catch(e){n.reject(e)}}),n.promise},async legacyDeleteWebhookSubscription(e){const t=d.defer(),n={Authorization:"Bearer "+e.integration_access_token,Accept:"application/json"},r={url:"https://api.intercom.io/subscriptions/"+e.integration_webhook_id,method:"DELETE",headers:n};return l.default(r,async(e,n,r)=>{try{if(e)throw new Error(e);if(200!==n.statusCode)throw s.logger.error("intercom request not sending a 200 :\n "+JSON.stringify(n)),new Error("Request Error");s.logger.info("webhook successfully deleted"),t.resolve()}catch(e){t.reject(e)}}),t.promise},async getAccessToken(e){s.logger.verbose("asking for intercom access token");const t=d.defer(),n={url:"https://api.intercom.io/auth/eagle/token?code="+e.intercom_code+"&client_id="+e.INTERCOM_OAUTH_CLIENT_ID+"&client_secret="+e.INTERCOM_OAUTH_CLIENT_SECRET,method:"POST"};return l.default(n,async(e,n,r)=>{try{if(e)throw new Error(e);if(200!==n.statusCode)throw s.logger.error("intercom request not sending a 200 :\n "+JSON.stringify(n)),new Error("Request Error");s.logger.info("received intercom token "+r),t.resolve(JSON.parse(r).access_token)}catch(e){t.reject(e)}}),t.promise},async createNote(e,t,n){const r={Authorization:"Bearer "+n.integration_access_token,Accept:"application/json","Content-Type":"application/json"},i={id:u.oc(n).integration_trigger_id(""),intercom_user_id:u.oc(n).integration_trigger_id(""),type:"admin",message_type:"note",body:"[Harvestr] "+e};s.logger.info(t);const o={url:`https://api.intercom.io/conversations/${t}/reply`,method:"POST",headers:r,body:JSON.stringify(i)};l.default(o,async(e,t,n)=>{})},async getMe(e){const t=d.defer(),n={url:"https://api.intercom.io/me",method:"GET",headers:{Authorization:"Bearer "+e.integration_access_token,Accept:"application/json"}};return l.default(n,async(e,n,r)=>{try{if(e)throw new Error(e);const n=JSON.parse(r);t.resolve({app_id:u.oc(n).app.id_code(""),id:u.oc(n).id("")})}catch(e){t.reject(e)}}),t.promise}}},function(e,t){e.exports=require("ts-optchain")},function(e,t){e.exports=require("base64url")},function(e,t){e.exports=require("passport")},function(e,t){e.exports=require("passport-intercom")},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.intercomUtilsService=void 0;const a=n(0),s=o(n(17));t.intercomUtilsService={async findTrigger(e,t,n){const r=/<a.*?href="\/\/app\.intercom\.io\/apps\/([^"]*?)\/admin\/([^"]*?)".*?>/g;let i=r.exec(e);for(a.logger.info("starting intercom note parsing");null!==i;){i.index===r.lastIndex&&r.lastIndex++;const o=i[1],s=i[2];if(a.logger.info(`Admin mentionned in intercom note ${o} : ${s}`),o===n&&s===t)return!0;i=r.exec(e)}return!1},formatDiscoveryCanvas(e,t,n,r,i,o){const a=[];return o.forEach(e=>a.push(e.name)),[{type:"divider"},{type:"text",text:`*${e}*`,style:"muted"},{type:"data-table",items:[{type:"field-value",field:"In component",value:n},{type:"field-value",field:"Current state",value:r},{type:"field-value",field:"Feedback volume",value:i},{type:"field-value",field:"Tags",value:o.length?a.toString().split(",").join(", "):"N/A"}]},{type:"button",label:"Open discovery",style:"secondary",id:"open-discovery-"+s.generate(),action:{type:"url",url:""+(process.env.HARVESTR_CLIENT_URL+t)}}]}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.intercomService=void 0;const i=n(1),o=r(n(18));t.intercomService={async getMessage(e,t){const n=o.default`
2 fragment IntercomIntMessage on Message {
3 id
4 clientId
5 createdAt
6 updatedAt
7 tags
8 integration_url
9 integration_id
10 recipient_address
11 title
12 content
13 channel
14 read
15 archived
16 processed
17 chunks {
18 id
19 clientId
20 discovery {
21 id
22 clientId
23 title
24 discoverystate {
25 name
26 color
27 id
28 clientId
29 }
30 tags {
31 name
32 color
33 id
34 clientId
35 }
36 parent {
37 id
38 clientId
39 title
40 }
41 chunks {
42 id
43 clientId
44 }
45 }
46 }
47 }
48 `;return(await i.messageService.getMessages({where:{integration_id:e},orderBy:"createdAt_DESC"},t).$fragment(n))[0]}}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||t.hasOwnProperty(n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),i(n(10),t),i(n(2),t),i(n(14),t),i(n(15),t),i(n(16),t),i(n(7),t),i(n(8),t),i(n(19),t)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},function(e,t){e.exports=require("intercom-client")},function(e,t){e.exports=require("q")},function(e,t){e.exports=require("request")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.intercomConverterService=void 0;const r=n(1),i=n(0),o=n(3),a=n(2),s=(e,t)=>e.some(e=>e.id===t.id)?e:[...e,t],c=e=>o.oc(e).conversation_parts.conversation_parts([]).filter(e=>"comment"===e.part_type||"assignment"===e.part_type||"note"===e.part_type).filter(e=>e.body),d=e=>[e.conversation_message,...c(e)].filter(e=>e.body),l=async(e,t)=>({mongoId:e.id.toString(),type:"note"===e.part_type?"NOTE":"MESSAGE",content:e.body||"",submitter:{connect:{id:(t.find(t=>t.intercom_id===e.author.id)||{id:""}).id}}}),u=async(e,t,n)=>{let s,c,d;switch(e.type){case"user":case"contact":case"lead":if(s=await a.intercomApiService.findUser({id:e.id},t).catch(t=>(console.log("could not find Intercom user"),e)),!s)return i.logger.debug("Intercom user not found"),e;if(d=o.oc(s).email()?{email:s.email}:{name:s.name},await r.personService.exists(d,n)){return(await r.personService.getPersons({where:d},n))[0]}c={type:"CUSTOMER",deleted:!1,email:s.email,phone:s.phone||void 0,name:s.name||o.oc(s).pseudonym(""),avatar:o.oc(s).avatar.image_url()?{create:{name:s.avatar.name||"",url:s.avatar.image_url}}:void 0};break;case"admin":case"team":if(s=await a.intercomApiService.findAdmin(e.id,{integration_access_token:o.oc(t).integration_access_token("")}).catch(t=>(console.log("could not find Intercom admin"),e)),!s)return i.logger.debug("Intercom admin not found"),e;if(d=o.oc(s).email()?{email:s.email}:{name:o.oc(s).name("Unnammed user")},await r.personService.exists(d,n)){return(await r.personService.getPersons({where:d},n))[0]}c={deleted:!1,email:o.oc(s).email(),type:"CUSTOMER",name:s.name||o.oc(s).pseudonym("Unnammed user")};break;default:if(await r.personService.exists({email:"operator"},n)){return(await r.personService.getPersons({where:{email:"operator"}},n))[0]}c={deleted:!0,name:"Intercom operator",type:"CUSTOMER",email:"operator",details:"Intercom operator bot which generates auto replies"}}return r.personService.upsertPerson(r.personService.getUpsertWhere({name:c.name,email:c.email||void 0},n),c,{deleted:!1},n)},p=async(e,t,n,r)=>{const o=d(e);let a=[];a=e.user?s(a,e.user):a,a=t?s(a,t):a;for(const e of o)a=e.author?s(a,e.author):a;return a=a.filter(e=>e&&e.id),i.logger.verbose("persons length: ",a.length),Promise.all(a.map(async e=>({id:(await u(e,n,r)).id,intercom_id:e.id})))};t.intercomConverterService={async convertToOrganization(e,t,n){i.logger.debug("converting the following intercom company: ",e);const o={where:{name:e.name},create:{name:e.name||"",integrationSyncs:{create:[{integration_type:"INTERCOM",elementId:e.id,elementType:"company",elementUrl:`https://app.intercom.io/apps/${e.app_id}/companies/${e.id}`,elementApiUrl:"https://api.intercom.io/companies/"+e.id,elementProjectId:e.app_id,_projectId:n.project_id}]}},update:{}};return r.organizationService.upsertOrganization(o.where,o.create,o.update,n)},async convertToMessage(e,t,n,i,a){const s=d(e),c=await p(e,t,n,a),u=c.find(e=>e.intercom_id===t.id),m=c.find(t=>t.intercom_id===e.user.id);if(!u)throw new Error("Error in intercom message creation: submitter cannot be empty");const _="tag.list"===o.oc(e).tags.type()?o.oc(e).tags.tags([]).map(e=>({name:e.name})):[],g=await r.messageLabelService.upsertManyMessageLabels(_,a);return r.messageService.createMessage({clientId:o.oc(e).clientId()||void 0,recipient_address:"Intercom",title:e.conversation_message.subject,content:e.conversation_message.body,labels:(g||[]).length?{connect:(g||[]).map(e=>({id:e.id}))}:void 0,sub_messages:{create:s.length?await Promise.all(s.map(e=>l(e,c))):[]},channel:"INTERCOM",integration_id:e.id.toString(),integration_url:`https://app.intercom.io/a/apps/${i}/inbox/all/conversations/${e.id.toString()}`,requester:{connect:{id:o.oc(m).id(u.id)}},submitter:{connect:{id:u.id}}},a)},async updateMessage(e,t,n,i){const o=c(e),a=await p(e,null,n,i);return console.log("PERSONS TADATATA",JSON.stringify(a)),console.log("UPDATE",JSON.stringify(o)),r.messageService.updateMessage({id:t.id},{updated:!0,submessageBeforeUpdateId:t.last_submessage_clientId&&!t.updated?t.last_submessage_clientId:void 0,sub_messages:{create:o.length?await Promise.all(o.map(e=>l(e,a))):[]}},i)},async legacyConvertToMessage(e,t,n,i){const s=await a.intercomApiService.getConversation(e.item.id.toString(),{integration_access_token:o.oc(n).integration_access_token("")}),c=d(s),u=await p(s,t,n,i),m=u.find(e=>e.intercom_id===t.id),_=u.find(e=>e.intercom_id===s.user.id);if(!m)throw new Error("Error in intercom message creation: submitter cannot be empty");const g="tag.list"===o.oc(s).tags.type()?o.oc(s).tags.tags([]).map(e=>({name:e.name})):[],f=await r.messageLabelService.upsertManyMessageLabels(g,i);return r.messageService.createMessage({recipient_address:"Intercom",title:o.oc(s).conversation_message.subject()?s.conversation_message.subject:"Intercom conversation",content:s.conversation_message.body,labels:(f||[]).length?{connect:(f||[]).map(e=>({id:e.id}))}:void 0,sub_messages:{create:c.length?await Promise.all(c.map(e=>l(e,u))):[]},channel:"INTERCOM",integration_id:e.item.id.toString(),integration_url:o.oc(e).item.links.conversation_web(),requester:{connect:{id:o.oc(_).id(m.id)}},submitter:{connect:{id:m.id}}},i)}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.intercomLegacyOauthService=void 0;const i=n(1),o=n(0),a=r(n(4)),s=n(5),c=n(2),d=n(6).Strategy,l=s.use(new d({clientID:process.env.INTERCOM_LEGACY_OAUTH_CLIENT_ID,clientSecret:process.env.INTERCOM_LEGACY_OAUTH_CLIENT_SECRET},(e,t,n,r)=>{r()}));t.intercomLegacyOauthService={async handleLegacyIntercomOauth(e,t){try{const n=e.query.id;l.authenticate("intercom",{state:a.default(JSON.stringify({id:n}))})(e,t)}catch(e){o.logger.error(e)}},async handleLegacyIntercomOauthResponse(e,t){try{const n=e.query.state,r=JSON.parse(a.default.decode(n)).id,s=e.query.code,d={type:"INTEGRATION_INTERCOM",project_id:r},l=process.env.INTERCOM_LEGACY_OAUTH_CLIENT_ID||"",u=process.env.INTERCOM_LEGACY_OAUTH_CLIENT_SECRET||"",p=await c.intercomApiService.getAccessToken({INTERCOM_OAUTH_CLIENT_ID:l,INTERCOM_OAUTH_CLIENT_SECRET:u,intercom_code:s});o.logger.info("creating the webhook on client's intercom app");const m=process.env.HARVESTR_API_URL||"google.com",_=await c.intercomApiService.legacyCreateWebhookSubscription({service_type:"web",url:m+"/intercom/note/"+d.project_id,topics:["conversation.admin.noted"]},p);if(!_)throw new Error("Webhook creation failed");o.logger.info("webhook created in intercom with id "+_.id),await i.apiTokenService.upsertApiToken({source:"INTERCOM_MENTION"},{source:"INTERCOM_MENTION",integration_access_token:p,integration_webhook_id:_.id,integration_workspace_id:_.app_id,options:{create:{notify_linked:!0,notify_state:!0,sync_organizations:!0}}},{source:"INTERCOM_MENTION",integration_access_token:p,integration_webhook_id:_.id,integration_workspace_id:_.app_id,options:{create:{notify_linked:!0,notify_state:!0,sync_organizations:!0}}},d),t.status(200).send("<h3>Success! Redirecting...</h3><h4>You can close this window.</h4>")}catch(e){o.logger.error(e),t.status(400).send(e)}}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.intercomOauthService=void 0;const i=n(1),o=n(0),a=r(n(4)),s=n(5),c=n(2),d=n(6).Strategy,l=s.use(new d({clientID:process.env.INTERCOM_OAUTH_CLIENT_ID,clientSecret:process.env.INTERCOM_OAUTH_CLIENT_SECRET},(e,t,n,r)=>{r()}));t.intercomOauthService={async handleIntercomOauth(e,t){try{const n=e.query.id;l.authenticate("intercom",{state:a.default(JSON.stringify({id:n}))})(e,t)}catch(e){o.logger.error(e)}},async handleIntercomOauthResponse(e,t){try{const n=e.query.state,r=JSON.parse(a.default.decode(n)).id,s=e.query.code,d={type:"INTEGRATION_INTERCOM",project_id:r},l=process.env.INTERCOM_OAUTH_CLIENT_ID||"",u=process.env.INTERCOM_OAUTH_CLIENT_SECRET||"",p=await c.intercomApiService.getAccessToken({INTERCOM_OAUTH_CLIENT_ID:l,INTERCOM_OAUTH_CLIENT_SECRET:u,intercom_code:s}),m=await c.intercomApiService.getMe({integration_access_token:p});await i.apiTokenService.upsertApiToken({source:"INTERCOM_WIDGET"},{source:"INTERCOM_WIDGET",integration_access_token:p,integration_workspace_id:m.app_id,integration_trigger_id:m.id,options:{create:{notify_linked:!0,notify_state:!0,sync_organizations:!0}}},{source:"INTERCOM_WIDGET",integration_access_token:p,integration_workspace_id:m.app_id,integration_trigger_id:m.id,options:{create:{notify_linked:!0,notify_state:!0,sync_organizations:!0}}},d).catch(e=>{o.logger.error(e),t.status(400).send("This Intercom account is already connected to another Harvestr account, please delete it to proceed.")}),t.status(200).send("<h3>Success! Redirecting...</h3><h4>You can close this window.</h4>")}catch(e){o.logger.error(e),t.status(400).send(e)}}}},function(e,t){e.exports=require("shortid")},function(e,t){e.exports=require("graphql-tag")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.intercomCanvasService=void 0;const r=n(7),i=n(1),o=n(8),a=n(0),s=n(3),c={canvas:{content:{components:[{type:"text",text:"*Create new Feedback*",align:"left",style:"header"},{type:"button",label:"Send conversation to Harvestr",style:"secondary",id:"send-harvestr",action:{type:"submit"}}]}}},d={canvas:{content:{components:[{type:"text",text:"You need to add a Harvestr account",align:"left",style:"muted"},{type:"text",text:"Configure your accounts in your [app settings](https://app.harvestr.io/settings/integrations/intercom)",align:"left",style:"muted"}]}}},l=e=>e.discoveries_length?[]:[{type:"divider"},{type:"text",text:"*Sent conversation info*",style:"header"},{type:"data-table",items:[{type:"field-value",field:"Status",value:e.discoveries_length?`Linked to ${e.discoveries_length} discover${1===e.discoveries_length?"y":"ies"}`:e.isRead?"Conversation was read":"Not read"}]},{type:"spacer",size:"xs"},{type:"button",label:"View in Harvestr",style:"link",id:"view-in-harvestr",action:{type:"url",url:`${process.env.HARVESTR_CLIENT_URL}/messages/inbox/${e.discovery_id}`}}];t.intercomCanvasService={conversationReadNotif:l,initCanvas:async(e,t)=>{let n=null;try{n=e?await i.tokenIntercomService.getApiToken(e):null}catch(e){console.log("invalid or no intercom token")}if(!n)return d;const u={type:"INTEGRATION_INTERCOM",project_id:n._projectId||""},p=await o.intercomService.getMessage(t,u),m=[];if(p){for(const e of s.oc(p).chunks([]))if(s.oc(e).discovery()){const t=e.discovery;m.some(e=>e.id===t.id)||m.push({...t,url:`${process.env.client_domain||""}/components/0/list/${a.toClientId(t).id}`,feedback_number:s.oc(t).chunks([]).length||0})}return((e,t,n)=>{console.log("LINK CARDS: ",n);const i=(n||[]).length,o=i?[{type:"text",text:`*Linked discoveries (${i})*`,align:"left",style:"header"}]:[],a=(n||[]).map(e=>r.intercomUtilsService.formatDiscoveryCanvas(e.title,e.url,e.parent.title,e.discoverystate.name,e.feedback_number,e.tags)),s=i?a[0]:[],c=i>1?[{type:"divider"},{type:"button",id:"load-more-discoveries",label:`View all discoveries (${i>1?i-1:0} more)`,style:"link",action:{type:"submit"}}]:[];return{canvas:{content:{components:[...l({isRead:t,discovery_id:e,discoveries_length:(n||[]).length}),...o,...s,...c]},stored_data:{message_id:e,discoveries:[].concat(...a)}}}})(p.clientId||"",p.read,m)}return c}}}]));
\No newline at end of file