eve 0.13.2 → 0.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/chunks/use-eve-agent-BLv-Mj5g.js +1512 -0
  3. package/dist/src/chunks/use-eve-agent-C8UVUMA4.js +1542 -0
  4. package/dist/src/client/agent-info-schema.d.ts +1 -1
  5. package/dist/src/client/agent-info-schema.js +1 -1
  6. package/dist/src/compiled/.vendor-stamp.json +6 -6
  7. package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
  8. package/dist/src/compiled/@ai-sdk/google/index.js +6 -6
  9. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  10. package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
  11. package/dist/src/compiled/@chat-adapter/slack/_slack-web-api.d.ts +1 -0
  12. package/dist/src/compiled/@chat-adapter/slack/blocks.d.ts +160 -0
  13. package/dist/src/compiled/@chat-adapter/slack/blocks.js +8 -0
  14. package/dist/src/compiled/@chat-adapter/slack/index.d.ts +28 -3
  15. package/dist/src/compiled/@chat-adapter/slack/index.js +26 -26
  16. package/dist/src/compiled/@workflow/core/create-hook.d.ts +3 -1
  17. package/dist/src/compiled/@workflow/core/events-consumer.d.ts +9 -0
  18. package/dist/src/compiled/@workflow/core/index.js +2 -2
  19. package/dist/src/compiled/@workflow/core/logger.d.ts +1 -0
  20. package/dist/src/compiled/@workflow/core/private.d.ts +35 -2
  21. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +73 -0
  22. package/dist/src/compiled/@workflow/core/runtime/get-port-lazy.d.ts +15 -0
  23. package/dist/src/compiled/@workflow/core/runtime/run-id-time.d.ts +10 -0
  24. package/dist/src/compiled/@workflow/core/runtime/step-executor.d.ts +61 -1
  25. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +38 -2
  26. package/dist/src/compiled/@workflow/core/runtime.d.ts +1 -0
  27. package/dist/src/compiled/@workflow/core/runtime.js +28 -28
  28. package/dist/src/compiled/@workflow/core/source-map.d.ts +5 -0
  29. package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +27 -0
  30. package/dist/src/compiled/@workflow/core/step-hydration-cache.d.ts +148 -0
  31. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +28 -0
  32. package/dist/src/compiled/@workflow/core/telemetry.d.ts +9 -6
  33. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  34. package/dist/src/compiled/@workflow/core/vm/script-cache.d.ts +28 -0
  35. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  36. package/dist/src/compiled/@workflow/world/events.d.ts +78 -3
  37. package/dist/src/compiled/@workflow/world/index.d.ts +1 -1
  38. package/dist/src/compiled/@workflow/world/spec-version.d.ts +11 -1
  39. package/dist/src/compiled/_chunks/{workflow/core-CXJbIkCL.js → client/core-Bm8azZA6.js} +5 -5
  40. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-Csu8sG38.js +1 -0
  41. package/dist/src/compiled/_chunks/node/{dist-BQYUcBqu.js → dist-W8yle6rh.js} +3 -3
  42. package/dist/src/compiled/_chunks/workflow/{attribute-changes-Bi5DLT8S.js → attribute-changes-DUxG-Gic.js} +3 -3
  43. package/dist/src/compiled/_chunks/workflow/dist-C9PV_vnE.js +77 -0
  44. package/dist/src/compiled/_chunks/workflow/resume-hook-CUCPW67D.js +1 -0
  45. package/dist/src/compiled/_chunks/workflow/{run-XM8dTRAo.js → run-CVlF84yI.js} +1 -1
  46. package/dist/src/compiled/_chunks/workflow/sleep-Dxuzj5to.js +1 -0
  47. package/dist/src/compiled/chat/index.d.ts +4 -4
  48. package/dist/src/compiled/chat/index.js +1 -1
  49. package/dist/src/compiled/chat/{jsx-runtime-CFq1K_Ve.d.ts → jsx-runtime-CzthIo1o.d.ts} +6 -1
  50. package/dist/src/compiled/zod/index.js +1 -1
  51. package/dist/src/compiled/zod-validation-error/index.js +1 -1
  52. package/dist/src/execution/workflow-steps.js +1 -1
  53. package/dist/src/harness/authorization.d.ts +1 -0
  54. package/dist/src/harness/authorization.js +1 -1
  55. package/dist/src/internal/application/optional-package-install.js +15 -1
  56. package/dist/src/internal/application/package.js +1 -1
  57. package/dist/src/public/channels/slack/blocks.d.ts +3 -41
  58. package/dist/src/public/channels/slack/blocks.js +2 -3
  59. package/dist/src/public/channels/slack/defaults.js +3 -3
  60. package/dist/src/setup/scaffold/create/project.js +1 -1
  61. package/dist/src/svelte/index.js +1 -1
  62. package/dist/src/svelte/use-eve-agent.js +1 -1
  63. package/dist/src/vue/index.js +1 -1
  64. package/dist/src/vue/use-eve-agent.js +1 -1
  65. package/docs/guides/instrumentation.md +1 -1
  66. package/package.json +7 -7
  67. package/dist/src/chunks/use-eve-agent-B18LYpfZ.js +0 -5765
  68. package/dist/src/chunks/use-eve-agent-BPI1nbo5.js +0 -5795
  69. package/dist/src/compiled/_chunks/workflow/coerce-B-Ro4Nfe.js +0 -1
  70. package/dist/src/compiled/_chunks/workflow/compat-DLpWymPP.js +0 -1
  71. package/dist/src/compiled/_chunks/workflow/dist-DTchiX0N.js +0 -14
  72. package/dist/src/compiled/_chunks/workflow/resume-hook-CKTw-lb5.js +0 -1
  73. package/dist/src/compiled/_chunks/workflow/schemas-iG9Z4s4o.js +0 -1
  74. package/dist/src/compiled/_chunks/workflow/sleep-DPjVkRY-.js +0 -1
@@ -0,0 +1 @@
1
+ var e=/(?<![<\w])@([A-Z][A-Z0-9_]+)/g;function t(e){return e.replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&amp;/g,`&`)}function n(e){let n=e;return n=n.replace(/<@([A-Z0-9_]+)\|([^<>]+)>/g,`@$2`),n=n.replace(/<@([A-Z0-9_]+)>/g,`@$1`),n=n.replace(/<#[A-Z0-9_]+\|([^<>]+)>/g,`#$1`),n=n.replace(/<#([A-Z0-9_]+)>/g,`#$1`),n=n.replace(/<(https?:\/\/[^|<>]+)\|([^<>]+)>/g,`[$2]($1)`),n=n.replace(/<(https?:\/\/[^<>]+)>/g,`$1`),n=n.replace(/(?<![_*\\])\*([^*\n]+)\*(?![_*])/g,`**$1**`),n=n.replace(/(?<!~)~([^~\n]+)~(?!~)/g,`~~$1~~`),t(n)}function r(e){return e.replace(/\*\*(.+?)\*\*/g,`*$1*`)}function i(t){return t.replace(e,`<@$1>`)}export{r as n,n as r,i as t};
@@ -42,10 +42,10 @@ import{a as e,c as t,n,r,t as i}from"./dist-BdTs18CF.js";import a from"node:path
42
42
  `)}extractPlainText(e){return W(this.toAst(e))}fromMarkdown(e){return this.fromAst(ns(e))}toMarkdown(e){return rs(this.toAst(e))}toPlainText(e){return this.extractPlainText(e)}renderPostable(e){if(typeof e==`string`)return e;if(`raw`in e)return e.raw;if(`markdown`in e)return this.fromMarkdown(e.markdown);if(`ast`in e)return this.fromAst(e.ast);if(`card`in e)return e.fallbackText||this.cardToFallbackText(e.card);if(`type`in e&&e.type===`card`)return this.cardToFallbackText(e);throw Error(`Invalid PostableMessage format`)}cardToFallbackText(e){let t=[];e.title&&t.push(`**${e.title}**`),e.subtitle&&t.push(e.subtitle);for(let n of e.children){let e=this.cardChildToFallbackText(n);e&&t.push(e)}return t.join(`
43
43
  `)}cardChildToFallbackText(e){switch(e.type){case`text`:return e.content;case`fields`:return e.children.map(e=>`**${e.label}**: ${e.value}`).join(`
44
44
  `);case`actions`:return null;case`table`:return $o(e.headers,e.rows);case`section`:return e.children.map(e=>this.cardChildToFallbackText(e)).filter(Boolean).join(`
45
- `);default:return null}}};function ms(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`card`}function hs(e={}){return{type:`card`,title:e.title,subtitle:e.subtitle,imageUrl:e.imageUrl,children:e.children??[]}}function gs(e,t={}){return{type:`text`,content:e,style:t.style}}var _s=gs;function vs(e){return{type:`image`,url:e.url,alt:e.alt}}function ys(){return{type:`divider`}}function bs(e){return{type:`section`,children:e}}function xs(e){return{type:`actions`,children:e}}function Ss(e){return{type:`button`,id:e.id,label:e.label,style:e.style,value:e.value,disabled:e.disabled,actionType:e.actionType,callbackUrl:e.callbackUrl}}function Cs(e){return{type:`link-button`,url:e.url,label:e.label,style:e.style}}function ws(e){return{type:`field`,label:e.label,value:e.value}}function Ts(e){return{type:`fields`,children:e}}function Es(e){return{type:`table`,headers:e.headers,rows:e.rows,align:e.align}}function Ds(e){return{type:`link`,url:e.url,label:e.label}}function Os(e){if(typeof e!=`object`||!e)return!1;let t=e;if(typeof t.$$typeof!=`symbol`)return!1;let n=t.$$typeof.toString();return n.includes(`react.element`)||n.includes(`react.transitional.element`)}var ks=new Map([[hs,`Card`],[gs,`Text`],[vs,`Image`],[ys,`Divider`],[bs,`Section`],[xs,`Actions`],[Ss,`Button`],[Cs,`LinkButton`],[Ds,`CardLink`],[ws,`Field`],[Ts,`Fields`],[Es,`Table`]]);function As(e){if(!Os(e))return ms(e)||typeof e==`object`&&e&&`type`in e?e:null;let{type:t,props:n}=e,r=ks.get(t);if(!r){if(typeof t==`string`)throw Error(`HTML element <${t}> is not supported in card elements. Use Card, Text, Section, Actions, Button, Fields, Field, Image, or Divider components instead.`);return n.children?js(n.children)[0]??null:null}let i=n.children?js(n.children):[],a=e=>e.type!==`card`&&e.type!==`button`&&e.type!==`link-button`&&e.type!==`field`&&e.type!==`select`&&e.type!==`radio_select`;switch(r){case`Card`:return hs({title:n.title,subtitle:n.subtitle,imageUrl:n.imageUrl,children:i.filter(a)});case`Text`:return gs(Ms(n.children),{style:n.style});case`Image`:return vs({url:n.url,alt:n.alt});case`Divider`:return ys();case`Section`:return bs(i.filter(a));case`Actions`:return xs(i.filter(e=>e.type===`button`||e.type===`link-button`||e.type===`select`||e.type===`radio_select`));case`Button`:{let e=Ms(n.children);return Ss({id:n.id,label:n.label??e,style:n.style,value:n.value,actionType:n.actionType,disabled:n.disabled})}case`LinkButton`:{let e=Ms(n.children);return Cs({url:n.url,label:n.label??e,style:n.style})}case`CardLink`:{let e=Ms(n.children);return Ds({url:n.url,label:n.label??e})}case`Field`:return ws({label:n.label,value:n.value});case`Fields`:return Ts(i.filter(e=>e.type===`field`));case`Table`:return Es({headers:n.headers,rows:n.rows,align:n.align});default:return null}}function js(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(js);let t=As(e);return t&&typeof t==`object`&&`type`in t?t.type===`card`?t.children:[t]:[]}function Ms(e){return typeof e==`string`?e:typeof e==`number`?String(e):Array.isArray(e)?e.map(Ms).join(``):``}function Ns(e){let t=[];e.title&&t.push(`**${e.title}**`),e.subtitle&&t.push(e.subtitle);for(let n of e.children){let e=Ps(n);e&&t.push(e)}return t.join(`
45
+ `);default:return null}}};function ms(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`card`}function hs(e={}){return{type:`card`,title:e.title,subtitle:e.subtitle,imageUrl:e.imageUrl,children:e.children??[]}}function gs(e,t={}){return{type:`text`,content:e,style:t.style}}var _s=gs;function vs(e){return{type:`image`,url:e.url,alt:e.alt}}function ys(){return{type:`divider`}}function bs(e){return{type:`section`,children:e}}function xs(e){return{type:`actions`,children:e}}function Ss(e){return{type:`button`,id:e.id,label:e.label,style:e.style,value:e.value,disabled:e.disabled,actionType:e.actionType,callbackUrl:e.callbackUrl}}function Cs(e){return{type:`link-button`,id:e.id,url:e.url,label:e.label,style:e.style}}function ws(e){return{type:`field`,label:e.label,value:e.value}}function Ts(e){return{type:`fields`,children:e}}function Es(e){return{type:`table`,headers:e.headers,rows:e.rows,align:e.align}}function Ds(e){return{type:`link`,url:e.url,label:e.label}}function Os(e){if(typeof e!=`object`||!e)return!1;let t=e;if(typeof t.$$typeof!=`symbol`)return!1;let n=t.$$typeof.toString();return n.includes(`react.element`)||n.includes(`react.transitional.element`)}var ks=new Map([[hs,`Card`],[gs,`Text`],[vs,`Image`],[ys,`Divider`],[bs,`Section`],[xs,`Actions`],[Ss,`Button`],[Cs,`LinkButton`],[Ds,`CardLink`],[ws,`Field`],[Ts,`Fields`],[Es,`Table`]]);function As(e){if(!Os(e))return ms(e)||typeof e==`object`&&e&&`type`in e?e:null;let{type:t,props:n}=e,r=ks.get(t);if(!r){if(typeof t==`string`)throw Error(`HTML element <${t}> is not supported in card elements. Use Card, Text, Section, Actions, Button, Fields, Field, Image, or Divider components instead.`);return n.children?js(n.children)[0]??null:null}let i=n.children?js(n.children):[],a=e=>e.type!==`card`&&e.type!==`button`&&e.type!==`link-button`&&e.type!==`field`&&e.type!==`select`&&e.type!==`radio_select`;switch(r){case`Card`:return hs({title:n.title,subtitle:n.subtitle,imageUrl:n.imageUrl,children:i.filter(a)});case`Text`:return gs(Ms(n.children),{style:n.style});case`Image`:return vs({url:n.url,alt:n.alt});case`Divider`:return ys();case`Section`:return bs(i.filter(a));case`Actions`:return xs(i.filter(e=>e.type===`button`||e.type===`link-button`||e.type===`select`||e.type===`radio_select`));case`Button`:{let e=Ms(n.children);return Ss({id:n.id,label:n.label??e,style:n.style,value:n.value,actionType:n.actionType,disabled:n.disabled})}case`LinkButton`:{let e=Ms(n.children);return Cs({url:n.url,label:n.label??e,style:n.style})}case`CardLink`:{let e=Ms(n.children);return Ds({url:n.url,label:n.label??e})}case`Field`:return ws({label:n.label,value:n.value});case`Fields`:return Ts(i.filter(e=>e.type===`field`));case`Table`:return Es({headers:n.headers,rows:n.rows,align:n.align});default:return null}}function js(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(js);let t=As(e);return t&&typeof t==`object`&&`type`in t?t.type===`card`?t.children:[t]:[]}function Ms(e){return typeof e==`string`?e:typeof e==`number`?String(e):Array.isArray(e)?e.map(Ms).join(``):``}function Ns(e){let t=[];e.title&&t.push(`**${e.title}**`),e.subtitle&&t.push(e.subtitle);for(let n of e.children){let e=Ps(n);e&&t.push(e)}return t.join(`
46
46
  `)}function Ps(e){switch(e.type){case`text`:return e.content;case`link`:return`${e.label} (${e.url})`;case`fields`:return e.children.map(e=>`${e.label}: ${e.value}`).join(`
47
47
  `);case`actions`:return null;case`table`:return $o(e.headers,e.rows);case`section`:return e.children.map(e=>Ps(e)).filter(Boolean).join(`
48
- `);default:return null}}var Fs=[`text_input`,`select`,`external_select`,`radio_select`,`text`,`fields`];function Is(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`modal`}function Ls(e){let t=e.filter(e=>typeof e==`object`&&!!e&&`type`in e&&Fs.includes(e.type));return t.length<e.length&&console.warn(`[chat] Modal contains unsupported child elements that were ignored`),t}function Rs(e){return{type:`modal`,callbackId:e.callbackId,callbackUrl:e.callbackUrl,title:e.title,submitLabel:e.submitLabel,closeLabel:e.closeLabel,notifyOnClose:e.notifyOnClose,privateMetadata:e.privateMetadata,children:e.children??[]}}function zs(e){return{type:`text_input`,id:e.id,label:e.label,placeholder:e.placeholder,initialValue:e.initialValue,multiline:e.multiline,optional:e.optional,maxLength:e.maxLength}}function Bs(e){if(!e.options||e.options.length===0)throw Error(`Select requires at least one option`);return{type:`select`,id:e.id,label:e.label,placeholder:e.placeholder,options:e.options,initialOption:e.initialOption,optional:e.optional}}function Vs(e){return{type:`external_select`,id:e.id,initialOption:e.initialOption,label:e.label,placeholder:e.placeholder,minQueryLength:e.minQueryLength,optional:e.optional}}function Hs(e){return{label:e.label,value:e.value,description:e.description}}function Us(e){if(!e.options||e.options.length===0)throw Error(`RadioSelect requires at least one option`);return{type:`radio_select`,id:e.id,label:e.label,options:e.options,initialOption:e.initialOption,optional:e.optional}}function Ws(e){if(typeof e!=`object`||!e)return!1;let t=e;if(typeof t.$$typeof!=`symbol`)return!1;let n=t.$$typeof.toString();return n.includes(`react.element`)||n.includes(`react.transitional.element`)}var Gs=new Map([[Rs,`Modal`],[zs,`TextInput`],[Bs,`Select`],[Vs,`ExternalSelect`],[Us,`RadioSelect`],[Hs,`SelectOption`]]);function Ks(e){if(!Ws(e))return Is(e)||typeof e==`object`&&e&&`type`in e?e:null;let{type:t,props:n}=e,r=Gs.get(t);if(!r)return n.children?qs(n.children)[0]??null:null;let i=n.children?qs(n.children):[];switch(r){case`Modal`:return Rs({callbackId:n.callbackId,title:n.title,submitLabel:n.submitLabel,closeLabel:n.closeLabel,notifyOnClose:n.notifyOnClose,privateMetadata:n.privateMetadata,children:Ls(i)});case`TextInput`:return zs({id:n.id,label:n.label,placeholder:n.placeholder,initialValue:n.initialValue,multiline:n.multiline,optional:n.optional,maxLength:n.maxLength});case`Select`:return Bs({id:n.id,label:n.label,placeholder:n.placeholder,options:i.filter(e=>e!==null&&`label`in e&&`value`in e&&!(`type`in e)),initialOption:n.initialOption,optional:n.optional});case`ExternalSelect`:return Vs({id:n.id,initialOption:n.initialOption,label:n.label,placeholder:n.placeholder,minQueryLength:n.minQueryLength,optional:n.optional});case`RadioSelect`:return Us({id:n.id,label:n.label,options:i.filter(e=>e!==null&&`label`in e&&`value`in e&&!(`type`in e)),initialOption:n.initialOption,optional:n.optional});case`SelectOption`:return Hs({label:n.label,value:n.value,description:n.description});default:return null}}function qs(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(qs);let t=Ks(e);return t?Is(t)?t.children:[t]:[]}var Js=Symbol.for(`chat.jsx.element`);function Ys(e){return typeof e==`object`&&!!e&&e.$$typeof===Js}function Xs(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(Xs);if(Ys(e)){let t=lc(e);return t?[t]:[]}return typeof e==`object`&&`type`in e?[e]:typeof e==`string`||typeof e==`number`?[String(e)]:[]}function Zs(e){return!(`id`in e||`url`in e||`label`in e)}function Qs(e){return`id`in e&&typeof e.id==`string`&&!(`url`in e)}function $s(e){return`url`in e&&typeof e.url==`string`&&!(`id`in e)}function ec(e){return`url`in e&&typeof e.url==`string`&&!(`id`in e)&&!(`alt`in e)&&!(`style`in e)}function tc(e){return`url`in e&&typeof e.url==`string`}function nc(e){return`label`in e&&`value`in e&&typeof e.label==`string`&&typeof e.value==`string`}function rc(e){return!(`id`in e||`url`in e||`callbackId`in e)&&(`title`in e||`subtitle`in e||`imageUrl`in e)}function ic(e){return`callbackId`in e&&`title`in e}function ac(e){return`id`in e&&`label`in e&&!(`options`in e)&&!(`value`in e)}function oc(e){return`id`in e&&`label`in e&&!(`value`in e)}function sc(e){return`id`in e&&`label`in e&&!(`value`in e)&&!(`children`in e)}function cc(e){return`label`in e&&`value`in e&&!(`id`in e)}function lc(e){let{type:t,props:n,children:r}=e,i=Xs(r);if(t===gs){let e=Zs(n)?n:{style:void 0};return gs(i.length>0?i.map(String).join(``):String(e.children??``),{style:e.style})}if(t===bs)return bs(i);if(t===xs)return xs(i);if(t===Ts)return Ts(i);if(t===Ss){if(!Qs(n))throw Error(`Button requires an 'id' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Ss({id:n.id,label:e,style:n.style,value:n.value,actionType:n.actionType,callbackUrl:n.callbackUrl,disabled:n.disabled})}if(t===Cs){if(!$s(n))throw Error(`LinkButton requires a 'url' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Cs({url:n.url,label:e,style:n.style})}if(t===Ds){if(!ec(n))throw Error(`CardLink requires a 'url' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Ds({url:n.url,label:e})}if(t===vs){if(!tc(n))throw Error(`Image requires a 'url' prop`);return vs({url:n.url,alt:n.alt})}if(t===ws){if(!nc(n))throw Error(`Field requires 'label' and 'value' props`);return ws({label:n.label,value:n.value})}if(t===ys)return ys();if(t===Rs){if(!ic(n))throw Error(`Modal requires 'callbackId' and 'title' props`);return Rs({callbackId:n.callbackId,callbackUrl:n.callbackUrl,title:n.title,submitLabel:n.submitLabel,closeLabel:n.closeLabel,notifyOnClose:n.notifyOnClose,privateMetadata:n.privateMetadata,children:Ls(i)})}if(t===zs){if(!ac(n))throw Error(`TextInput requires 'id' and 'label' props`);return zs({id:n.id,label:n.label,placeholder:n.placeholder,initialValue:n.initialValue,multiline:n.multiline,optional:n.optional,maxLength:n.maxLength})}if(t===Bs){if(!oc(n))throw Error(`Select requires 'id' and 'label' props`);return Bs({id:n.id,label:n.label,placeholder:n.placeholder,initialOption:n.initialOption,optional:n.optional,options:i})}if(t===Vs){if(!sc(n))throw Error(`ExternalSelect requires 'id' and 'label' props`);return Vs({id:n.id,initialOption:n.initialOption,label:n.label,placeholder:n.placeholder,minQueryLength:n.minQueryLength,optional:n.optional})}if(t===Us){if(!oc(n))throw Error(`RadioSelect requires 'id' and 'label' props`);return Us({id:n.id,label:n.label,initialOption:n.initialOption,optional:n.optional,options:i})}if(t===Hs){if(!cc(n))throw Error(`SelectOption requires 'label' and 'value' props`);return Hs({label:n.label,value:n.value,description:n.description})}if(t===Es){let e=n;return Es({headers:e.headers,rows:e.rows})}let a=rc(n)?n:{};return hs({title:a.title,subtitle:a.subtitle,imageUrl:a.imageUrl,children:i})}function J(e){if(Ys(e)){let t=lc(e);if(t&&typeof t==`object`&&`type`in t&&t.type===`card`)return t}return typeof e==`object`&&e&&`type`in e&&e.type===`card`?e:null}function uc(e){if(Ys(e)){let t=lc(e);if(t&&typeof t==`object`&&`type`in t&&t.type===`modal`)return t}return Is(e)?e:null}function Y(e){if(Ys(e))return!0;if(typeof e==`object`&&e&&`$$typeof`in e&&typeof e.$$typeof==`symbol`){let t=e.$$typeof.toString();return t.includes(`react.element`)||t.includes(`react.transitional.element`)}return!1}var dc=[`text/`,`application/json`,`application/xml`,`application/javascript`,`application/typescript`,`application/yaml`,`application/x-yaml`,`application/toml`];function fc(e){return dc.some(t=>e===t||e.startsWith(t))}async function pc(e){if(e.type===`image`){if(e.fetchData)try{let t=await e.fetchData(),n=e.mimeType??`image/png`;return{type:`file`,data:`data:${n};base64,${t.toString(`base64`)}`,mediaType:n,filename:e.name}}catch(e){return console.error(`toAiMessages: failed to fetch image data`,e),null}return null}if(e.type===`file`&&e.mimeType&&fc(e.mimeType)){if(e.fetchData)try{let t=await e.fetchData();return{type:`file`,data:`data:${e.mimeType};base64,${t.toString(`base64`)}`,filename:e.name,mediaType:e.mimeType}}catch(e){return console.error(`toAiMessages: failed to fetch file data`,e),null}return null}return null}async function mc(e,t){let n=t?.includeNames??!1,r=t?.transformMessage,i=t?.onUnsupportedAttachment??(e=>{console.warn(`toAiMessages: unsupported attachment type "${e.type}"${e.name?` (${e.name})`:``} \u2014 skipped`)}),a=[...e].sort((e,t)=>(e.metadata.dateSent?.getTime()??0)-(t.metadata.dateSent?.getTime()??0)).filter(e=>e.text.trim());return(await Promise.all(a.map(async e=>{let t=e.author.isMe?`assistant`:`user`,a=n&&t===`user`?`[${e.author.userName}]: ${e.text}`:e.text;if(e.links&&e.links.length>0){let t=e.links.map(e=>{let t=e.fetchMessage?[`[Embedded message: ${e.url}]`]:[e.url];return e.title&&t.push(`Title: ${e.title}`),e.description&&t.push(`Description: ${e.description}`),e.siteName&&t.push(`Site: ${e.siteName}`),t.join(`
48
+ `);default:return null}}var Fs=[`text_input`,`select`,`external_select`,`radio_select`,`text`,`fields`];function Is(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`modal`}function Ls(e){let t=e.filter(e=>typeof e==`object`&&!!e&&`type`in e&&Fs.includes(e.type));return t.length<e.length&&console.warn(`[chat] Modal contains unsupported child elements that were ignored`),t}function Rs(e){return{type:`modal`,callbackId:e.callbackId,callbackUrl:e.callbackUrl,title:e.title,submitLabel:e.submitLabel,closeLabel:e.closeLabel,notifyOnClose:e.notifyOnClose,privateMetadata:e.privateMetadata,children:e.children??[]}}function zs(e){return{type:`text_input`,id:e.id,label:e.label,placeholder:e.placeholder,initialValue:e.initialValue,multiline:e.multiline,optional:e.optional,maxLength:e.maxLength}}function Bs(e){if(!e.options||e.options.length===0)throw Error(`Select requires at least one option`);return{type:`select`,id:e.id,label:e.label,placeholder:e.placeholder,options:e.options,initialOption:e.initialOption,optional:e.optional}}function Vs(e){return{type:`external_select`,id:e.id,initialOption:e.initialOption,label:e.label,placeholder:e.placeholder,minQueryLength:e.minQueryLength,optional:e.optional}}function Hs(e){return{label:e.label,value:e.value,description:e.description}}function Us(e){if(!e.options||e.options.length===0)throw Error(`RadioSelect requires at least one option`);return{type:`radio_select`,id:e.id,label:e.label,options:e.options,initialOption:e.initialOption,optional:e.optional}}function Ws(e){if(typeof e!=`object`||!e)return!1;let t=e;if(typeof t.$$typeof!=`symbol`)return!1;let n=t.$$typeof.toString();return n.includes(`react.element`)||n.includes(`react.transitional.element`)}var Gs=new Map([[Rs,`Modal`],[zs,`TextInput`],[Bs,`Select`],[Vs,`ExternalSelect`],[Us,`RadioSelect`],[Hs,`SelectOption`]]);function Ks(e){if(!Ws(e))return Is(e)||typeof e==`object`&&e&&`type`in e?e:null;let{type:t,props:n}=e,r=Gs.get(t);if(!r)return n.children?qs(n.children)[0]??null:null;let i=n.children?qs(n.children):[];switch(r){case`Modal`:return Rs({callbackId:n.callbackId,title:n.title,submitLabel:n.submitLabel,closeLabel:n.closeLabel,notifyOnClose:n.notifyOnClose,privateMetadata:n.privateMetadata,children:Ls(i)});case`TextInput`:return zs({id:n.id,label:n.label,placeholder:n.placeholder,initialValue:n.initialValue,multiline:n.multiline,optional:n.optional,maxLength:n.maxLength});case`Select`:return Bs({id:n.id,label:n.label,placeholder:n.placeholder,options:i.filter(e=>e!==null&&`label`in e&&`value`in e&&!(`type`in e)),initialOption:n.initialOption,optional:n.optional});case`ExternalSelect`:return Vs({id:n.id,initialOption:n.initialOption,label:n.label,placeholder:n.placeholder,minQueryLength:n.minQueryLength,optional:n.optional});case`RadioSelect`:return Us({id:n.id,label:n.label,options:i.filter(e=>e!==null&&`label`in e&&`value`in e&&!(`type`in e)),initialOption:n.initialOption,optional:n.optional});case`SelectOption`:return Hs({label:n.label,value:n.value,description:n.description});default:return null}}function qs(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(qs);let t=Ks(e);return t?Is(t)?t.children:[t]:[]}var Js=Symbol.for(`chat.jsx.element`);function Ys(e){return typeof e==`object`&&!!e&&e.$$typeof===Js}function Xs(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(Xs);if(Ys(e)){let t=lc(e);return t?[t]:[]}return typeof e==`object`&&`type`in e?[e]:typeof e==`string`||typeof e==`number`?[String(e)]:[]}function Zs(e){return!(`id`in e||`url`in e||`label`in e)}function Qs(e){return`id`in e&&typeof e.id==`string`&&!(`url`in e)}function $s(e){return`url`in e&&typeof e.url==`string`&&!(`id`in e)}function ec(e){return`url`in e&&typeof e.url==`string`&&!(`id`in e)&&!(`alt`in e)&&!(`style`in e)}function tc(e){return`url`in e&&typeof e.url==`string`}function nc(e){return`label`in e&&`value`in e&&typeof e.label==`string`&&typeof e.value==`string`}function rc(e){return!(`id`in e||`url`in e||`callbackId`in e)&&(`title`in e||`subtitle`in e||`imageUrl`in e)}function ic(e){return`callbackId`in e&&`title`in e}function ac(e){return`id`in e&&`label`in e&&!(`options`in e)&&!(`value`in e)}function oc(e){return`id`in e&&`label`in e&&!(`value`in e)}function sc(e){return`id`in e&&`label`in e&&!(`value`in e)&&!(`children`in e)}function cc(e){return`label`in e&&`value`in e&&!(`id`in e)}function lc(e){let{type:t,props:n,children:r}=e,i=Xs(r);if(t===gs){let e=Zs(n)?n:{style:void 0};return gs(i.length>0?i.map(String).join(``):String(e.children??``),{style:e.style})}if(t===bs)return bs(i);if(t===xs)return xs(i);if(t===Ts)return Ts(i);if(t===Ss){if(!Qs(n))throw Error(`Button requires an 'id' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Ss({id:n.id,label:e,style:n.style,value:n.value,actionType:n.actionType,callbackUrl:n.callbackUrl,disabled:n.disabled})}if(t===Cs){if(!$s(n))throw Error(`LinkButton requires a 'url' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Cs({id:n.id,url:n.url,label:e,style:n.style})}if(t===Ds){if(!ec(n))throw Error(`CardLink requires a 'url' prop`);let e=i.length>0?i.map(String).join(``):n.label??``;return Ds({url:n.url,label:e})}if(t===vs){if(!tc(n))throw Error(`Image requires a 'url' prop`);return vs({url:n.url,alt:n.alt})}if(t===ws){if(!nc(n))throw Error(`Field requires 'label' and 'value' props`);return ws({label:n.label,value:n.value})}if(t===ys)return ys();if(t===Rs){if(!ic(n))throw Error(`Modal requires 'callbackId' and 'title' props`);return Rs({callbackId:n.callbackId,callbackUrl:n.callbackUrl,title:n.title,submitLabel:n.submitLabel,closeLabel:n.closeLabel,notifyOnClose:n.notifyOnClose,privateMetadata:n.privateMetadata,children:Ls(i)})}if(t===zs){if(!ac(n))throw Error(`TextInput requires 'id' and 'label' props`);return zs({id:n.id,label:n.label,placeholder:n.placeholder,initialValue:n.initialValue,multiline:n.multiline,optional:n.optional,maxLength:n.maxLength})}if(t===Bs){if(!oc(n))throw Error(`Select requires 'id' and 'label' props`);return Bs({id:n.id,label:n.label,placeholder:n.placeholder,initialOption:n.initialOption,optional:n.optional,options:i})}if(t===Vs){if(!sc(n))throw Error(`ExternalSelect requires 'id' and 'label' props`);return Vs({id:n.id,initialOption:n.initialOption,label:n.label,placeholder:n.placeholder,minQueryLength:n.minQueryLength,optional:n.optional})}if(t===Us){if(!oc(n))throw Error(`RadioSelect requires 'id' and 'label' props`);return Us({id:n.id,label:n.label,initialOption:n.initialOption,optional:n.optional,options:i})}if(t===Hs){if(!cc(n))throw Error(`SelectOption requires 'label' and 'value' props`);return Hs({label:n.label,value:n.value,description:n.description})}if(t===Es){let e=n;return Es({headers:e.headers,rows:e.rows})}let a=rc(n)?n:{};return hs({title:a.title,subtitle:a.subtitle,imageUrl:a.imageUrl,children:i})}function J(e){if(Ys(e)){let t=lc(e);if(t&&typeof t==`object`&&`type`in t&&t.type===`card`)return t}return typeof e==`object`&&e&&`type`in e&&e.type===`card`?e:null}function uc(e){if(Ys(e)){let t=lc(e);if(t&&typeof t==`object`&&`type`in t&&t.type===`modal`)return t}return Is(e)?e:null}function Y(e){if(Ys(e))return!0;if(typeof e==`object`&&e&&`$$typeof`in e&&typeof e.$$typeof==`symbol`){let t=e.$$typeof.toString();return t.includes(`react.element`)||t.includes(`react.transitional.element`)}return!1}var dc=[`text/`,`application/json`,`application/xml`,`application/javascript`,`application/typescript`,`application/yaml`,`application/x-yaml`,`application/toml`];function fc(e){return dc.some(t=>e===t||e.startsWith(t))}async function pc(e){if(e.type===`image`){if(e.fetchData)try{let t=await e.fetchData(),n=e.mimeType??`image/png`;return{type:`file`,data:`data:${n};base64,${t.toString(`base64`)}`,mediaType:n,filename:e.name}}catch(e){return console.error(`toAiMessages: failed to fetch image data`,e),null}return null}if(e.type===`file`&&e.mimeType&&fc(e.mimeType)){if(e.fetchData)try{let t=await e.fetchData();return{type:`file`,data:`data:${e.mimeType};base64,${t.toString(`base64`)}`,filename:e.name,mediaType:e.mimeType}}catch(e){return console.error(`toAiMessages: failed to fetch file data`,e),null}return null}return null}async function mc(e,t){let n=t?.includeNames??!1,r=t?.transformMessage,i=t?.onUnsupportedAttachment??(e=>{console.warn(`toAiMessages: unsupported attachment type "${e.type}"${e.name?` (${e.name})`:``} \u2014 skipped`)}),a=[...e].sort((e,t)=>(e.metadata.dateSent?.getTime()??0)-(t.metadata.dateSent?.getTime()??0)).filter(e=>e.text.trim());return(await Promise.all(a.map(async e=>{let t=e.author.isMe?`assistant`:`user`,a=n&&t===`user`?`[${e.author.userName}]: ${e.text}`:e.text;if(e.links&&e.links.length>0){let t=e.links.map(e=>{let t=e.fetchMessage?[`[Embedded message: ${e.url}]`]:[e.url];return e.title&&t.push(`Title: ${e.title}`),e.description&&t.push(`Description: ${e.description}`),e.siteName&&t.push(`Site: ${e.siteName}`),t.join(`
49
49
  `)}).join(`
50
50
 
51
51
  `);a+=`
@@ -86,5 +86,5 @@ $$`:`${e}$$`},Dl=e=>wl(e)%2==0?e:El(e),Ol=e=>Tl(e)%2==1?`${e}$`:e,kl=(e,t,n)=>{i
86
86
  `),r=e.split(`
87
87
  `);n&&r.length>0&&r.at(-1)===``&&r.pop();let i=[],a=!1,o=!1;for(let e=0;e<r.length;e++){let t=r[e].trim();if(!a&&(t.startsWith("```")||t.startsWith(`~~~`))){o=!o,i.push(r[e]);continue}if(o){i.push(r[e]);continue}let n=t!==``&&(Au.test(t)||ju.test(t));if(n&&!a){let t=!1;for(let n=e;n<r.length;n++){let e=r[n].trim();if(ju.test(e)){t=!0;break}if(e===``||!Au.test(e))break}t&&(i.push("```"),a=!0)}else !n&&a&&(i.push("```"),a=!1);i.push(r[e])}a&&t&&i.push("```");let s=i.join(`
88
88
  `);return n&&(s+=`
89
- `),s}function Fu(e){return`adapterName`in e&&!(`adapter`in e)}var Iu=`thread-state:`;function Lu(e){return typeof e==`object`&&!!e&&Symbol.asyncIterator in e}var Ru=class e{id;channelId;isDM;channelVisibility;_adapter;_adapterName;_stateAdapterInstance;_recentMessages=[];_isSubscribedContext;_currentMessage;_streamingUpdateIntervalMs;_fallbackStreamingPlaceholderText;_channel;_threadHistory;_logger;constructor(e){this.id=e.id,this.channelId=e.channelId,this.isDM=e.isDM??!1,this.channelVisibility=e.channelVisibility??`unknown`,this._isSubscribedContext=e.isSubscribedContext??!1,this._currentMessage=e.currentMessage,this._logger=e.logger,this._streamingUpdateIntervalMs=e.streamingUpdateIntervalMs??500,this._fallbackStreamingPlaceholderText=e.fallbackStreamingPlaceholderText===void 0?`...`:e.fallbackStreamingPlaceholderText,Fu(e)?this._adapterName=e.adapterName:(this._adapter=e.adapter,this._stateAdapterInstance=e.stateAdapter,this._threadHistory=e.threadHistory),e.initialMessage&&(this._recentMessages=[e.initialMessage])}get adapter(){if(this._adapter)return this._adapter;if(!this._adapterName)throw Error(`Thread has no adapter configured`);let e=ou().getAdapter(this._adapterName);if(!e)throw Error(`Adapter "${this._adapterName}" not found in Chat singleton`);return this._adapter=e,e}get _stateAdapter(){if(this._stateAdapterInstance)return this._stateAdapterInstance;let e=ou();return this._stateAdapterInstance=e.getState(),this._stateAdapterInstance}get recentMessages(){return this._recentMessages}set recentMessages(e){this._recentMessages=e}get state(){return this._stateAdapter.get(`${Iu}${this.id}`)}async setState(e,t){let n=`${Iu}${this.id}`;if(t?.replace)await this._stateAdapter.set(n,e,yu);else{let t={...await this._stateAdapter.get(n),...e};await this._stateAdapter.set(n,t,yu)}}get channel(){if(!this._channel){let e=wu(this.adapter,this.id);this._channel=new Cu({id:e,adapter:this.adapter,stateAdapter:this._stateAdapter,isDM:this.isDM,channelVisibility:this.channelVisibility,threadHistory:this._threadHistory})}return this._channel}get messages(){let e=this.adapter,t=this.id,n=this._threadHistory;return{async*[Symbol.asyncIterator](){let r,i=!1;for(;;){let n=await e.fetchMessages(t,{cursor:r,direction:`backward`}),a=[...n.messages].reverse();for(let e of a)i=!0,yield e;if(!n.nextCursor||n.messages.length===0)break;r=n.nextCursor}if(!i&&n){let e=await n.getMessages(t);for(let t=e.length-1;t>=0;t--)yield e[t]}}}}get allMessages(){let e=this.adapter,t=this.id,n=this._threadHistory;return{async*[Symbol.asyncIterator](){let r,i=!1;for(;;){let n=await e.fetchMessages(t,{limit:100,cursor:r,direction:`forward`});for(let e of n.messages)i=!0,yield e;if(!n.nextCursor||n.messages.length===0)break;r=n.nextCursor}if(!i&&n){let e=await n.getMessages(t);for(let t of e)yield t}}}}async getParticipants(){let e=new Map;this._currentMessage&&!this._currentMessage.author.isMe&&!this._currentMessage.author.isBot&&e.set(this._currentMessage.author.userId,this._currentMessage.author);for await(let t of this.allMessages)t.author.isMe||t.author.isBot||e.has(t.author.userId)||e.set(t.author.userId,t.author);return[...e.values()]}async isSubscribed(){return this._isSubscribedContext?!0:this._stateAdapter.isSubscribed(this.id)}async subscribe(){await this._stateAdapter.subscribe(this.id),this.adapter.onThreadSubscribe&&await this.adapter.onThreadSubscribe(this.id)}async unsubscribe(){await this._stateAdapter.unsubscribe(this.id)}async post(e){if(pu(e)){if(e.kind===`stream`){let t=e.getPostData(),n={...t.options.updateIntervalMs?{updateIntervalMs:t.options.updateIntervalMs}:{},...t.options.groupTasks?{taskDisplayMode:t.options.groupTasks}:{},...t.options.endWith?{stopBlocks:t.options.endWith}:{}};return await this.handleStream(t.stream,n),e}return await this.handlePostableObject(e),e}if(Lu(e))return this.handleStream(e);let t=e;if(Y(e)){let n=J(e);if(!n)throw Error(`Invalid JSX element: must be a Card element`);t=n}t=await this.processCallbackUrls(t);let n=await this.adapter.postMessage(this.id,t),r=this.createSentMessage(n.id,t,n.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(r)),r}async handlePostableObject(e){await mu(e,this.adapter,this.id,(e,t)=>this.adapter.postMessage(e,t),this._logger)}async postEphemeral(e,t,n){let{fallbackToDM:r}=n,i=typeof e==`string`?e:e.userId,a;if(Y(t)){let e=J(t);if(!e)throw Error(`Invalid JSX element: must be a Card element`);a=e}else a=t;if(a=await this.processCallbackUrls(a),this.adapter.postEphemeral)return this.adapter.postEphemeral(this.id,i,a);if(!r)return null;if(this.adapter.openDM){let e=await this.adapter.openDM(i),t=await this.adapter.postMessage(e,a);return{id:t.id,threadId:e,usedFallback:!0,raw:t.raw}}return null}async processCallbackUrls(e){if(typeof e==`string`)return e;if(`type`in e&&e.type===`card`)return tu(e,this._stateAdapter);if(`card`in e&&e.card?.type===`card`){let t=await tu(e.card,this._stateAdapter);if(t!==e.card)return{...e,card:t}}return e}async schedule(e,t){let n;if(Y(e)){let t=J(e);if(!t)throw Error(`Invalid JSX element: must be a Card element`);n=t}else n=e;if(n=await this.processCallbackUrls(n),!this.adapter.scheduleMessage)throw new _u(`Scheduled messages are not supported by this adapter`,`scheduling`);return this.adapter.scheduleMessage(this.id,n,t)}async handleStream(e,t){let n=lu(e),r={...t};if(this._currentMessage&&(r.recipientUserId=this._currentMessage.author.userId,r.recipientTeamId=this.extractSlackRecipientTeamId(this._currentMessage.raw)),this.adapter.stream){let e=``,t={[Symbol.asyncIterator]:()=>{let t=n[Symbol.asyncIterator]();return{async next(){let n=await t.next();if(!n.done){let t=n.value;typeof t==`string`?e+=t:t.type===`markdown_text`&&(e+=t.text)}return n}}}},i=await this.adapter.stream(this.id,t,r),a=this.createSentMessage(i.id,{markdown:e},i.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(a)),a}let i={[Symbol.asyncIterator]:()=>{let e=n[Symbol.asyncIterator]();return{async next(){for(;;){let t=await e.next();if(t.done)return{value:void 0,done:!0};let n=t.value;if(typeof n==`string`)return{value:n,done:!1};if(n.type===`markdown_text`)return{value:n.text,done:!1}}}}}};return this.fallbackStream(i,r)}extractSlackRecipientTeamId(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.team_id==`string`&&t.team_id)return t.team_id;if(typeof t.team==`string`&&t.team)return t.team;if(t.team&&typeof t.team==`object`&&typeof t.team.id==`string`&&t.team.id)return t.team.id;if(typeof t.user?.team_id==`string`&&t.user.team_id)return t.user.team_id}async startTyping(e){await this.adapter.startTyping(this.id,e)}async fallbackStream(e,t){let n=t?.updateIntervalMs??this._streamingUpdateIntervalMs,r=this._fallbackStreamingPlaceholderText,i=r===null?null:await this.adapter.postMessage(this.id,r),a=this.id,o=new Eu,s=``,c=!1,l=null,u=null;i&&(a=i.threadId||this.id,s=r??``);let d=()=>{u=setTimeout(()=>{l=f()},n)},f=async()=>{if(c||!i)return;let e=o.render();if(e.trim()&&e!==s)try{await this.adapter.editMessage(a,i.id,{markdown:e}),s=e}catch(e){this._logger?.warn(`fallbackStream edit failed`,e)}c||d()};i&&d();try{for await(let t of e)if(o.push(t),!i){let e=o.render();e.trim()&&(i=await this.adapter.postMessage(this.id,{markdown:e}),a=i.threadId||this.id,s=e,d())}}finally{c=!0,u&&=(clearTimeout(u),null)}l&&await l;let p=o.getText(),m=o.finish();i||(i=await this.adapter.postMessage(this.id,{markdown:p.trim()?p:` `}),a=i.threadId||this.id,s=p),m.trim()&&m!==s&&await this.adapter.editMessage(a,i.id,{markdown:p});let h=this.createSentMessage(i.id,{markdown:p},a);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(h)),h}async refresh(){let e=await this.adapter.fetchMessages(this.id,{limit:50});e.messages.length>0?this._recentMessages=e.messages:this._threadHistory?this._recentMessages=await this._threadHistory.getMessages(this.id,50):this._recentMessages=[]}mentionUser(e){return`<@${e}>`}toJSON(){return{_type:`chat:Thread`,id:this.id,channelId:this.channelId,channelVisibility:this.channelVisibility,currentMessage:this._currentMessage?.toJSON(),isDM:this.isDM,adapterName:this._adapterName??this.adapter.name}}static fromJSON(t,n){let r=new e({id:t.id,adapterName:t.adapterName,channelId:t.channelId,channelVisibility:t.channelVisibility,currentMessage:t.currentMessage?Q.fromJSON(t.currentMessage):void 0,isDM:t.isDM});return n&&(r._adapter=n),r}static[n](e){return e.toJSON()}static[i](t){return e.fromJSON(t)}createSentMessage(e,t,n){let r=this.adapter,i=n||this.id,a=this,{plainText:o,formatted:s,attachments:c}=zu(t);return{id:e,threadId:i,text:o,formatted:s,raw:null,links:[],author:{userId:`self`,userName:r.userName,fullName:r.userName,isBot:!0,isMe:!0},metadata:{dateSent:new Date,edited:!1},attachments:c,toJSON(){return new Q(this).toJSON()},async edit(t){let n=t;if(Y(t)){let e=J(t);if(!e)throw Error(`Invalid JSX element: must be a Card element`);n=e}return n=await a.processCallbackUrls(n),await r.editMessage(i,e,n),a.createSentMessage(e,n)},async delete(){await r.deleteMessage(i,e)},async addReaction(t){await r.addReaction(i,e,t)},async removeReaction(t){await r.removeReaction(i,e,t)}}}createSentMessageFromMessage(e){let t=this.adapter,n=this.id,r=e.id,i=this;return{id:e.id,threadId:e.threadId,text:e.text,formatted:e.formatted,raw:e.raw,author:e.author,metadata:e.metadata,attachments:e.attachments,links:e.links,isMention:e.isMention,toJSON(){return e.toJSON()},async edit(e){let a=e;if(Y(e)){let t=J(e);if(!t)throw Error(`Invalid JSX element: must be a Card element`);a=t}return a=await i.processCallbackUrls(a),await t.editMessage(n,r,a),i.createSentMessage(r,a,n)},async delete(){await t.deleteMessage(n,r)},async addReaction(e){await t.addReaction(n,r,e)},async removeReaction(e){await t.removeReaction(n,r,e)}}}};function zu(e){if(typeof e==`string`)return{plainText:e,formatted:q([K([G(e)])]),attachments:[]};if(`raw`in e)return{plainText:e.raw,formatted:q([K([G(e.raw)])]),attachments:e.attachments||[]};if(`markdown`in e){let t=ns(e.markdown);return{plainText:W(t),formatted:t,attachments:e.attachments||[]}}if(`ast`in e)return{plainText:W(e.ast),formatted:e.ast,attachments:e.attachments||[]};if(`card`in e){let t=e.fallbackText||Ns(e.card);return{plainText:t,formatted:q([K([G(t)])]),attachments:[]}}if(`type`in e&&e.type===`card`){let t=Ns(e);return{plainText:t,formatted:q([K([G(t)])]),attachments:[]}}throw Error(`Invalid PostableMessage format`)}function Bu(e,t){if(t&&typeof t==`object`&&`_type`in t){let e=t;if(e._type===`chat:Thread`)return Ru.fromJSON(t);if(e._type===`chat:Channel`)return Cu.fromJSON(t);if(e._type===`chat:Message`)return Q.fromJSON(t)}return t}var Vu=100,Hu=10080*60*1e3,Uu=`msg-history:`,Wu=class{state;maxMessages;ttlMs;constructor(e,t){this.state=e,this.maxMessages=t?.maxMessages??Vu,this.ttlMs=t?.ttlMs??Hu}async append(e,t){let n=`${Uu}${e}`,r=t.toJSON();r.raw=null,await this.state.appendToList(n,r,{maxLength:this.maxMessages,ttlMs:this.ttlMs})}async getMessages(e,t){let n=`${Uu}${e}`,r=await this.state.getList(n);return(t&&r.length>t?r.slice(r.length-t):r).map(e=>Q.fromJSON(e))}},Gu=`transcripts:user:`,Ku=200,qu=50,Ju=/^(\d+)([smhd])$/,Yu=`__chatSdkTombstone`;function Xu(e){return typeof e==`object`&&!!e&&e[Yu]===!0}var Zu={s:1e3,m:6e4,h:36e5,d:864e5},Qu=class{state;maxPerUser;retentionMs;storeFormatted;constructor(e,t){this.state=e,this.maxPerUser=t.maxPerUser??Ku,this.retentionMs=ed(t.retention),this.storeFormatted=t.storeFormatted??!1}async append(e,t,n){let r=t instanceof Q,i,a,o;if(r){if(i=t.userKey,a=`user`,o=t.id,!i)return null}else if(i=n?.userKey,a=t.role,o=t.platformMessageId,!i)throw Error(`transcripts.append: options.userKey is required when appending an AppendInput`);let s={id:crypto.randomUUID(),userKey:i,role:a,text:t.text,platform:e.adapter.name,threadId:e.id,timestamp:Date.now()};return this.storeFormatted&&t.formatted&&(s.formatted=t.formatted),o!==void 0&&(s.platformMessageId=o),await this.state.appendToList($u(i),s,{maxLength:this.maxPerUser,ttlMs:this.retentionMs}),s}async list(e){let t=(await this.state.getList($u(e.userKey))).filter(e=>!Xu(e));if(e.platforms&&e.platforms.length>0){let n=new Set(e.platforms);t=t.filter(e=>n.has(e.platform))}if(e.threadId!==void 0){let n=e.threadId;t=t.filter(e=>e.threadId===n)}if(e.roles&&e.roles.length>0){let n=new Set(e.roles);t=t.filter(e=>n.has(e.role))}let n=e.limit??qu;return t.length>n&&(t=t.slice(t.length-n)),t}async count(e){return(await this.state.getList($u(e.userKey))).filter(e=>!Xu(e)).length}async delete(e){let t=$u(e.userKey),n=(await this.state.getList(t)).filter(e=>!Xu(e)).length,r={[Yu]:!0};return await this.state.appendToList(t,r,{maxLength:1,ttlMs:this.retentionMs}),{deleted:n}}};function $u(e){return`${Gu}${e}`}function ed(e){if(e===void 0)return;if(typeof e==`number`)return e;let t=Ju.exec(e);if(!t)throw Error(`Invalid duration: ${e} (expected number of ms, or "<n>[smhd]")`);return Number.parseInt(t[1],10)*Zu[t[2]]}var td=3e4;function nd(e){return new Promise(t=>setTimeout(t,e))}var rd=/^[UW][A-Z0-9]+$/,id=/^\d{17,19}$/,ad=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,od=/^\d+$/,sd=300*1e3,cd=1440*60*1e3,ld=class{registerSingleton(){return au(this),this}get transcripts(){if(!this._transcripts)throw Error("chat.transcripts is not configured — pass `transcripts` and `identity` to ChatConfig to enable it");return this._transcripts}static getSingleton(){return ou()}static hasSingleton(){return su()}adapters;_stateAdapter;userName;logger;_streamingUpdateIntervalMs;_fallbackStreamingPlaceholderText;_dedupeTtlMs;_onLockConflict;_threadHistory;_identity;_transcripts;_concurrencyStrategy;_concurrencyConfig;_concurrentSlots=new Map;_lockScope;mentionHandlers=[];directMessageHandlers=[];messagePatterns=[];subscribedMessageHandlers=[];reactionHandlers=[];actionHandlers=[];optionsLoadHandlers=[];modalSubmitHandlers=[];modalCloseHandlers=[];slashCommandHandlers=[];assistantThreadStartedHandlers=[];assistantContextChangedHandlers=[];appHomeOpenedHandlers=[];memberJoinedChannelHandlers=[];initPromise=null;initialized=!1;webhooks;constructor(e){this.userName=e.userName,this._stateAdapter=e.state,this.adapters=new Map,this._streamingUpdateIntervalMs=e.streamingUpdateIntervalMs??500,this._fallbackStreamingPlaceholderText=e.fallbackStreamingPlaceholderText===void 0?`...`:e.fallbackStreamingPlaceholderText,this._dedupeTtlMs=e.dedupeTtlMs??sd,this._onLockConflict=e.onLockConflict,this._lockScope=e.lockScope,typeof e.logger==`string`?this.logger=new vu(e.logger):this.logger=e.logger||new vu(`info`);let t=e.concurrency;if(t)if(typeof t==`string`)this._concurrencyStrategy=t,this._concurrencyConfig={debounceMs:1500,maxConcurrent:1/0,maxQueueSize:10,onQueueFull:`drop-oldest`,queueEntryTtlMs:9e4};else{if(t.maxConcurrent!==void 0&&t.maxConcurrent<1)throw Error(`concurrency.maxConcurrent must be >= 1 (got ${t.maxConcurrent})`);t.maxConcurrent!==void 0&&t.strategy!==`concurrent`&&this.logger.warn(`concurrency.maxConcurrent has no effect when strategy is "${t.strategy}" \u2014 it only applies to the "concurrent" strategy.`),this._concurrencyStrategy=t.strategy,this._concurrencyConfig={debounceMs:t.debounceMs??1500,maxConcurrent:t.maxConcurrent??1/0,maxQueueSize:t.maxQueueSize??10,onQueueFull:t.onQueueFull??`drop-oldest`,queueEntryTtlMs:t.queueEntryTtlMs??9e4}}else this._concurrencyStrategy=`drop`,this._concurrencyConfig={debounceMs:1500,maxConcurrent:1/0,maxQueueSize:10,onQueueFull:`drop-oldest`,queueEntryTtlMs:9e4};if(this._threadHistory=new Wu(this._stateAdapter,e.threadHistory??e.messageHistory),e.transcripts){if(!e.identity)throw Error(`ChatConfig.transcripts requires ChatConfig.identity to be set — the cross-platform user key must be resolvable`);this._identity=e.identity,this._transcripts=new Qu(this._stateAdapter,e.transcripts)}else this._identity=e.identity;let n={};for(let[t,r]of Object.entries(e.adapters))this.adapters.set(t,r),n[t]=(e,n)=>this.handleWebhook(t,e,n);this.webhooks=n,this.logger.debug(`Chat instance created`,{adapters:Object.keys(e.adapters)})}async handleWebhook(e,t,n){await this.ensureInitialized();let r=this.adapters.get(e);return r?r.handleWebhook(t,n):new Response(`Unknown adapter: ${e}`,{status:404})}async ensureInitialized(){this.initialized||(this.initPromise||=this.doInitialize(),await this.initPromise)}async doInitialize(){this.logger.info(`Initializing chat instance...`),await this._stateAdapter.connect(),this.logger.debug(`State connected`);let e=Array.from(this.adapters.values()).map(async e=>{this.logger.debug(`Initializing adapter`,e.name);let t=await e.initialize(this);return this.logger.debug(`Adapter initialized`,e.name),t});await Promise.all(e),this.initialized=!0,this.logger.info(`Chat instance initialized`,{adapters:Array.from(this.adapters.keys())})}async shutdown(){this.logger.info(`Shutting down chat instance...`);let e=Array.from(this.adapters.values()).map(async e=>{e.disconnect&&(this.logger.debug(`Disconnecting adapter`,e.name),await e.disconnect(),this.logger.debug(`Adapter disconnected`,e.name))}),t=await Promise.allSettled(e);for(let e of t)e.status===`rejected`&&this.logger.error(`Adapter disconnect failed`,e.reason);await this._stateAdapter.disconnect(),this.initialized=!1,this.initPromise=null,this.logger.info(`Chat instance shut down`)}async initialize(){await this.ensureInitialized()}onNewMention(e){this.mentionHandlers.push(e),this.logger.debug(`Registered mention handler`)}onDirectMessage(e){this.directMessageHandlers.push(e),this.logger.debug(`Registered direct message handler`)}onNewMessage(e,t){this.messagePatterns.push({pattern:e,handler:t}),this.logger.debug(`Registered message pattern handler`,{pattern:e.toString()})}onSubscribedMessage(e){this.subscribedMessageHandlers.push(e),this.logger.debug(`Registered subscribed message handler`)}onReaction(e,t){typeof e==`function`?(this.reactionHandlers.push({emoji:[],handler:e}),this.logger.debug(`Registered reaction handler for all emoji`)):t&&(this.reactionHandlers.push({emoji:e,handler:t}),this.logger.debug(`Registered reaction handler`,{emoji:e.map(e=>typeof e==`string`?e:e.name)}))}onAction(e,t){if(typeof e==`function`)this.actionHandlers.push({actionIds:[],handler:e}),this.logger.debug(`Registered action handler for all actions`);else if(t){let n=Array.isArray(e)?e:[e];this.actionHandlers.push({actionIds:n,handler:t}),this.logger.debug(`Registered action handler`,{actionIds:n})}}onOptionsLoad(e,t){if(typeof e==`function`)this.optionsLoadHandlers.push({actionIds:[],handler:e}),this.logger.debug(`Registered options load handler for all action IDs`);else if(t){let n=Array.isArray(e)?e:[e];this.optionsLoadHandlers.push({actionIds:n,handler:t}),this.logger.debug(`Registered options load handler`,{actionIds:n})}}onModalSubmit(e,t){if(typeof e==`function`)this.modalSubmitHandlers.push({callbackIds:[],handler:e}),this.logger.debug(`Registered modal submit handler for all modals`);else if(t){let n=Array.isArray(e)?e:[e];this.modalSubmitHandlers.push({callbackIds:n,handler:t}),this.logger.debug(`Registered modal submit handler`,{callbackIds:n})}}onModalClose(e,t){if(typeof e==`function`)this.modalCloseHandlers.push({callbackIds:[],handler:e}),this.logger.debug(`Registered modal close handler for all modals`);else if(t){let n=Array.isArray(e)?e:[e];this.modalCloseHandlers.push({callbackIds:n,handler:t}),this.logger.debug(`Registered modal close handler`,{callbackIds:n})}}onSlashCommand(e,t){if(typeof e==`function`)this.slashCommandHandlers.push({commands:[],handler:e}),this.logger.debug(`Registered slash command handler for all commands`);else if(t){let n=(Array.isArray(e)?e:[e]).map(e=>e.startsWith(`/`)?e:`/${e}`);this.slashCommandHandlers.push({commands:n,handler:t}),this.logger.debug(`Registered slash command handler`,{commands:n})}}onAssistantThreadStarted(e){this.assistantThreadStartedHandlers.push(e),this.logger.debug(`Registered assistant thread started handler`)}onAssistantContextChanged(e){this.assistantContextChangedHandlers.push(e),this.logger.debug(`Registered assistant context changed handler`)}onAppHomeOpened(e){this.appHomeOpenedHandlers.push(e),this.logger.debug(`Registered app home opened handler`)}onMemberJoinedChannel(e){this.memberJoinedChannelHandlers.push(e),this.logger.debug(`Registered member joined channel handler`)}getAdapter(e){return this.adapters.get(e)}reviver(){return this.registerSingleton(),Bu}processMessage(e,t,n,r){let i=(async()=>{let r=typeof n==`function`?await n():n;await this.handleIncomingMessage(e,t,r)})(),a=i.catch(e=>{this.logger.error(`Message processing error`,{error:e,threadId:t})});return r?.waitUntil&&r.waitUntil(a),i}processReaction(e,t){let n=this.handleReactionEvent(e).catch(t=>{this.logger.error(`Reaction processing error`,{error:t,emoji:e.emoji,messageId:e.messageId})});t?.waitUntil&&t.waitUntil(n)}processAction(e,t){let n=this.handleActionEvent(e,t).catch(t=>{this.logger.error(`Action processing error`,{error:t,actionId:e.actionId,messageId:e.messageId})});return t?.waitUntil&&t.waitUntil(n),n}async processOptionsLoad(e,t){let n=[...this.optionsLoadHandlers.filter(({actionIds:t})=>t.length>0&&t.includes(e.actionId)),...this.optionsLoadHandlers.filter(({actionIds:e})=>e.length===0)];for(let{handler:t}of n)try{let n=await t(e);if(n)return n}catch(t){this.logger.error(`Options load handler error`,{error:t,actionId:e.actionId})}}async processModalSubmit(e,t,n){let{callbackUrl:r,relatedThread:i,relatedMessage:a,relatedChannel:o}=await this.retrieveModalContext(e.adapter.name,t),s={...e,relatedThread:i,relatedMessage:a,relatedChannel:o},c;for(let{callbackIds:t,handler:n}of this.modalSubmitHandlers)if(t.length===0||t.includes(e.callbackId))try{let e=await n(s);if(e){c=e;break}}catch(t){this.logger.error(`Modal submit handler error`,{error:t,callbackId:e.callbackId})}if(r&&c?.action!==`errors`){let t=ru(r,{type:`modal_submit`,callbackId:e.callbackId,values:e.values,user:{id:e.user.userId,name:e.user.userName}}).then(({error:e})=>{e&&this.logger.error(`Modal callbackUrl POST failed`,{callbackUrl:r,error:e})}).catch(e=>{this.logger.error(`Modal callbackUrl POST failed`,{callbackUrl:r,error:e})});n?.waitUntil&&n.waitUntil(t)}return c}processModalClose(e,t,n){let r=(async()=>{let{relatedThread:n,relatedMessage:r,relatedChannel:i}=await this.retrieveModalContext(e.adapter.name,t),a={...e,relatedThread:n,relatedMessage:r,relatedChannel:i};for(let{callbackIds:t,handler:n}of this.modalCloseHandlers)(t.length===0||t.includes(e.callbackId))&&await n(a)})().catch(t=>{this.logger.error(`Modal close handler error`,{error:t,callbackId:e.callbackId})});n?.waitUntil&&n.waitUntil(r)}processSlashCommand(e,t){let n=this.handleSlashCommandEvent(e,t).catch(t=>{this.logger.error(`Slash command processing error`,{error:t,command:e.command,text:e.text})});t?.waitUntil&&t.waitUntil(n)}processAssistantThreadStarted(e,t){let n=(async()=>{for(let t of this.assistantThreadStartedHandlers)await t(e)})().catch(t=>{this.logger.error(`Assistant thread started handler error`,{error:t,threadId:e.threadId})});t?.waitUntil&&t.waitUntil(n)}processAssistantContextChanged(e,t){let n=(async()=>{for(let t of this.assistantContextChangedHandlers)await t(e)})().catch(t=>{this.logger.error(`Assistant context changed handler error`,{error:t,threadId:e.threadId})});t?.waitUntil&&t.waitUntil(n)}processAppHomeOpened(e,t){let n=(async()=>{for(let t of this.appHomeOpenedHandlers)await t(e)})().catch(t=>{this.logger.error(`App home opened handler error`,{error:t,userId:e.userId})});t?.waitUntil&&t.waitUntil(n)}processMemberJoinedChannel(e,t){let n=(async()=>{for(let t of this.memberJoinedChannelHandlers)await t(e)})().catch(t=>{this.logger.error(`Member joined channel handler error`,{error:t,channelId:e.channelId,userId:e.userId})});t?.waitUntil&&t.waitUntil(n)}async handleSlashCommandEvent(e,t){if(this.logger.debug(`Incoming slash command`,{adapter:e.adapter.name,command:e.command,text:e.text,user:e.user.userName}),e.user.isMe){this.logger.debug(`Skipping slash command from self`,{command:e.command});return}let n=new Cu({id:e.channelId,adapter:e.adapter,stateAdapter:this._stateAdapter}),r={...e,channel:n,openModal:async r=>{if(!(e.triggerId||t?.onOpenModal)){this.logger.warn(`Cannot open modal: no triggerId available`);return}if(!(t?.onOpenModal||e.adapter.openModal)){this.logger.warn(`Cannot open modal: ${e.adapter.name} does not support modals`);return}let i=r;if(Y(r)){let e=uc(r);if(!e)throw Error(`Invalid JSX element: must be a Modal element`);i=e}let a=crypto.randomUUID();if(await this.storeModalContext(e.adapter.name,a,void 0,void 0,n,i.callbackUrl),t?.onOpenModal)return t.onOpenModal(i,a);if(e.triggerId&&e.adapter.openModal)return e.adapter.openModal(e.triggerId,i,a)}};this.logger.debug(`Checking slash command handlers`,{handlerCount:this.slashCommandHandlers.length,command:e.command});for(let{commands:t,handler:n}of this.slashCommandHandlers){if(t.length===0){this.logger.debug(`Running catch-all slash command handler`),await n(r);continue}t.includes(e.command)&&(this.logger.debug(`Running matched slash command handler`,{command:e.command}),await n(r))}}async storeModalContext(e,t,n,r,i,a){let o=`modal-context:${e}:${t}`,s={thread:n?.toJSON(),message:r?.toJSON(),channel:i?.toJSON(),callbackUrl:a};try{await this._stateAdapter.set(o,s,cd)}catch(e){this.logger.error(`Failed to store modal context`,{contextId:t,error:e})}}async retrieveModalContext(e,t){if(!t)return{callbackUrl:void 0,relatedThread:void 0,relatedMessage:void 0,relatedChannel:void 0};let n=`modal-context:${e}:${t}`,r=await this._stateAdapter.get(n);if(!r)return{callbackUrl:void 0,relatedThread:void 0,relatedMessage:void 0,relatedChannel:void 0};await this._stateAdapter.delete(n);let i=this.adapters.get(e),a;r.thread&&(a=Ru.fromJSON(r.thread,i));let o;if(r.message&&a){let e=Q.fromJSON(r.message);o=a.createSentMessageFromMessage(e)}let s;return r.channel&&(s=Cu.fromJSON(r.channel,i)),{callbackUrl:r.callbackUrl,relatedThread:a,relatedMessage:o,relatedChannel:s}}async handleActionEvent(e,t){if(this.logger.debug(`Incoming action`,{adapter:e.adapter.name,actionId:e.actionId,value:e.value,user:e.user.userName,messageId:e.messageId,threadId:e.threadId}),e.user.isMe){this.logger.debug(`Skipping action from self`,{actionId:e.actionId});return}let{callbackToken:n}=Xl(e.value),r=null;n&&(r=await nu(n,this._stateAdapter));let i=r?{...e,value:r.originalValue}:e,a;if(r){let t=r.url;a=(async()=>{let{error:n}=await ru(t,{type:`action`,actionId:e.actionId,value:r.originalValue,user:{id:e.user.userId,name:e.user.userName},threadId:e.threadId,messageId:e.messageId});n&&this.logger.error(`Button callbackUrl POST failed`,{callbackUrl:t,actionId:e.actionId,error:n})})()}let o=e.messageId?new Q({id:e.messageId,threadId:e.threadId,text:``,formatted:{type:`root`,children:[]},raw:e.raw,author:e.user,metadata:{dateSent:new Date,edited:!1},attachments:[]}):{},s=e.threadId?await this.createThread(e.adapter,e.threadId,o,!1):null,c={...i,thread:s,openModal:async n=>{if(!(e.triggerId||t?.onOpenModal)){this.logger.warn(`Cannot open modal: no triggerId available`);return}if(!(t?.onOpenModal||e.adapter.openModal)){this.logger.warn(`Cannot open modal: ${e.adapter.name} does not support modals`);return}let r=n;if(Y(n)){let e=uc(n);if(!e)throw Error(`Invalid JSX element: must be a Modal element`);r=e}let i;if(s){if(e.messageId?.startsWith(`ephemeral:`)){let e=s.recentMessages[0];e&&typeof e.toJSON==`function`&&(i=e)}else if(e.messageId&&e.adapter.fetchMessage){let t=await e.adapter.fetchMessage(e.threadId,e.messageId).catch(()=>null);if(t)i=new Q(t);else{let e=s.recentMessages[0];e&&typeof e.toJSON==`function`&&(i=e)}}}let a=crypto.randomUUID(),o=s?s.channel:void 0;if(await this.storeModalContext(e.adapter.name,a,s||void 0,i,o,r.callbackUrl),t?.onOpenModal)return t.onOpenModal(r,a);if(e.triggerId&&e.adapter.openModal)return e.adapter.openModal(e.triggerId,r,a)}};this.logger.debug(`Checking action handlers`,{handlerCount:this.actionHandlers.length,actionId:e.actionId});for(let{actionIds:t,handler:n}of this.actionHandlers){if(t.length===0){this.logger.debug(`Running catch-all action handler`),await n(c);continue}t.includes(e.actionId)&&(this.logger.debug(`Running matched action handler`,{actionId:e.actionId}),await n(c))}a&&await a}async handleReactionEvent(e){if(this.logger.debug(`Incoming reaction`,{adapter:e.adapter?.name,emoji:e.emoji,rawEmoji:e.rawEmoji,added:e.added,user:e.user.userName,messageId:e.messageId,threadId:e.threadId}),e.user.isMe){this.logger.debug(`Skipping reaction from self`,{emoji:e.emoji});return}if(!e.adapter){this.logger.error(`Reaction event missing adapter`);return}let t=await this._stateAdapter.isSubscribed(e.threadId),n=await this.createThread(e.adapter,e.threadId,e.message??{},t),r={...e,adapter:e.adapter,thread:n};this.logger.debug(`Checking reaction handlers`,{handlerCount:this.reactionHandlers.length,emoji:e.emoji.name,rawEmoji:e.rawEmoji});for(let{emoji:e,handler:t}of this.reactionHandlers){if(e.length===0){this.logger.debug(`Running catch-all reaction handler`),await t(r);continue}let n=e.some(e=>{if(e===r.emoji)return!0;let t=typeof e==`string`?e:e.name;return t===r.emoji.name||t===r.rawEmoji});this.logger.debug(`Reaction filter check`,{filterEmoji:e.map(e=>typeof e==`string`?e:e.name),eventEmoji:r.emoji.name,matches:n}),n&&(this.logger.debug(`Running matched reaction handler`),await t(r))}}getState(){return this._stateAdapter}getUserName(){return this.userName}getLogger(e){return e?this.logger.child(e):this.logger}async openDM(e){let t=typeof e==`string`?e:e.userId,n=this.inferAdapterFromUserId(t);if(!n.openDM)throw new $(`Adapter "${n.name}" does not support openDM`,`NOT_SUPPORTED`);let r=await n.openDM(t);return this.createThread(n,r,{},!1)}async getUser(e){let t=typeof e==`string`?e:e.userId,n=this.inferAdapterFromUserId(t);if(!n.getUser)throw new $(`Adapter "${n.name}" does not support getUser`,`NOT_SUPPORTED`);return n.getUser(t)}channel(e){let t=e.split(`:`)[0];if(!t)throw new $(`Invalid channel ID: ${e}`,`INVALID_CHANNEL_ID`);let n=this.adapters.get(t);if(!n)throw new $(`Adapter "${t}" not found for channel ID "${e}"`,`ADAPTER_NOT_FOUND`);return new Cu({id:e,adapter:n,stateAdapter:this._stateAdapter})}thread(e){let t=e.split(`:`)[0];if(!t)throw new $(`Invalid thread ID: ${e}`,`INVALID_THREAD_ID`);let n=this.adapters.get(t);if(!n)throw new $(`Adapter "${t}" not found for thread ID "${e}"`,`ADAPTER_NOT_FOUND`);return this.createThread(n,e,{},!1)}inferAdapterFromUserId(e){if(e.startsWith(`users/`)){let e=this.adapters.get(`gchat`);if(e)return e}if(e.startsWith(`29:`)){let e=this.adapters.get(`teams`);if(e)return e}if(ad.test(e)){let e=this.adapters.get(`linear`);if(e)return e}if(rd.test(e)){let e=this.adapters.get(`slack`);if(e)return e}if(od.test(e)){let t=[];if(id.test(e)&&this.adapters.has(`discord`)&&t.push(`discord`),this.adapters.has(`telegram`)&&t.push(`telegram`),this.adapters.has(`github`)&&t.push(`github`),t.length===1){let e=this.adapters.get(t[0]);if(e)return e}if(t.length>1)throw new $(`Numeric userId "${e}" is ambiguous between adapters: ${t.join(`, `)}. Call the platform's adapter directly (e.g. \`adapter.getUser(userId)\`).`,`AMBIGUOUS_USER_ID`)}throw new $(`Cannot infer adapter from userId "${e}". Expected: Slack ("U..."), Teams ("29:..."), Google Chat ("users/..."), Linear (UUID), or Discord/Telegram/GitHub (numeric).`,`UNKNOWN_USER_ID_FORMAT`)}async getLockKey(e,t){let n=e.channelIdFromThreadId(t),r;if(typeof this._lockScope==`function`){let i=e.isDM?.(t)??!1;r=await this._lockScope({adapter:e,channelId:n,isDM:i,threadId:t})}else r=this._lockScope??e.lockScope??`thread`;return r===`channel`?n:t}async handleIncomingMessage(e,t,n){if(du(n,e),this.logger.debug(`Incoming message`,{adapter:e.name,threadId:t,messageId:n.id,text:n.text,author:n.author.userName,authorUserId:n.author.userId,isBot:n.author.isBot,isMe:n.author.isMe}),n.author.isMe){this.logger.debug(`Skipping message from self (isMe=true)`,{adapter:e.name,threadId:t,author:n.author.userName});return}let r=`dedupe:${e.name}:${n.id}`;if(!await this._stateAdapter.setIfNotExists(r,!0,this._dedupeTtlMs)){this.logger.debug(`Skipping duplicate message`,{adapter:e.name,messageId:n.id});return}if(e.persistThreadHistory||e.persistMessageHistory){let r=e.channelIdFromThreadId(t),i=[this._threadHistory.append(t,n)];r!==t&&i.push(this._threadHistory.append(r,n)),await Promise.all(i)}let i=await this.getLockKey(e,t),a=this._concurrencyStrategy;if(a===`concurrent`){await this.handleConcurrent(e,t,n);return}if(a===`queue`||a===`debounce`||a===`burst`){await this.handleQueueOrDebounce(e,t,i,n,a);return}await this.handleDrop(e,t,i,n)}async handleDrop(e,t,n,r){let i=await this._stateAdapter.acquireLock(n,td);if(!i&&((typeof this._onLockConflict==`function`?await this._onLockConflict(t,r):this._onLockConflict??`drop`)===`force`&&(this.logger.info(`Force-releasing lock on thread`,{threadId:t,lockKey:n}),await this._stateAdapter.forceReleaseLock(n),i=await this._stateAdapter.acquireLock(n,td)),!i))throw this.logger.warn(`Could not acquire lock on thread`,{threadId:t,lockKey:n}),new gu(`Could not acquire lock on thread ${t}. Another instance may be processing.`);this.logger.debug(`Lock acquired`,{threadId:t,lockKey:n,token:i.token});try{await this.dispatchToHandlers(e,t,r)}finally{await this._stateAdapter.releaseLock(i),this.logger.debug(`Lock released`,{threadId:t,lockKey:n})}}async handleQueueOrDebounce(e,t,n,r,i){let{maxQueueSize:a,queueEntryTtlMs:o,onQueueFull:s,debounceMs:c}=this._concurrencyConfig,l=await this._stateAdapter.acquireLock(n,td);if(!l){let e=i===`debounce`?1:a,c=await this._stateAdapter.queueDepth(n);if(c>=e&&i!==`debounce`&&s===`drop-newest`){this.logger.info(`message-dropped`,{threadId:t,lockKey:n,messageId:r.id,reason:`queue-full`});return}await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},e),this.logger.info(i===`debounce`?`message-debounce-reset`:`message-queued`,{threadId:t,lockKey:n,messageId:r.id,queueDepth:Math.min(c+1,e)});return}this.logger.debug(`Lock acquired`,{threadId:t,lockKey:n,token:l.token});try{i===`debounce`?(await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},1),this.logger.info(`message-debouncing`,{threadId:t,lockKey:n,messageId:r.id,debounceMs:c}),await this.debounceLoop(l,e,t,n)):i===`burst`?(await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},a),this.logger.info(`message-debouncing`,{threadId:t,lockKey:n,messageId:r.id,debounceMs:c}),await nd(c),await this._stateAdapter.extendLock(l,td),await this.drainQueue(l,e,t,n)):(await this.dispatchToHandlers(e,t,r),await this.drainQueue(l,e,t,n))}finally{await this._stateAdapter.releaseLock(l),this.logger.debug(`Lock released`,{threadId:t,lockKey:n})}}async debounceLoop(e,t,n,r){let{debounceMs:i}=this._concurrencyConfig;for(;;){await nd(i),await this._stateAdapter.extendLock(e,td);let a=await this._stateAdapter.dequeue(r);if(!a)break;let o=this.rehydrateMessage(a.message,t);if(Date.now()>a.expiresAt){this.logger.info(`message-expired`,{threadId:n,lockKey:r,messageId:o.id});continue}if(await this._stateAdapter.queueDepth(r)>0){this.logger.info(`message-superseded`,{threadId:n,lockKey:r,droppedId:o.id});continue}this.logger.info(`message-dequeued`,{threadId:n,lockKey:r,messageId:o.id}),await this.dispatchToHandlers(t,n,o);break}}async drainQueue(e,t,n,r){for(;;){let i=[];for(;;){let e=await this._stateAdapter.dequeue(r);if(!e)break;let a=this.rehydrateMessage(e.message,t);Date.now()<=e.expiresAt?i.push({message:a,expiresAt:e.expiresAt}):this.logger.info(`message-expired`,{threadId:n,lockKey:r,messageId:a.id})}if(i.length===0)return;await this._stateAdapter.extendLock(e,td);let a=i.at(-1);if(!a)return;let o=i.slice(0,-1).map(e=>e.message);this.logger.info(`message-dequeued`,{threadId:n,lockKey:r,messageId:a.message.id,skippedCount:o.length,totalSinceLastHandler:i.length});let s={skipped:o,totalSinceLastHandler:i.length};await this.dispatchToHandlers(t,n,a.message,s)}}async handleConcurrent(e,t,n){let{maxConcurrent:r}=this._concurrencyConfig;if(!Number.isFinite(r)){await this.dispatchToHandlers(e,t,n);return}await this.acquireConcurrentSlot(t,r);try{await this.dispatchToHandlers(e,t,n)}finally{this.releaseConcurrentSlot(t)}}acquireConcurrentSlot(e,t){let n=this._concurrentSlots.get(e);return n||(n={inFlight:0,waiters:[]},this._concurrentSlots.set(e,n)),n.inFlight<t?(n.inFlight++,Promise.resolve()):new Promise(e=>{n.waiters.push(e)})}releaseConcurrentSlot(e){let t=this._concurrentSlots.get(e);if(!t)return;let n=t.waiters.shift();if(n){n();return}t.inFlight--,t.inFlight===0&&t.waiters.length===0&&this._concurrentSlots.delete(e)}async dispatchToHandlers(e,t,n,r){n.isMention=n.isMention||this.detectMention(e,n);let i=await this._stateAdapter.isSubscribed(t);this.logger.debug(`Subscription check`,{threadId:t,isSubscribed:i,subscribedHandlerCount:this.subscribedMessageHandlers.length});let a=await this.createThread(e,t,n,i);if(this._identity&&n.userKey===void 0)try{let t=await this._identity({adapter:e.name,author:n.author,message:n});t&&(n.userKey=t)}catch(r){this.logger.warn(`Identity resolver threw; skipping userKey`,{error:r,adapter:e.name,threadId:t,authorUserId:n.author.userId})}let o=e.isDM?.(t)??!1;if(o&&this.directMessageHandlers.length>0){this.logger.debug(`Direct message received - calling handlers`,{threadId:t,handlerCount:this.directMessageHandlers.length});let e=a.channel;for(let t of this.directMessageHandlers)await t(a,n,e,r);return}if(o&&(n.isMention=!0),i){this.logger.debug(`Message in subscribed thread - calling handlers`,{threadId:t,handlerCount:this.subscribedMessageHandlers.length}),await this.runHandlers(this.subscribedMessageHandlers,a,n,r);return}if(n.isMention){this.logger.debug(`Bot mentioned`,{threadId:t,text:n.text.slice(0,100)}),await this.runHandlers(this.mentionHandlers,a,n,r);return}this.logger.debug(`Checking message patterns`,{patternCount:this.messagePatterns.length,patterns:this.messagePatterns.map(e=>e.pattern.toString()),messageText:n.text});let s=!1;for(let{pattern:e,handler:t}of this.messagePatterns){let i=e.test(n.text);this.logger.debug(`Pattern test`,{pattern:e.toString(),text:n.text,matches:i}),i&&(this.logger.debug(`Message matched pattern - calling handler`,{pattern:e.toString()}),s=!0,await t(a,n,r))}s||this.logger.debug(`No handlers matched message`,{threadId:t,text:n.text.slice(0,100)})}createThread(e,t,n,r=!1){let i=e.channelIdFromThreadId(t),a=e.isDM?.(t)??!1,o=e.getChannelVisibility?.(t)??`unknown`;return new Ru({id:t,adapter:e,channelId:i,stateAdapter:this._stateAdapter,initialMessage:n,isSubscribedContext:r,isDM:a,channelVisibility:o,currentMessage:n,logger:this.logger,streamingUpdateIntervalMs:this._streamingUpdateIntervalMs,fallbackStreamingPlaceholderText:this._fallbackStreamingPlaceholderText,threadHistory:e.persistThreadHistory||e.persistMessageHistory?this._threadHistory:void 0})}detectMention(e,t){let n=e.userName||this.userName,r=e.botUserId;return!!(RegExp(`@${this.escapeRegex(n)}\\b`,`i`).test(t.text)||r&&(RegExp(`@${this.escapeRegex(r)}\\b`,`i`).test(t.text)||RegExp(`<@!?${this.escapeRegex(r)}>`,`i`).test(t.text)))}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}rehydrateMessage(e,t){if(e instanceof Q)return t&&du(e,t),e;let n=e,r;if(n._type===`chat:Message`)r=Q.fromJSON(n);else{let e=n.metadata,t=e.dateSent,i=e.editedAt;r=new Q({id:n.id,threadId:n.threadId,text:n.text,formatted:n.formatted,raw:n.raw,author:n.author,metadata:{dateSent:t instanceof Date?t:new Date(t),edited:e.edited,editedAt:i?new Date(i instanceof Date?i.toISOString():i):void 0},attachments:n.attachments??[],isMention:n.isMention,links:n.links??[]})}t&&du(r,t);let i=t?.rehydrateAttachment?.bind(t);return i&&r.attachments.length>0&&(r.attachments=r.attachments.map(e=>e.fetchData?e:i(e))),r}async runHandlers(e,t,n,r){for(let i of e)await i(t,n,r)}},ud=Wu;function dd(e){return e?Array.isArray(e)?e.join(` `).trim():typeof e==`string`?e:`markdown`in e?W(ns(e.markdown)):`ast`in e?W(e.ast):``:``}var fd=class{$$typeof=fu;kind=`plan`;_model;_bound=null;constructor(e){let t=dd(e.initialMessage)||`Plan`,n={id:crypto.randomUUID(),title:t,status:`in_progress`};this._model={title:t,tasks:[n]}}isSupported(e){return!!e.postObject&&!!e.editObject}getPostData(){return this._model}getFallbackText(){let e=[];e.push(`\u{1F4CB} ${this._model.title||`Plan`}`);for(let t of this._model.tasks){let n={complete:`✅`,in_progress:`🔄`,error:`❌`}[t.status]??`⬜`;e.push(`${n} ${t.title}`)}return e.join(`
89
+ `),s}function Fu(e){return`adapterName`in e&&!(`adapter`in e)}var Iu=`thread-state:`;function Lu(e){return typeof e==`object`&&!!e&&Symbol.asyncIterator in e}var Ru=class e{id;channelId;isDM;channelVisibility;_adapter;_adapterName;_stateAdapterInstance;_recentMessages=[];_isSubscribedContext;_currentMessage;_streamingUpdateIntervalMs;_fallbackStreamingPlaceholderText;_channel;_threadHistory;_logger;constructor(e){this.id=e.id,this.channelId=e.channelId,this.isDM=e.isDM??!1,this.channelVisibility=e.channelVisibility??`unknown`,this._isSubscribedContext=e.isSubscribedContext??!1,this._currentMessage=e.currentMessage,this._logger=e.logger,this._streamingUpdateIntervalMs=e.streamingUpdateIntervalMs??500,this._fallbackStreamingPlaceholderText=e.fallbackStreamingPlaceholderText===void 0?`...`:e.fallbackStreamingPlaceholderText,Fu(e)?this._adapterName=e.adapterName:(this._adapter=e.adapter,this._stateAdapterInstance=e.stateAdapter,this._threadHistory=e.threadHistory),e.initialMessage&&(this._recentMessages=[e.initialMessage])}get adapter(){if(this._adapter)return this._adapter;if(!this._adapterName)throw Error(`Thread has no adapter configured`);let e=ou().getAdapter(this._adapterName);if(!e)throw Error(`Adapter "${this._adapterName}" not found in Chat singleton`);return this._adapter=e,e}get _stateAdapter(){if(this._stateAdapterInstance)return this._stateAdapterInstance;let e=ou();return this._stateAdapterInstance=e.getState(),this._stateAdapterInstance}get recentMessages(){return this._recentMessages}set recentMessages(e){this._recentMessages=e}get state(){return this._stateAdapter.get(`${Iu}${this.id}`)}async setState(e,t){let n=`${Iu}${this.id}`;if(t?.replace)await this._stateAdapter.set(n,e,yu);else{let t={...await this._stateAdapter.get(n),...e};await this._stateAdapter.set(n,t,yu)}}get channel(){if(!this._channel){let e=wu(this.adapter,this.id);this._channel=new Cu({id:e,adapter:this.adapter,stateAdapter:this._stateAdapter,isDM:this.isDM,channelVisibility:this.channelVisibility,threadHistory:this._threadHistory})}return this._channel}get messages(){let e=this.adapter,t=this.id,n=this._threadHistory;return{async*[Symbol.asyncIterator](){let r,i=!1;for(;;){let n=await e.fetchMessages(t,{cursor:r,direction:`backward`}),a=[...n.messages].reverse();for(let e of a)i=!0,yield e;if(!n.nextCursor||n.messages.length===0)break;r=n.nextCursor}if(!i&&n){let e=await n.getMessages(t);for(let t=e.length-1;t>=0;t--)yield e[t]}}}}get allMessages(){let e=this.adapter,t=this.id,n=this._threadHistory;return{async*[Symbol.asyncIterator](){let r,i=!1;for(;;){let n=await e.fetchMessages(t,{limit:100,cursor:r,direction:`forward`});for(let e of n.messages)i=!0,yield e;if(!n.nextCursor||n.messages.length===0)break;r=n.nextCursor}if(!i&&n){let e=await n.getMessages(t);for(let t of e)yield t}}}}async getParticipants(){let e=new Map;this._currentMessage&&!this._currentMessage.author.isMe&&!this._currentMessage.author.isBot&&e.set(this._currentMessage.author.userId,this._currentMessage.author);for await(let t of this.allMessages)t.author.isMe||t.author.isBot||e.has(t.author.userId)||e.set(t.author.userId,t.author);return[...e.values()]}async isSubscribed(){return this._isSubscribedContext?!0:this._stateAdapter.isSubscribed(this.id)}async subscribe(){await this._stateAdapter.subscribe(this.id),this.adapter.onThreadSubscribe&&await this.adapter.onThreadSubscribe(this.id)}async unsubscribe(){await this._stateAdapter.unsubscribe(this.id)}async post(e){if(pu(e)){if(e.kind===`stream`){let t=e.getPostData(),n={...t.options.updateIntervalMs?{updateIntervalMs:t.options.updateIntervalMs}:{},...t.options.groupTasks?{taskDisplayMode:t.options.groupTasks}:{},...t.options.endWith?{stopBlocks:t.options.endWith}:{}};return await this.handleStream(t.stream,n),e}return await this.handlePostableObject(e),e}if(Lu(e))return this.handleStream(e);let t=e;if(Y(e)){let n=J(e);if(!n)throw Error(`Invalid JSX element: must be a Card element`);t=n}t=await this.processCallbackUrls(t);let n=await this.adapter.postMessage(this.id,t),r=this.createSentMessage(n.id,t,n.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(r)),r}async handlePostableObject(e){await mu(e,this.adapter,this.id,(e,t)=>this.adapter.postMessage(e,t),this._logger)}async postEphemeral(e,t,n){let{fallbackToDM:r}=n,i=typeof e==`string`?e:e.userId,a;if(Y(t)){let e=J(t);if(!e)throw Error(`Invalid JSX element: must be a Card element`);a=e}else a=t;if(a=await this.processCallbackUrls(a),this.adapter.postEphemeral)return this.adapter.postEphemeral(this.id,i,a);if(!r)return null;if(this.adapter.openDM){let e=await this.adapter.openDM(i),t=await this.adapter.postMessage(e,a);return{id:t.id,threadId:e,usedFallback:!0,raw:t.raw}}return null}async processCallbackUrls(e){if(typeof e==`string`)return e;if(`type`in e&&e.type===`card`)return tu(e,this._stateAdapter);if(`card`in e&&e.card?.type===`card`){let t=await tu(e.card,this._stateAdapter);if(t!==e.card)return{...e,card:t}}return e}async schedule(e,t){let n;if(Y(e)){let t=J(e);if(!t)throw Error(`Invalid JSX element: must be a Card element`);n=t}else n=e;if(n=await this.processCallbackUrls(n),!this.adapter.scheduleMessage)throw new _u(`Scheduled messages are not supported by this adapter`,`scheduling`);return this.adapter.scheduleMessage(this.id,n,t)}async handleStream(e,t){let n=lu(e),r={updateIntervalMs:this._streamingUpdateIntervalMs,...t};if(this._currentMessage&&(r.recipientUserId=this._currentMessage.author.userId,r.recipientTeamId=this.extractSlackRecipientTeamId(this._currentMessage.raw)),this.adapter.stream){let e=``,t={[Symbol.asyncIterator]:()=>{let t=n[Symbol.asyncIterator]();return{async next(){let n=await t.next();if(!n.done){let t=n.value;typeof t==`string`?e+=t:t.type===`markdown_text`&&(e+=t.text)}return n}}}},i=await this.adapter.stream(this.id,t,r);if(i){let t=this.createSentMessage(i.id,{markdown:e},i.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(t)),t}}let i={[Symbol.asyncIterator]:()=>{let e=n[Symbol.asyncIterator]();return{async next(){for(;;){let t=await e.next();if(t.done)return{value:void 0,done:!0};let n=t.value;if(typeof n==`string`)return{value:n,done:!1};if(n.type===`markdown_text`)return{value:n.text,done:!1}}}}}};return this.fallbackStream(i,r)}extractSlackRecipientTeamId(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.team_id==`string`&&t.team_id)return t.team_id;if(typeof t.team==`string`&&t.team)return t.team;if(t.team&&typeof t.team==`object`&&typeof t.team.id==`string`&&t.team.id)return t.team.id;if(typeof t.user?.team_id==`string`&&t.user.team_id)return t.user.team_id}async startTyping(e){await this.adapter.startTyping(this.id,e)}async fallbackStream(e,t){let n=t?.updateIntervalMs??this._streamingUpdateIntervalMs,r=this._fallbackStreamingPlaceholderText,i=r===null?null:await this.adapter.postMessage(this.id,r),a=this.id,o=new Eu,s=``,c=!1,l=null,u=null;i&&(a=i.threadId||this.id,s=r??``);let d=()=>{u=setTimeout(()=>{l=f()},n)},f=async()=>{if(c||!i)return;let e=o.render();if(e.trim()&&e!==s)try{await this.adapter.editMessage(a,i.id,{markdown:e}),s=e}catch(e){this._logger?.warn(`fallbackStream edit failed`,e)}c||d()};i&&d();try{for await(let t of e)if(o.push(t),!i){let e=o.render();e.trim()&&(i=await this.adapter.postMessage(this.id,{markdown:e}),a=i.threadId||this.id,s=e,d())}}finally{c=!0,u&&=(clearTimeout(u),null)}l&&await l;let p=o.getText(),m=o.finish();i||(i=await this.adapter.postMessage(this.id,{markdown:p.trim()?p:` `}),a=i.threadId||this.id,s=p),m.trim()&&m!==s&&await this.adapter.editMessage(a,i.id,{markdown:p});let h=this.createSentMessage(i.id,{markdown:p},a);return this._threadHistory&&await this._threadHistory.append(this.id,new Q(h)),h}async refresh(){let e=await this.adapter.fetchMessages(this.id,{limit:50});e.messages.length>0?this._recentMessages=e.messages:this._threadHistory?this._recentMessages=await this._threadHistory.getMessages(this.id,50):this._recentMessages=[]}mentionUser(e){return`<@${e}>`}toJSON(){return{_type:`chat:Thread`,id:this.id,channelId:this.channelId,channelVisibility:this.channelVisibility,currentMessage:this._currentMessage?.toJSON(),isDM:this.isDM,adapterName:this._adapterName??this.adapter.name}}static fromJSON(t,n){let r=new e({id:t.id,adapterName:t.adapterName,channelId:t.channelId,channelVisibility:t.channelVisibility,currentMessage:t.currentMessage?Q.fromJSON(t.currentMessage):void 0,isDM:t.isDM});return n&&(r._adapter=n),r}static[n](e){return e.toJSON()}static[i](t){return e.fromJSON(t)}createSentMessage(e,t,n){let r=this.adapter,i=n||this.id,a=this,{plainText:o,formatted:s,attachments:c}=zu(t);return{id:e,threadId:i,text:o,formatted:s,raw:null,links:[],author:{userId:`self`,userName:r.userName,fullName:r.userName,isBot:!0,isMe:!0},metadata:{dateSent:new Date,edited:!1},attachments:c,toJSON(){return new Q(this).toJSON()},async edit(t){let n=t;if(Y(t)){let e=J(t);if(!e)throw Error(`Invalid JSX element: must be a Card element`);n=e}return n=await a.processCallbackUrls(n),await r.editMessage(i,e,n),a.createSentMessage(e,n)},async delete(){await r.deleteMessage(i,e)},async addReaction(t){await r.addReaction(i,e,t)},async removeReaction(t){await r.removeReaction(i,e,t)}}}createSentMessageFromMessage(e){let t=this.adapter,n=this.id,r=e.id,i=this;return{id:e.id,threadId:e.threadId,text:e.text,formatted:e.formatted,raw:e.raw,author:e.author,metadata:e.metadata,attachments:e.attachments,links:e.links,isMention:e.isMention,toJSON(){return e.toJSON()},async edit(e){let a=e;if(Y(e)){let t=J(e);if(!t)throw Error(`Invalid JSX element: must be a Card element`);a=t}return a=await i.processCallbackUrls(a),await t.editMessage(n,r,a),i.createSentMessage(r,a,n)},async delete(){await t.deleteMessage(n,r)},async addReaction(e){await t.addReaction(n,r,e)},async removeReaction(e){await t.removeReaction(n,r,e)}}}};function zu(e){if(typeof e==`string`)return{plainText:e,formatted:q([K([G(e)])]),attachments:[]};if(`raw`in e)return{plainText:e.raw,formatted:q([K([G(e.raw)])]),attachments:e.attachments||[]};if(`markdown`in e){let t=ns(e.markdown);return{plainText:W(t),formatted:t,attachments:e.attachments||[]}}if(`ast`in e)return{plainText:W(e.ast),formatted:e.ast,attachments:e.attachments||[]};if(`card`in e){let t=e.fallbackText||Ns(e.card);return{plainText:t,formatted:q([K([G(t)])]),attachments:[]}}if(`type`in e&&e.type===`card`){let t=Ns(e);return{plainText:t,formatted:q([K([G(t)])]),attachments:[]}}throw Error(`Invalid PostableMessage format`)}function Bu(e,t){if(t&&typeof t==`object`&&`_type`in t){let e=t;if(e._type===`chat:Thread`)return Ru.fromJSON(t);if(e._type===`chat:Channel`)return Cu.fromJSON(t);if(e._type===`chat:Message`)return Q.fromJSON(t)}return t}var Vu=100,Hu=10080*60*1e3,Uu=`msg-history:`,Wu=class{state;maxMessages;ttlMs;constructor(e,t){this.state=e,this.maxMessages=t?.maxMessages??Vu,this.ttlMs=t?.ttlMs??Hu}async append(e,t){let n=`${Uu}${e}`,r=t.toJSON();r.raw=null,await this.state.appendToList(n,r,{maxLength:this.maxMessages,ttlMs:this.ttlMs})}async getMessages(e,t){let n=`${Uu}${e}`,r=await this.state.getList(n);return(t&&r.length>t?r.slice(r.length-t):r).map(e=>Q.fromJSON(e))}},Gu=`transcripts:user:`,Ku=200,qu=50,Ju=/^(\d+)([smhd])$/,Yu=`__chatSdkTombstone`;function Xu(e){return typeof e==`object`&&!!e&&e[Yu]===!0}var Zu={s:1e3,m:6e4,h:36e5,d:864e5},Qu=class{state;maxPerUser;retentionMs;storeFormatted;constructor(e,t){this.state=e,this.maxPerUser=t.maxPerUser??Ku,this.retentionMs=ed(t.retention),this.storeFormatted=t.storeFormatted??!1}async append(e,t,n){let r=t instanceof Q,i,a,o;if(r){if(i=t.userKey,a=`user`,o=t.id,!i)return null}else if(i=n?.userKey,a=t.role,o=t.platformMessageId,!i)throw Error(`transcripts.append: options.userKey is required when appending an AppendInput`);let s={id:crypto.randomUUID(),userKey:i,role:a,text:t.text,platform:e.adapter.name,threadId:e.id,timestamp:Date.now()};return this.storeFormatted&&t.formatted&&(s.formatted=t.formatted),o!==void 0&&(s.platformMessageId=o),await this.state.appendToList($u(i),s,{maxLength:this.maxPerUser,ttlMs:this.retentionMs}),s}async list(e){let t=(await this.state.getList($u(e.userKey))).filter(e=>!Xu(e));if(e.platforms&&e.platforms.length>0){let n=new Set(e.platforms);t=t.filter(e=>n.has(e.platform))}if(e.threadId!==void 0){let n=e.threadId;t=t.filter(e=>e.threadId===n)}if(e.roles&&e.roles.length>0){let n=new Set(e.roles);t=t.filter(e=>n.has(e.role))}let n=e.limit??qu;return t.length>n&&(t=t.slice(t.length-n)),t}async count(e){return(await this.state.getList($u(e.userKey))).filter(e=>!Xu(e)).length}async delete(e){let t=$u(e.userKey),n=(await this.state.getList(t)).filter(e=>!Xu(e)).length,r={[Yu]:!0};return await this.state.appendToList(t,r,{maxLength:1,ttlMs:this.retentionMs}),{deleted:n}}};function $u(e){return`${Gu}${e}`}function ed(e){if(e===void 0)return;if(typeof e==`number`)return e;let t=Ju.exec(e);if(!t)throw Error(`Invalid duration: ${e} (expected number of ms, or "<n>[smhd]")`);return Number.parseInt(t[1],10)*Zu[t[2]]}var td=3e4;function nd(e){return new Promise(t=>setTimeout(t,e))}var rd=/^[UW][A-Z0-9]+$/,id=/^\d{17,19}$/,ad=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,od=/^\d+$/,sd=300*1e3,cd=1440*60*1e3,ld=class{registerSingleton(){return au(this),this}get transcripts(){if(!this._transcripts)throw Error("chat.transcripts is not configured — pass `transcripts` and `identity` to ChatConfig to enable it");return this._transcripts}static getSingleton(){return ou()}static hasSingleton(){return su()}adapters;_stateAdapter;userName;logger;_streamingUpdateIntervalMs;_fallbackStreamingPlaceholderText;_dedupeTtlMs;_onLockConflict;_threadHistory;_identity;_transcripts;_concurrencyStrategy;_concurrencyConfig;_concurrentSlots=new Map;_lockScope;mentionHandlers=[];directMessageHandlers=[];messagePatterns=[];subscribedMessageHandlers=[];reactionHandlers=[];actionHandlers=[];optionsLoadHandlers=[];modalSubmitHandlers=[];modalCloseHandlers=[];slashCommandHandlers=[];assistantThreadStartedHandlers=[];assistantContextChangedHandlers=[];appHomeOpenedHandlers=[];memberJoinedChannelHandlers=[];initPromise=null;initialized=!1;webhooks;constructor(e){this.userName=e.userName,this._stateAdapter=e.state,this.adapters=new Map,this._streamingUpdateIntervalMs=e.streamingUpdateIntervalMs??500,this._fallbackStreamingPlaceholderText=e.fallbackStreamingPlaceholderText===void 0?`...`:e.fallbackStreamingPlaceholderText,this._dedupeTtlMs=e.dedupeTtlMs??sd,this._onLockConflict=e.onLockConflict,this._lockScope=e.lockScope,typeof e.logger==`string`?this.logger=new vu(e.logger):this.logger=e.logger||new vu(`info`);let t=e.concurrency;if(t)if(typeof t==`string`)this._concurrencyStrategy=t,this._concurrencyConfig={debounceMs:1500,maxConcurrent:1/0,maxQueueSize:10,onQueueFull:`drop-oldest`,queueEntryTtlMs:9e4};else{if(t.maxConcurrent!==void 0&&t.maxConcurrent<1)throw Error(`concurrency.maxConcurrent must be >= 1 (got ${t.maxConcurrent})`);t.maxConcurrent!==void 0&&t.strategy!==`concurrent`&&this.logger.warn(`concurrency.maxConcurrent has no effect when strategy is "${t.strategy}" \u2014 it only applies to the "concurrent" strategy.`),this._concurrencyStrategy=t.strategy,this._concurrencyConfig={debounceMs:t.debounceMs??1500,maxConcurrent:t.maxConcurrent??1/0,maxQueueSize:t.maxQueueSize??10,onQueueFull:t.onQueueFull??`drop-oldest`,queueEntryTtlMs:t.queueEntryTtlMs??9e4}}else this._concurrencyStrategy=`drop`,this._concurrencyConfig={debounceMs:1500,maxConcurrent:1/0,maxQueueSize:10,onQueueFull:`drop-oldest`,queueEntryTtlMs:9e4};if(this._threadHistory=new Wu(this._stateAdapter,e.threadHistory??e.messageHistory),e.transcripts){if(!e.identity)throw Error(`ChatConfig.transcripts requires ChatConfig.identity to be set — the cross-platform user key must be resolvable`);this._identity=e.identity,this._transcripts=new Qu(this._stateAdapter,e.transcripts)}else this._identity=e.identity;let n={};for(let[t,r]of Object.entries(e.adapters))this.adapters.set(t,r),n[t]=(e,n)=>this.handleWebhook(t,e,n);this.webhooks=n,this.logger.debug(`Chat instance created`,{adapters:Object.keys(e.adapters)})}async handleWebhook(e,t,n){await this.ensureInitialized();let r=this.adapters.get(e);return r?r.handleWebhook(t,n):new Response(`Unknown adapter: ${e}`,{status:404})}async ensureInitialized(){this.initialized||(this.initPromise||=this.doInitialize(),await this.initPromise)}async doInitialize(){this.logger.info(`Initializing chat instance...`),await this._stateAdapter.connect(),this.logger.debug(`State connected`);let e=Array.from(this.adapters.values()).map(async e=>{this.logger.debug(`Initializing adapter`,e.name);let t=await e.initialize(this);return this.logger.debug(`Adapter initialized`,e.name),t});await Promise.all(e),this.initialized=!0,this.logger.info(`Chat instance initialized`,{adapters:Array.from(this.adapters.keys())})}async shutdown(){this.logger.info(`Shutting down chat instance...`);let e=Array.from(this.adapters.values()).map(async e=>{e.disconnect&&(this.logger.debug(`Disconnecting adapter`,e.name),await e.disconnect(),this.logger.debug(`Adapter disconnected`,e.name))}),t=await Promise.allSettled(e);for(let e of t)e.status===`rejected`&&this.logger.error(`Adapter disconnect failed`,e.reason);await this._stateAdapter.disconnect(),this.initialized=!1,this.initPromise=null,this.logger.info(`Chat instance shut down`)}async initialize(){await this.ensureInitialized()}onNewMention(e){this.mentionHandlers.push(e),this.logger.debug(`Registered mention handler`)}onDirectMessage(e){this.directMessageHandlers.push(e),this.logger.debug(`Registered direct message handler`)}onNewMessage(e,t){this.messagePatterns.push({pattern:e,handler:t}),this.logger.debug(`Registered message pattern handler`,{pattern:e.toString()})}onSubscribedMessage(e){this.subscribedMessageHandlers.push(e),this.logger.debug(`Registered subscribed message handler`)}onReaction(e,t){typeof e==`function`?(this.reactionHandlers.push({emoji:[],handler:e}),this.logger.debug(`Registered reaction handler for all emoji`)):t&&(this.reactionHandlers.push({emoji:e,handler:t}),this.logger.debug(`Registered reaction handler`,{emoji:e.map(e=>typeof e==`string`?e:e.name)}))}onAction(e,t){if(typeof e==`function`)this.actionHandlers.push({actionIds:[],handler:e}),this.logger.debug(`Registered action handler for all actions`);else if(t){let n=Array.isArray(e)?e:[e];this.actionHandlers.push({actionIds:n,handler:t}),this.logger.debug(`Registered action handler`,{actionIds:n})}}onOptionsLoad(e,t){if(typeof e==`function`)this.optionsLoadHandlers.push({actionIds:[],handler:e}),this.logger.debug(`Registered options load handler for all action IDs`);else if(t){let n=Array.isArray(e)?e:[e];this.optionsLoadHandlers.push({actionIds:n,handler:t}),this.logger.debug(`Registered options load handler`,{actionIds:n})}}onModalSubmit(e,t){if(typeof e==`function`)this.modalSubmitHandlers.push({callbackIds:[],handler:e}),this.logger.debug(`Registered modal submit handler for all modals`);else if(t){let n=Array.isArray(e)?e:[e];this.modalSubmitHandlers.push({callbackIds:n,handler:t}),this.logger.debug(`Registered modal submit handler`,{callbackIds:n})}}onModalClose(e,t){if(typeof e==`function`)this.modalCloseHandlers.push({callbackIds:[],handler:e}),this.logger.debug(`Registered modal close handler for all modals`);else if(t){let n=Array.isArray(e)?e:[e];this.modalCloseHandlers.push({callbackIds:n,handler:t}),this.logger.debug(`Registered modal close handler`,{callbackIds:n})}}onSlashCommand(e,t){if(typeof e==`function`)this.slashCommandHandlers.push({commands:[],handler:e}),this.logger.debug(`Registered slash command handler for all commands`);else if(t){let n=(Array.isArray(e)?e:[e]).map(e=>e.startsWith(`/`)?e:`/${e}`);this.slashCommandHandlers.push({commands:n,handler:t}),this.logger.debug(`Registered slash command handler`,{commands:n})}}onAssistantThreadStarted(e){this.assistantThreadStartedHandlers.push(e),this.logger.debug(`Registered assistant thread started handler`)}onAssistantContextChanged(e){this.assistantContextChangedHandlers.push(e),this.logger.debug(`Registered assistant context changed handler`)}onAppHomeOpened(e){this.appHomeOpenedHandlers.push(e),this.logger.debug(`Registered app home opened handler`)}onMemberJoinedChannel(e){this.memberJoinedChannelHandlers.push(e),this.logger.debug(`Registered member joined channel handler`)}getAdapter(e){return this.adapters.get(e)}reviver(){return this.registerSingleton(),Bu}processMessage(e,t,n,r){let i=(async()=>{let r=typeof n==`function`?await n():n;await this.handleIncomingMessage(e,t,r)})(),a=i.catch(e=>{this.logger.error(`Message processing error`,{error:e,threadId:t})});return r?.waitUntil&&r.waitUntil(a),i}processReaction(e,t){let n=this.handleReactionEvent(e).catch(t=>{this.logger.error(`Reaction processing error`,{error:t,emoji:e.emoji,messageId:e.messageId})});t?.waitUntil&&t.waitUntil(n)}processAction(e,t){let n=this.handleActionEvent(e,t).catch(t=>{this.logger.error(`Action processing error`,{error:t,actionId:e.actionId,messageId:e.messageId})});return t?.waitUntil&&t.waitUntil(n),n}async processOptionsLoad(e,t){let n=[...this.optionsLoadHandlers.filter(({actionIds:t})=>t.length>0&&t.includes(e.actionId)),...this.optionsLoadHandlers.filter(({actionIds:e})=>e.length===0)];for(let{handler:t}of n)try{let n=await t(e);if(n)return n}catch(t){this.logger.error(`Options load handler error`,{error:t,actionId:e.actionId})}}async processModalSubmit(e,t,n){let{callbackUrl:r,relatedThread:i,relatedMessage:a,relatedChannel:o}=await this.retrieveModalContext(e.adapter.name,t),s={...e,relatedThread:i,relatedMessage:a,relatedChannel:o},c;for(let{callbackIds:t,handler:n}of this.modalSubmitHandlers)if(t.length===0||t.includes(e.callbackId))try{let e=await n(s);if(e){c=e;break}}catch(t){this.logger.error(`Modal submit handler error`,{error:t,callbackId:e.callbackId})}if(r&&c?.action!==`errors`){let t=ru(r,{type:`modal_submit`,callbackId:e.callbackId,values:e.values,user:{id:e.user.userId,name:e.user.userName}}).then(({error:e})=>{e&&this.logger.error(`Modal callbackUrl POST failed`,{callbackUrl:r,error:e})}).catch(e=>{this.logger.error(`Modal callbackUrl POST failed`,{callbackUrl:r,error:e})});n?.waitUntil&&n.waitUntil(t)}return c}processModalClose(e,t,n){let r=(async()=>{let{relatedThread:n,relatedMessage:r,relatedChannel:i}=await this.retrieveModalContext(e.adapter.name,t),a={...e,relatedThread:n,relatedMessage:r,relatedChannel:i};for(let{callbackIds:t,handler:n}of this.modalCloseHandlers)(t.length===0||t.includes(e.callbackId))&&await n(a)})().catch(t=>{this.logger.error(`Modal close handler error`,{error:t,callbackId:e.callbackId})});n?.waitUntil&&n.waitUntil(r)}processSlashCommand(e,t){let n=this.handleSlashCommandEvent(e,t).catch(t=>{this.logger.error(`Slash command processing error`,{error:t,command:e.command,text:e.text})});t?.waitUntil&&t.waitUntil(n)}processAssistantThreadStarted(e,t){let n=(async()=>{for(let t of this.assistantThreadStartedHandlers)await t(e)})().catch(t=>{this.logger.error(`Assistant thread started handler error`,{error:t,threadId:e.threadId})});t?.waitUntil&&t.waitUntil(n)}processAssistantContextChanged(e,t){let n=(async()=>{for(let t of this.assistantContextChangedHandlers)await t(e)})().catch(t=>{this.logger.error(`Assistant context changed handler error`,{error:t,threadId:e.threadId})});t?.waitUntil&&t.waitUntil(n)}processAppHomeOpened(e,t){let n=(async()=>{for(let t of this.appHomeOpenedHandlers)await t(e)})().catch(t=>{this.logger.error(`App home opened handler error`,{error:t,userId:e.userId})});t?.waitUntil&&t.waitUntil(n)}processMemberJoinedChannel(e,t){let n=(async()=>{for(let t of this.memberJoinedChannelHandlers)await t(e)})().catch(t=>{this.logger.error(`Member joined channel handler error`,{error:t,channelId:e.channelId,userId:e.userId})});t?.waitUntil&&t.waitUntil(n)}async handleSlashCommandEvent(e,t){if(this.logger.debug(`Incoming slash command`,{adapter:e.adapter.name,command:e.command,text:e.text,user:e.user.userName}),e.user.isMe){this.logger.debug(`Skipping slash command from self`,{command:e.command});return}let n=new Cu({id:e.channelId,adapter:e.adapter,stateAdapter:this._stateAdapter}),r={...e,channel:n,openModal:async r=>{if(!(e.triggerId||t?.onOpenModal)){this.logger.warn(`Cannot open modal: no triggerId available`);return}if(!(t?.onOpenModal||e.adapter.openModal)){this.logger.warn(`Cannot open modal: ${e.adapter.name} does not support modals`);return}let i=r;if(Y(r)){let e=uc(r);if(!e)throw Error(`Invalid JSX element: must be a Modal element`);i=e}let a=crypto.randomUUID();if(await this.storeModalContext(e.adapter.name,a,void 0,void 0,n,i.callbackUrl),t?.onOpenModal)return t.onOpenModal(i,a);if(e.triggerId&&e.adapter.openModal)return e.adapter.openModal(e.triggerId,i,a)}};this.logger.debug(`Checking slash command handlers`,{handlerCount:this.slashCommandHandlers.length,command:e.command});for(let{commands:t,handler:n}of this.slashCommandHandlers){if(t.length===0){this.logger.debug(`Running catch-all slash command handler`),await n(r);continue}t.includes(e.command)&&(this.logger.debug(`Running matched slash command handler`,{command:e.command}),await n(r))}}async storeModalContext(e,t,n,r,i,a){let o=`modal-context:${e}:${t}`,s={thread:n?.toJSON(),message:r?.toJSON(),channel:i?.toJSON(),callbackUrl:a};try{await this._stateAdapter.set(o,s,cd)}catch(e){this.logger.error(`Failed to store modal context`,{contextId:t,error:e})}}async retrieveModalContext(e,t){if(!t)return{callbackUrl:void 0,relatedThread:void 0,relatedMessage:void 0,relatedChannel:void 0};let n=`modal-context:${e}:${t}`,r=await this._stateAdapter.get(n);if(!r)return{callbackUrl:void 0,relatedThread:void 0,relatedMessage:void 0,relatedChannel:void 0};await this._stateAdapter.delete(n);let i=this.adapters.get(e),a;r.thread&&(a=Ru.fromJSON(r.thread,i));let o;if(r.message&&a){let e=Q.fromJSON(r.message);o=a.createSentMessageFromMessage(e)}let s;return r.channel&&(s=Cu.fromJSON(r.channel,i)),{callbackUrl:r.callbackUrl,relatedThread:a,relatedMessage:o,relatedChannel:s}}async handleActionEvent(e,t){if(this.logger.debug(`Incoming action`,{adapter:e.adapter.name,actionId:e.actionId,value:e.value,user:e.user.userName,messageId:e.messageId,threadId:e.threadId}),e.user.isMe){this.logger.debug(`Skipping action from self`,{actionId:e.actionId});return}let{callbackToken:n}=Xl(e.value),r=null;n&&(r=await nu(n,this._stateAdapter));let i=r?{...e,value:r.originalValue}:e,a;if(r){let t=r.url;a=(async()=>{let{error:n}=await ru(t,{type:`action`,actionId:e.actionId,value:r.originalValue,user:{id:e.user.userId,name:e.user.userName},threadId:e.threadId,messageId:e.messageId});n&&this.logger.error(`Button callbackUrl POST failed`,{callbackUrl:t,actionId:e.actionId,error:n})})()}let o=e.messageId?new Q({id:e.messageId,threadId:e.threadId,text:``,formatted:{type:`root`,children:[]},raw:e.raw,author:e.user,metadata:{dateSent:new Date,edited:!1},attachments:[]}):{},s=e.threadId?await this.createThread(e.adapter,e.threadId,o,!1):null,c={...i,thread:s,openModal:async n=>{if(!(e.triggerId||t?.onOpenModal)){this.logger.warn(`Cannot open modal: no triggerId available`);return}if(!(t?.onOpenModal||e.adapter.openModal)){this.logger.warn(`Cannot open modal: ${e.adapter.name} does not support modals`);return}let r=n;if(Y(n)){let e=uc(n);if(!e)throw Error(`Invalid JSX element: must be a Modal element`);r=e}let i;if(s){if(e.messageId?.startsWith(`ephemeral:`)){let e=s.recentMessages[0];e&&typeof e.toJSON==`function`&&(i=e)}else if(e.messageId&&e.adapter.fetchMessage){let t=await e.adapter.fetchMessage(e.threadId,e.messageId).catch(()=>null);if(t)i=new Q(t);else{let e=s.recentMessages[0];e&&typeof e.toJSON==`function`&&(i=e)}}}let a=crypto.randomUUID(),o=s?s.channel:void 0;if(await this.storeModalContext(e.adapter.name,a,s||void 0,i,o,r.callbackUrl),t?.onOpenModal)return t.onOpenModal(r,a);if(e.triggerId&&e.adapter.openModal)return e.adapter.openModal(e.triggerId,r,a)}};this.logger.debug(`Checking action handlers`,{handlerCount:this.actionHandlers.length,actionId:e.actionId});for(let{actionIds:t,handler:n}of this.actionHandlers){if(t.length===0){this.logger.debug(`Running catch-all action handler`),await n(c);continue}t.includes(e.actionId)&&(this.logger.debug(`Running matched action handler`,{actionId:e.actionId}),await n(c))}a&&await a}async handleReactionEvent(e){if(this.logger.debug(`Incoming reaction`,{adapter:e.adapter?.name,emoji:e.emoji,rawEmoji:e.rawEmoji,added:e.added,user:e.user.userName,messageId:e.messageId,threadId:e.threadId}),e.user.isMe){this.logger.debug(`Skipping reaction from self`,{emoji:e.emoji});return}if(!e.adapter){this.logger.error(`Reaction event missing adapter`);return}let t=await this._stateAdapter.isSubscribed(e.threadId),n=await this.createThread(e.adapter,e.threadId,e.message??{},t),r={...e,adapter:e.adapter,thread:n};this.logger.debug(`Checking reaction handlers`,{handlerCount:this.reactionHandlers.length,emoji:e.emoji.name,rawEmoji:e.rawEmoji});for(let{emoji:e,handler:t}of this.reactionHandlers){if(e.length===0){this.logger.debug(`Running catch-all reaction handler`),await t(r);continue}let n=e.some(e=>{if(e===r.emoji)return!0;let t=typeof e==`string`?e:e.name;return t===r.emoji.name||t===r.rawEmoji});this.logger.debug(`Reaction filter check`,{filterEmoji:e.map(e=>typeof e==`string`?e:e.name),eventEmoji:r.emoji.name,matches:n}),n&&(this.logger.debug(`Running matched reaction handler`),await t(r))}}getState(){return this._stateAdapter}getUserName(){return this.userName}getLogger(e){return e?this.logger.child(e):this.logger}async openDM(e){let t=typeof e==`string`?e:e.userId,n=this.inferAdapterFromUserId(t);if(!n.openDM)throw new $(`Adapter "${n.name}" does not support openDM`,`NOT_SUPPORTED`);let r=await n.openDM(t);return this.createThread(n,r,{},!1)}async getUser(e){let t=typeof e==`string`?e:e.userId,n=this.inferAdapterFromUserId(t);if(!n.getUser)throw new $(`Adapter "${n.name}" does not support getUser`,`NOT_SUPPORTED`);return n.getUser(t)}channel(e){let t=e.split(`:`)[0];if(!t)throw new $(`Invalid channel ID: ${e}`,`INVALID_CHANNEL_ID`);let n=this.adapters.get(t);if(!n)throw new $(`Adapter "${t}" not found for channel ID "${e}"`,`ADAPTER_NOT_FOUND`);return new Cu({id:e,adapter:n,stateAdapter:this._stateAdapter})}thread(e){let t=e.split(`:`)[0];if(!t)throw new $(`Invalid thread ID: ${e}`,`INVALID_THREAD_ID`);let n=this.adapters.get(t);if(!n)throw new $(`Adapter "${t}" not found for thread ID "${e}"`,`ADAPTER_NOT_FOUND`);return this.createThread(n,e,{},!1)}inferAdapterFromUserId(e){if(e.startsWith(`users/`)){let e=this.adapters.get(`gchat`);if(e)return e}if(e.startsWith(`29:`)){let e=this.adapters.get(`teams`);if(e)return e}if(ad.test(e)){let e=this.adapters.get(`linear`);if(e)return e}if(rd.test(e)){let e=this.adapters.get(`slack`);if(e)return e}if(od.test(e)){let t=[];if(id.test(e)&&this.adapters.has(`discord`)&&t.push(`discord`),this.adapters.has(`telegram`)&&t.push(`telegram`),this.adapters.has(`github`)&&t.push(`github`),t.length===1){let e=this.adapters.get(t[0]);if(e)return e}if(t.length>1)throw new $(`Numeric userId "${e}" is ambiguous between adapters: ${t.join(`, `)}. Call the platform's adapter directly (e.g. \`adapter.getUser(userId)\`).`,`AMBIGUOUS_USER_ID`)}throw new $(`Cannot infer adapter from userId "${e}". Expected: Slack ("U..."), Teams ("29:..."), Google Chat ("users/..."), Linear (UUID), or Discord/Telegram/GitHub (numeric).`,`UNKNOWN_USER_ID_FORMAT`)}async getLockKey(e,t){let n=e.channelIdFromThreadId(t),r;if(typeof this._lockScope==`function`){let i=e.isDM?.(t)??!1;r=await this._lockScope({adapter:e,channelId:n,isDM:i,threadId:t})}else r=this._lockScope??e.lockScope??`thread`;return r===`channel`?n:t}async handleIncomingMessage(e,t,n){if(du(n,e),this.logger.debug(`Incoming message`,{adapter:e.name,threadId:t,messageId:n.id,text:n.text,author:n.author.userName,authorUserId:n.author.userId,isBot:n.author.isBot,isMe:n.author.isMe}),n.author.isMe){this.logger.debug(`Skipping message from self (isMe=true)`,{adapter:e.name,threadId:t,author:n.author.userName});return}let r=`dedupe:${e.name}:${n.id}`;if(!await this._stateAdapter.setIfNotExists(r,!0,this._dedupeTtlMs)){this.logger.debug(`Skipping duplicate message`,{adapter:e.name,messageId:n.id});return}if(e.persistThreadHistory||e.persistMessageHistory){let r=e.channelIdFromThreadId(t),i=[this._threadHistory.append(t,n)];r!==t&&i.push(this._threadHistory.append(r,n)),await Promise.all(i)}let i=await this.getLockKey(e,t),a=this._concurrencyStrategy;if(a===`concurrent`){await this.handleConcurrent(e,t,n);return}if(a===`queue`||a===`debounce`||a===`burst`){await this.handleQueueOrDebounce(e,t,i,n,a);return}await this.handleDrop(e,t,i,n)}async handleDrop(e,t,n,r){let i=await this._stateAdapter.acquireLock(n,td);if(!i&&((typeof this._onLockConflict==`function`?await this._onLockConflict(t,r):this._onLockConflict??`drop`)===`force`&&(this.logger.info(`Force-releasing lock on thread`,{threadId:t,lockKey:n}),await this._stateAdapter.forceReleaseLock(n),i=await this._stateAdapter.acquireLock(n,td)),!i))throw this.logger.warn(`Could not acquire lock on thread`,{threadId:t,lockKey:n}),new gu(`Could not acquire lock on thread ${t}. Another instance may be processing.`);this.logger.debug(`Lock acquired`,{threadId:t,lockKey:n,token:i.token});try{await this.dispatchToHandlers(e,t,r)}finally{await this._stateAdapter.releaseLock(i),this.logger.debug(`Lock released`,{threadId:t,lockKey:n})}}async handleQueueOrDebounce(e,t,n,r,i){let{maxQueueSize:a,queueEntryTtlMs:o,onQueueFull:s,debounceMs:c}=this._concurrencyConfig,l=await this._stateAdapter.acquireLock(n,td);if(!l){let e=i===`debounce`?1:a,c=await this._stateAdapter.queueDepth(n);if(c>=e&&i!==`debounce`&&s===`drop-newest`){this.logger.info(`message-dropped`,{threadId:t,lockKey:n,messageId:r.id,reason:`queue-full`});return}await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},e),this.logger.info(i===`debounce`?`message-debounce-reset`:`message-queued`,{threadId:t,lockKey:n,messageId:r.id,queueDepth:Math.min(c+1,e)});return}this.logger.debug(`Lock acquired`,{threadId:t,lockKey:n,token:l.token});try{i===`debounce`?(await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},1),this.logger.info(`message-debouncing`,{threadId:t,lockKey:n,messageId:r.id,debounceMs:c}),await this.debounceLoop(l,e,t,n)):i===`burst`?(await this._stateAdapter.enqueue(n,{message:r,enqueuedAt:Date.now(),expiresAt:Date.now()+o},a),this.logger.info(`message-debouncing`,{threadId:t,lockKey:n,messageId:r.id,debounceMs:c}),await nd(c),await this._stateAdapter.extendLock(l,td),await this.drainQueue(l,e,t,n)):(await this.dispatchToHandlers(e,t,r),await this.drainQueue(l,e,t,n))}finally{await this._stateAdapter.releaseLock(l),this.logger.debug(`Lock released`,{threadId:t,lockKey:n})}}async debounceLoop(e,t,n,r){let{debounceMs:i}=this._concurrencyConfig;for(;;){await nd(i),await this._stateAdapter.extendLock(e,td);let a=await this._stateAdapter.dequeue(r);if(!a)break;let o=this.rehydrateMessage(a.message,t);if(Date.now()>a.expiresAt){this.logger.info(`message-expired`,{threadId:n,lockKey:r,messageId:o.id});continue}if(await this._stateAdapter.queueDepth(r)>0){this.logger.info(`message-superseded`,{threadId:n,lockKey:r,droppedId:o.id});continue}this.logger.info(`message-dequeued`,{threadId:n,lockKey:r,messageId:o.id}),await this.dispatchToHandlers(t,n,o);break}}async drainQueue(e,t,n,r){for(;;){let i=[];for(;;){let e=await this._stateAdapter.dequeue(r);if(!e)break;let a=this.rehydrateMessage(e.message,t);Date.now()<=e.expiresAt?i.push({message:a,expiresAt:e.expiresAt}):this.logger.info(`message-expired`,{threadId:n,lockKey:r,messageId:a.id})}if(i.length===0)return;await this._stateAdapter.extendLock(e,td);let a=i.at(-1);if(!a)return;let o=i.slice(0,-1).map(e=>e.message);this.logger.info(`message-dequeued`,{threadId:n,lockKey:r,messageId:a.message.id,skippedCount:o.length,totalSinceLastHandler:i.length});let s={skipped:o,totalSinceLastHandler:i.length};await this.dispatchToHandlers(t,n,a.message,s)}}async handleConcurrent(e,t,n){let{maxConcurrent:r}=this._concurrencyConfig;if(!Number.isFinite(r)){await this.dispatchToHandlers(e,t,n);return}await this.acquireConcurrentSlot(t,r);try{await this.dispatchToHandlers(e,t,n)}finally{this.releaseConcurrentSlot(t)}}acquireConcurrentSlot(e,t){let n=this._concurrentSlots.get(e);return n||(n={inFlight:0,waiters:[]},this._concurrentSlots.set(e,n)),n.inFlight<t?(n.inFlight++,Promise.resolve()):new Promise(e=>{n.waiters.push(e)})}releaseConcurrentSlot(e){let t=this._concurrentSlots.get(e);if(!t)return;let n=t.waiters.shift();if(n){n();return}t.inFlight--,t.inFlight===0&&t.waiters.length===0&&this._concurrentSlots.delete(e)}async dispatchToHandlers(e,t,n,r){n.isMention=n.isMention||this.detectMention(e,n);let i=await this._stateAdapter.isSubscribed(t);this.logger.debug(`Subscription check`,{threadId:t,isSubscribed:i,subscribedHandlerCount:this.subscribedMessageHandlers.length});let a=await this.createThread(e,t,n,i);if(this._identity&&n.userKey===void 0)try{let t=await this._identity({adapter:e.name,author:n.author,message:n});t&&(n.userKey=t)}catch(r){this.logger.warn(`Identity resolver threw; skipping userKey`,{error:r,adapter:e.name,threadId:t,authorUserId:n.author.userId})}let o=e.isDM?.(t)??!1;if(o&&this.directMessageHandlers.length>0){this.logger.debug(`Direct message received - calling handlers`,{threadId:t,handlerCount:this.directMessageHandlers.length});let e=a.channel;for(let t of this.directMessageHandlers)await t(a,n,e,r);return}if(o&&(n.isMention=!0),i){this.logger.debug(`Message in subscribed thread - calling handlers`,{threadId:t,handlerCount:this.subscribedMessageHandlers.length}),await this.runHandlers(this.subscribedMessageHandlers,a,n,r);return}if(n.isMention){this.logger.debug(`Bot mentioned`,{threadId:t,text:n.text.slice(0,100)}),await this.runHandlers(this.mentionHandlers,a,n,r);return}this.logger.debug(`Checking message patterns`,{patternCount:this.messagePatterns.length,patterns:this.messagePatterns.map(e=>e.pattern.toString()),messageText:n.text});let s=!1;for(let{pattern:e,handler:t}of this.messagePatterns){let i=e.test(n.text);this.logger.debug(`Pattern test`,{pattern:e.toString(),text:n.text,matches:i}),i&&(this.logger.debug(`Message matched pattern - calling handler`,{pattern:e.toString()}),s=!0,await t(a,n,r))}s||this.logger.debug(`No handlers matched message`,{threadId:t,text:n.text.slice(0,100)})}createThread(e,t,n,r=!1){let i=e.channelIdFromThreadId(t),a=e.isDM?.(t)??!1,o=e.getChannelVisibility?.(t)??`unknown`;return new Ru({id:t,adapter:e,channelId:i,stateAdapter:this._stateAdapter,initialMessage:n,isSubscribedContext:r,isDM:a,channelVisibility:o,currentMessage:n,logger:this.logger,streamingUpdateIntervalMs:this._streamingUpdateIntervalMs,fallbackStreamingPlaceholderText:this._fallbackStreamingPlaceholderText,threadHistory:e.persistThreadHistory||e.persistMessageHistory?this._threadHistory:void 0})}detectMention(e,t){let n=e.userName||this.userName,r=e.botUserId;return!!(RegExp(`@${this.escapeRegex(n)}\\b`,`i`).test(t.text)||r&&(RegExp(`@${this.escapeRegex(r)}\\b`,`i`).test(t.text)||RegExp(`<@!?${this.escapeRegex(r)}>`,`i`).test(t.text)))}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}rehydrateMessage(e,t){if(e instanceof Q)return t&&du(e,t),e;let n=e,r;if(n._type===`chat:Message`)r=Q.fromJSON(n);else{let e=n.metadata,t=e.dateSent,i=e.editedAt;r=new Q({id:n.id,threadId:n.threadId,text:n.text,formatted:n.formatted,raw:n.raw,author:n.author,metadata:{dateSent:t instanceof Date?t:new Date(t),edited:e.edited,editedAt:i?new Date(i instanceof Date?i.toISOString():i):void 0},attachments:n.attachments??[],isMention:n.isMention,links:n.links??[]})}t&&du(r,t);let i=t?.rehydrateAttachment?.bind(t);return i&&r.attachments.length>0&&(r.attachments=r.attachments.map(e=>e.fetchData?e:i(e))),r}async runHandlers(e,t,n,r){for(let i of e)await i(t,n,r)}},ud=Wu;function dd(e){return e?Array.isArray(e)?e.join(` `).trim():typeof e==`string`?e:`markdown`in e?W(ns(e.markdown)):`ast`in e?W(e.ast):``:``}var fd=class{$$typeof=fu;kind=`plan`;_model;_bound=null;constructor(e){let t=dd(e.initialMessage)||`Plan`,n={id:crypto.randomUUID(),title:t,status:`in_progress`};this._model={title:t,tasks:[n]}}isSupported(e){return!!e.postObject&&!!e.editObject}getPostData(){return this._model}getFallbackText(){let e=[];e.push(`\u{1F4CB} ${this._model.title||`Plan`}`);for(let t of this._model.tasks){let n={complete:`✅`,in_progress:`🔄`,error:`❌`}[t.status]??`⬜`;e.push(`${n} ${t.title}`)}return e.join(`
90
90
  `)}onPosted(e){this._bound={adapter:e.adapter,fallback:!this.isSupported(e.adapter),logger:e.logger,messageId:e.messageId,threadId:e.threadId,updateChain:Promise.resolve()}}get id(){return this._bound?.messageId??``}get threadId(){return this._bound?.threadId??``}get title(){return this._model.title}get tasks(){return this._model.tasks.map(e=>({id:e.id,title:e.title,status:e.status}))}get currentTask(){let e;for(let t=this._model.tasks.length-1;t>=0;t--)if(this._model.tasks[t].status===`in_progress`){e=this._model.tasks[t];break}return e??=this._model.tasks.at(-1),e?{id:e.id,title:e.title,status:e.status}:null}async addTask(e){if(!this.canMutate())return null;let t=dd(e.title)||`Task`;for(let e of this._model.tasks)e.status===`in_progress`&&(e.status=`complete`);let n={id:crypto.randomUUID(),title:t,status:`in_progress`,details:e.children};return this._model.tasks.push(n),this._model.title=t,await this.enqueueEdit(),{id:n.id,title:n.title,status:n.status}}async updateTask(e){if(!this.canMutate())return null;let t;if(typeof e==`object`&&e&&`id`in e&&e.id)t=this._model.tasks.find(t=>t.id===e.id);else{for(let e=this._model.tasks.length-1;e>=0;e--)if(this._model.tasks[e].status===`in_progress`){t=this._model.tasks[e];break}t??=this._model.tasks.at(-1)}return t?(e!==void 0&&(typeof e==`object`&&e&&`output`in e?(e.output!==void 0&&(t.output=e.output),e.status&&(t.status=e.status)):t.output=e),await this.enqueueEdit(),{id:t.id,title:t.title,status:t.status}):null}async reset(e){if(!this.canMutate())return null;let t=dd(e.initialMessage)||`Plan`,n={id:crypto.randomUUID(),title:t,status:`in_progress`};return this._model={title:t,tasks:[n]},await this.enqueueEdit(),{id:n.id,title:n.title,status:n.status}}async complete(e){if(this.canMutate()){for(let e of this._model.tasks)e.status===`in_progress`&&(e.status=`complete`);this._model.title=dd(e.completeMessage)||this._model.title,await this.enqueueEdit()}}canMutate(){return!!this._bound}enqueueEdit(){if(!this._bound)return Promise.resolve();let e=this._bound,t=async()=>{if(e.fallback)await e.adapter.editMessage(e.threadId,e.messageId,this.getFallbackText());else{let t=e.adapter.editObject;if(!t)return;await t.call(e.adapter,e.threadId,e.messageId,this.kind,this._model)}},n=e.updateChain.then(t,t);return e.updateChain=n.then(()=>void 0,t=>{e.logger?.warn(`Failed to edit plan`,t)}),n}},pd=class{$$typeof=fu;kind=`stream`;_stream;_options;constructor(e,t={}){this._stream=e,this._options=t}get stream(){return this._stream}get options(){return this._options}getFallbackText(){return``}getPostData(){return{stream:this._stream,options:this._options}}isSupported(e){return!0}onPosted(e){}},md=new Map;function hd(e){let t=md.get(e);return t||(t=Object.freeze({name:e,toString:()=>`{{emoji:${e}}}`,toJSON:()=>`{{emoji:${e}}}`}),md.set(e,t)),t}var gd={thumbs_up:{slack:[`+1`,`thumbsup`],gchat:`👍`},thumbs_down:{slack:[`-1`,`thumbsdown`],gchat:`👎`},clap:{slack:`clap`,gchat:`👏`},wave:{slack:`wave`,gchat:`👋`},pray:{slack:`pray`,gchat:`🙏`},muscle:{slack:`muscle`,gchat:`💪`},ok_hand:{slack:`ok_hand`,gchat:`👌`},point_up:{slack:`point_up`,gchat:`👆`},point_down:{slack:`point_down`,gchat:`👇`},point_left:{slack:`point_left`,gchat:`👈`},point_right:{slack:`point_right`,gchat:`👉`},raised_hands:{slack:`raised_hands`,gchat:`🙌`},shrug:{slack:`shrug`,gchat:`🤷`},facepalm:{slack:`facepalm`,gchat:`🤦`},heart:{slack:`heart`,gchat:[`❤️`,`❤`]},smile:{slack:[`smile`,`slightly_smiling_face`],gchat:`😊`},laugh:{slack:[`laughing`,`satisfied`,`joy`],gchat:[`😂`,`😆`]},thinking:{slack:`thinking_face`,gchat:`🤔`},sad:{slack:[`cry`,`sad`,`white_frowning_face`],gchat:`😢`},cry:{slack:`sob`,gchat:`😭`},angry:{slack:`angry`,gchat:`😠`},love_eyes:{slack:`heart_eyes`,gchat:`😍`},cool:{slack:`sunglasses`,gchat:`😎`},wink:{slack:`wink`,gchat:`😉`},surprised:{slack:`open_mouth`,gchat:`😮`},worried:{slack:`worried`,gchat:`😟`},confused:{slack:`confused`,gchat:`😕`},neutral:{slack:`neutral_face`,gchat:`😐`},sleeping:{slack:`sleeping`,gchat:`😴`},sick:{slack:`nauseated_face`,gchat:`🤢`},mind_blown:{slack:`exploding_head`,gchat:`🤯`},relieved:{slack:`relieved`,gchat:`😌`},grimace:{slack:`grimacing`,gchat:`😬`},rolling_eyes:{slack:`rolling_eyes`,gchat:`🙄`},hug:{slack:`hugging_face`,gchat:`🤗`},zany:{slack:`zany_face`,gchat:`🤪`},check:{slack:[`white_check_mark`,`heavy_check_mark`],gchat:[`✅`,`✔️`]},x:{slack:[`x`,`heavy_multiplication_x`],gchat:[`❌`,`✖️`]},question:{slack:`question`,gchat:[`❓`,`?`]},exclamation:{slack:`exclamation`,gchat:`❗`},warning:{slack:`warning`,gchat:`⚠️`},stop:{slack:`octagonal_sign`,gchat:`🛑`},info:{slack:`information_source`,gchat:`ℹ️`},100:{slack:`100`,gchat:`💯`},fire:{slack:`fire`,gchat:`🔥`},star:{slack:`star`,gchat:`⭐`},sparkles:{slack:`sparkles`,gchat:`✨`},lightning:{slack:`zap`,gchat:`⚡`},boom:{slack:`boom`,gchat:`💥`},eyes:{slack:`eyes`,gchat:`👀`},green_circle:{slack:`large_green_circle`,gchat:`🟢`},yellow_circle:{slack:`large_yellow_circle`,gchat:`🟡`},red_circle:{slack:`red_circle`,gchat:`🔴`},blue_circle:{slack:`large_blue_circle`,gchat:`🔵`},white_circle:{slack:`white_circle`,gchat:`⚪`},black_circle:{slack:`black_circle`,gchat:`⚫`},rocket:{slack:`rocket`,gchat:`🚀`},party:{slack:[`tada`,`partying_face`],gchat:[`🎉`,`🥳`]},confetti:{slack:`confetti_ball`,gchat:`🎊`},balloon:{slack:`balloon`,gchat:`🎈`},gift:{slack:`gift`,gchat:`🎁`},trophy:{slack:`trophy`,gchat:`🏆`},medal:{slack:`first_place_medal`,gchat:`🥇`},lightbulb:{slack:`bulb`,gchat:`💡`},gear:{slack:`gear`,gchat:`⚙️`},wrench:{slack:`wrench`,gchat:`🔧`},hammer:{slack:`hammer`,gchat:`🔨`},bug:{slack:`bug`,gchat:`🐛`},link:{slack:`link`,gchat:`🔗`},lock:{slack:`lock`,gchat:`🔒`},unlock:{slack:`unlock`,gchat:`🔓`},key:{slack:`key`,gchat:`🔑`},pin:{slack:`pushpin`,gchat:`📌`},memo:{slack:`memo`,gchat:`📝`},clipboard:{slack:`clipboard`,gchat:`📋`},calendar:{slack:`calendar`,gchat:`📅`},clock:{slack:`clock1`,gchat:`🕐`},hourglass:{slack:`hourglass`,gchat:`⏳`},bell:{slack:`bell`,gchat:`🔔`},megaphone:{slack:`mega`,gchat:`📢`},speech_bubble:{slack:`speech_balloon`,gchat:`💬`},email:{slack:`email`,gchat:`📧`},inbox:{slack:`inbox_tray`,gchat:`📥`},outbox:{slack:`outbox_tray`,gchat:`📤`},package:{slack:`package`,gchat:`📦`},folder:{slack:`file_folder`,gchat:`📁`},file:{slack:`page_facing_up`,gchat:`📄`},chart_up:{slack:`chart_with_upwards_trend`,gchat:`📈`},chart_down:{slack:`chart_with_downwards_trend`,gchat:`📉`},coffee:{slack:`coffee`,gchat:`☕`},pizza:{slack:`pizza`,gchat:`🍕`},beer:{slack:`beer`,gchat:`🍺`},arrow_up:{slack:`arrow_up`,gchat:`⬆️`},arrow_down:{slack:`arrow_down`,gchat:`⬇️`},arrow_left:{slack:`arrow_left`,gchat:`⬅️`},arrow_right:{slack:`arrow_right`,gchat:`➡️`},refresh:{slack:`arrows_counterclockwise`,gchat:`🔄`},sun:{slack:`sunny`,gchat:`☀️`},cloud:{slack:`cloud`,gchat:`☁️`},rain:{slack:`rain_cloud`,gchat:`🌧️`},snow:{slack:`snowflake`,gchat:`❄️`},rainbow:{slack:`rainbow`,gchat:`🌈`}},_d=class{emojiMap;slackToNormalized;gchatToNormalized;constructor(e){this.emojiMap={...gd,...e},this.slackToNormalized=new Map,this.gchatToNormalized=new Map,this.buildReverseMaps()}buildReverseMaps(){for(let[e,t]of Object.entries(this.emojiMap)){let n=Array.isArray(t.slack)?t.slack:[t.slack];for(let t of n)this.slackToNormalized.set(t.toLowerCase(),e);let r=Array.isArray(t.gchat)?t.gchat:[t.gchat];for(let t of r)this.gchatToNormalized.set(t,e)}}fromSlack(e){let t=e.replace(/^:|:$/g,``).toLowerCase();return hd(this.slackToNormalized.get(t)??e)}fromGChat(e){return hd(this.gchatToNormalized.get(e)??e)}fromTeams(e){return hd({like:`thumbs_up`,heart:`heart`,laugh:`laugh`,surprised:`surprised`,sad:`sad`,angry:`angry`}[e]??e)}toSlack(e){let t=typeof e==`string`?e:e.name,n=this.emojiMap[t];return n?Array.isArray(n.slack)?n.slack[0]:n.slack:t}toGChat(e){let t=typeof e==`string`?e:e.name,n=this.emojiMap[t];return n?Array.isArray(n.gchat)?n.gchat[0]:n.gchat:t}toDiscord(e){return this.toGChat(e)}matches(e,t){let n=typeof t==`string`?t:t.name,r=this.emojiMap[n];if(!r)return e===n;let i=Array.isArray(r.slack)?r.slack:[r.slack],a=Array.isArray(r.gchat)?r.gchat:[r.gchat],o=e.replace(/^:|:$/g,``).toLowerCase();return i.some(e=>e.toLowerCase()===o)||a.includes(e)}extend(e){Object.assign(this.emojiMap,e),this.buildReverseMaps()}},vd=new _d,yd=/\{\{emoji:([a-z0-9_]+)\}\}/gi;function bd(e,t,n=vd){return e.replace(yd,(e,r)=>{switch(t){case`slack`:return`:${n.toSlack(r)}:`;case`gchat`:return n.toGChat(r);case`teams`:return n.toGChat(r);case`discord`:return n.toDiscord(r);case`messenger`:return n.toGChat(r);case`github`:return n.toGChat(r);case`linear`:return n.toGChat(r);case`whatsapp`:return n.toGChat(r);default:return n.toGChat(r)}})}function xd(e){let t=`thumbs_up.thumbs_down.clap.wave.pray.muscle.ok_hand.point_up.point_down.point_left.point_right.raised_hands.shrug.facepalm.heart.smile.laugh.thinking.sad.cry.angry.love_eyes.cool.wink.surprised.worried.confused.neutral.sleeping.sick.mind_blown.relieved.grimace.rolling_eyes.hug.zany.check.x.question.exclamation.warning.stop.info.100.fire.star.sparkles.lightning.boom.eyes.green_circle.yellow_circle.red_circle.blue_circle.white_circle.black_circle.rocket.party.confetti.balloon.gift.trophy.medal.lightbulb.gear.wrench.hammer.bug.link.lock.unlock.key.pin.memo.clipboard.calendar.clock.hourglass.bell.megaphone.speech_bubble.email.inbox.outbox.package.folder.file.chart_up.chart_down.coffee.pizza.beer.arrow_up.arrow_down.arrow_left.arrow_right.refresh.sun.cloud.rain.snow.rainbow`.split(`.`),n={custom:e=>hd(e)};for(let e of t)n[e]=hd(e);if(e){for(let t of Object.keys(e))n[t]=hd(t);vd.extend(e)}return n}var Sd=xd(),Cd=xs,wd=Ss,Td=hs,Ed=Ps,Dd=Ds,Od=_s,kd=ys,Ad=ws,jd=Ts,Md=As,Nd=vs,Pd=ms,Fd=Y,Id=Cs,Ld=bs,Rd=Es,zd=J,Bd=uc,Vd=Ks,Hd=Is,Ud=Vs,Wd=Rs,Gd=Us,Kd=Bs,qd=Hs,Jd=zs;export{mc as $,pd as A,Qo as At,wu as B,fd as C,K as Ct,Kd as D,rs as Dt,Ld as E,cs as Et,Ru as F,hd as G,lu as H,Ed as I,Hd as J,Pd as K,bd as L,Rd as M,W as Mt,Jd as N,as as Nt,qd as O,os as Ot,Wu as P,Bd as Q,xd as R,_u as S,is as St,hu as T,q as Tt,Md as U,Sd as V,Vd as W,Bu as X,pu as Y,zd as Z,Id as _,Zo as _t,Od as a,ts as at,ud as b,Ro as bt,$ as c,Wo as ct,kd as d,Uo as dt,ps as et,_d as f,Go as ft,Nd as g,Bo as gt,jd as h,zo as ht,Dd as i,es as it,yu as j,G as jt,Eu as k,$o as kt,vu as l,Ho as lt,Ad as m,qo as mt,wd as n,us as nt,Cu as o,ls as ot,Ud as p,Jo as pt,Fd as q,Td as r,ss as rt,ld as s,Ko as st,Cd as t,fs as tt,gd as u,Vo as ut,gu as v,Yo as vt,Gd as w,ns as wt,Wd as x,ds as xt,Q as y,Xo as yt,vd as z};