@ai-devkit/channel-connector 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 (69) hide show
  1. package/dist/ChannelConfigRepository.d.ts +1 -1
  2. package/dist/ChannelConfigRepository.d.ts.map +1 -1
  3. package/dist/ChannelConfigRepository.js +13 -13
  4. package/dist/ChannelConfigRepository.js.map +1 -1
  5. package/dist/ChannelManager.d.ts +1 -1
  6. package/dist/ChannelManager.d.ts.map +1 -1
  7. package/dist/ChannelManager.js +9 -9
  8. package/dist/ChannelManager.js.map +1 -1
  9. package/dist/__tests__/ChannelConfigRepository.test.js +72 -72
  10. package/dist/__tests__/ChannelConfigRepository.test.js.map +1 -1
  11. package/dist/__tests__/ChannelManager.test.js +26 -26
  12. package/dist/__tests__/ChannelManager.test.js.map +1 -1
  13. package/dist/__tests__/adapters/slack/SlackAdapter.test.js +137 -137
  14. package/dist/__tests__/adapters/slack/SlackAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/slack/SlackMessageDelivery.test.js +36 -36
  16. package/dist/__tests__/adapters/slack/SlackMessageDelivery.test.js.map +1 -1
  17. package/dist/__tests__/adapters/slack/slackMarkdown.test.js +25 -25
  18. package/dist/__tests__/adapters/slack/slackMarkdown.test.js.map +1 -1
  19. package/dist/__tests__/adapters/slack/slackQuestion.test.js +41 -41
  20. package/dist/__tests__/adapters/slack/slackQuestion.test.js.map +1 -1
  21. package/dist/__tests__/adapters/telegram/TelegramAdapter.test.js +154 -154
  22. package/dist/__tests__/adapters/telegram/TelegramAdapter.test.js.map +1 -1
  23. package/dist/__tests__/adapters/telegram/telegramHtml.test.js +109 -109
  24. package/dist/__tests__/adapters/telegram/telegramHtml.test.js.map +1 -1
  25. package/dist/adapters/ChannelAdapter.d.ts +1 -1
  26. package/dist/adapters/ChannelAdapter.d.ts.map +1 -1
  27. package/dist/adapters/ChannelAdapter.js +1 -1
  28. package/dist/adapters/ChannelAdapter.js.map +1 -1
  29. package/dist/adapters/slack/SlackAdapter.d.ts +2 -2
  30. package/dist/adapters/slack/SlackAdapter.d.ts.map +1 -1
  31. package/dist/adapters/slack/SlackAdapter.js +17 -17
  32. package/dist/adapters/slack/SlackAdapter.js.map +1 -1
  33. package/dist/adapters/slack/SlackMessageDelivery.d.ts +1 -1
  34. package/dist/adapters/slack/SlackMessageDelivery.d.ts.map +1 -1
  35. package/dist/adapters/slack/SlackMessageDelivery.js +6 -6
  36. package/dist/adapters/slack/SlackMessageDelivery.js.map +1 -1
  37. package/dist/adapters/slack/slackMarkdown.d.ts.map +1 -1
  38. package/dist/adapters/slack/slackMarkdown.js +36 -36
  39. package/dist/adapters/slack/slackMarkdown.js.map +1 -1
  40. package/dist/adapters/slack/slackQuestion.d.ts +7 -7
  41. package/dist/adapters/slack/slackQuestion.d.ts.map +1 -1
  42. package/dist/adapters/slack/slackQuestion.js +13 -13
  43. package/dist/adapters/slack/slackQuestion.js.map +1 -1
  44. package/dist/adapters/telegram/TelegramAdapter.d.ts +2 -2
  45. package/dist/adapters/telegram/TelegramAdapter.d.ts.map +1 -1
  46. package/dist/adapters/telegram/TelegramAdapter.js +30 -27
  47. package/dist/adapters/telegram/TelegramAdapter.js.map +1 -1
  48. package/dist/adapters/telegram/TelegramMessageDelivery.d.ts.map +1 -1
  49. package/dist/adapters/telegram/TelegramMessageDelivery.js +2 -2
  50. package/dist/adapters/telegram/TelegramMessageDelivery.js.map +1 -1
  51. package/dist/adapters/telegram/telegramHtml.d.ts.map +1 -1
  52. package/dist/adapters/telegram/telegramHtml.js +16 -16
  53. package/dist/adapters/telegram/telegramHtml.js.map +1 -1
  54. package/dist/adapters/telegram/telegramKeyboard.d.ts +1 -1
  55. package/dist/adapters/telegram/telegramKeyboard.d.ts.map +1 -1
  56. package/dist/adapters/telegram/telegramKeyboard.js.map +1 -1
  57. package/dist/adapters/telegram/telegramMarkdown.d.ts.map +1 -1
  58. package/dist/adapters/telegram/telegramMarkdown.js +28 -28
  59. package/dist/adapters/telegram/telegramMarkdown.js.map +1 -1
  60. package/dist/index.d.ts +9 -9
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +5 -5
  63. package/dist/index.js.map +1 -1
  64. package/dist/types.d.ts +6 -6
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/types.js +1 -1
  67. package/dist/types.js.map +1 -1
  68. package/package.json +21 -22
  69. package/vitest.config.ts +16 -16
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/telegram/telegramMarkdown.ts"],"sourcesContent":["import { Marked, type Token, type Tokens } from 'marked';\nimport { markdownToTelegramHtml } from './telegramHtml.js';\n\nconst markdownLexer = new Marked();\n\nexport type TelegramMessageChunk = {\n text: string;\n html: boolean;\n};\n\nexport function isParseEntitiesError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const description = (error as { description?: string }).description;\n const message = (error as { message?: string }).message;\n return ((description ?? '') + (message ?? '')).includes(\"can't parse entities\");\n}\n\nexport function htmlToPlainText(html: string): string {\n return html\n .replace(/<[^>]+>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&');\n}\n\nexport function chunkMarkdownForTelegram(markdown: string, maxLen: number): TelegramMessageChunk[] {\n const markdownChunks = splitMarkdownSource(markdown, maxLen);\n const chunks: TelegramMessageChunk[] = [];\n\n for (const markdownChunk of markdownChunks) {\n const html = markdownToTelegramHtml(markdownChunk);\n if (html.length <= maxLen) {\n if (html.length > 0) chunks.push({ text: html, html: true });\n continue;\n }\n\n for (const plainChunk of chunkMessage(markdownChunk, maxLen)) {\n if (plainChunk.length > 0) chunks.push({ text: plainChunk, html: false });\n }\n }\n\n return chunks;\n}\n\nfunction splitMarkdownSource(markdown: string, maxLen: number, depth = 0): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n if (depth > 6) return splitPlainMarkdownText(markdown, maxLen);\n\n const chunks: string[] = [];\n let current = '';\n const tokens = markdownLexer.lexer(markdown);\n\n for (const token of tokens) {\n const raw = token.raw ?? '';\n if (raw.length === 0) continue;\n\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitOversizedToken(token, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks.flatMap((chunk) => renderedLengthFits(chunk, maxLen) ? [chunk] : splitPlainMarkdownText(chunk, maxLen));\n}\n\nfunction splitOversizedToken(token: Token, maxLen: number, depth: number): string[] {\n switch (token.type) {\n case 'code':\n return splitCodeToken(token as Tokens.Code, maxLen);\n case 'list':\n return splitListToken(token as Tokens.List, maxLen, depth);\n case 'paragraph':\n case 'text':\n return splitPlainMarkdownText(token.raw, maxLen);\n default:\n if ('tokens' in token && Array.isArray(token.tokens) && token.raw !== undefined) {\n return splitMarkdownSource(token.raw, maxLen, depth);\n }\n return splitPlainMarkdownText(token.raw ?? '', maxLen);\n }\n}\n\nfunction splitListToken(token: Tokens.List, maxLen: number, depth: number): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const item of token.items) {\n const raw = item.raw;\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitMarkdownSource(raw, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitCodeToken(token: Tokens.Code, maxLen: number): string[] {\n const fence = token.raw.startsWith('~~~') ? '~~~' : '```';\n const lang = token.lang ? token.lang.split(/\\s/)[0] : '';\n const lines = token.text.split('\\n');\n const chunks: string[] = [];\n let currentLines: string[] = [];\n\n const renderFence = (codeLines: string[]): string =>\n `${fence}${lang}\\n${codeLines.join('\\n')}\\n${fence}\\n\\n`;\n\n for (const line of lines) {\n const candidateLines = [...currentLines, line];\n if (renderedLengthFits(renderFence(candidateLines), maxLen)) {\n currentLines = candidateLines;\n continue;\n }\n\n if (currentLines.length > 0) {\n chunks.push(renderFence(currentLines));\n currentLines = [];\n }\n\n if (renderedLengthFits(renderFence([line]), maxLen)) {\n currentLines = [line];\n } else {\n for (const segment of splitCodeLine(line, fence, lang, maxLen)) {\n chunks.push(renderFence([segment]));\n }\n }\n }\n\n if (currentLines.length > 0) chunks.push(renderFence(currentLines));\n return chunks;\n}\n\nfunction splitCodeLine(line: string, fence: string, lang: string, maxLen: number): string[] {\n const segments: string[] = [];\n let current = '';\n const renderFence = (value: string): string => `${fence}${lang}\\n${value}\\n${fence}\\n\\n`;\n\n for (const char of Array.from(line)) {\n const candidate = current + char;\n if (renderedLengthFits(renderFence(candidate), maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n segments.push(current);\n current = '';\n }\n\n if (renderedLengthFits(renderFence(char), maxLen)) {\n current = char;\n } else {\n segments.push(char);\n }\n }\n\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction splitPlainMarkdownText(markdown: string, maxLen: number): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n\n const newlineUnits = markdown.split(/(?<=\\n)/u);\n if (newlineUnits.length > 1) {\n return packMarkdownUnits(newlineUnits, maxLen, splitPlainMarkdownText);\n }\n\n const sentenceUnits = markdown.match(/[^.!?]+[.!?]+(?:\\s+|$)|[^.!?]+$/gu);\n if (sentenceUnits && sentenceUnits.length > 1) {\n return packMarkdownUnits(sentenceUnits, maxLen, splitPlainMarkdownText);\n }\n\n const wordUnits = markdown.match(/\\S+\\s*/gu);\n if (wordUnits && wordUnits.length > 1) {\n return packMarkdownUnits(wordUnits, maxLen, splitPlainMarkdownText);\n }\n\n return splitByCodePoint(markdown, maxLen);\n}\n\nfunction packMarkdownUnits(\n units: string[],\n maxLen: number,\n splitOversized: (unit: string, maxLen: number) => string[],\n): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const unit of units) {\n const candidate = current + unit;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(unit, maxLen)) {\n current = unit;\n } else {\n chunks.push(...splitOversized(unit, maxLen));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitByCodePoint(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const char of Array.from(text)) {\n const candidate = current + char;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(char, maxLen)) {\n current = char;\n } else {\n chunks.push(char);\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction renderedLengthFits(markdown: string, maxLen: number): boolean {\n return markdownToTelegramHtml(markdown).length <= maxLen;\n}\n\n/**\n * Split text into chunks of maxLen or fewer characters. Prefers paragraph\n * boundaries (\\n\\n), then single newlines (\\n), then hard-splits at maxLen.\n */\nexport function chunkMessage(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLen) {\n chunks.push(remaining);\n break;\n }\n\n const lastParagraph = remaining.lastIndexOf('\\n\\n', maxLen - 2);\n const lastNewline = remaining.lastIndexOf('\\n', maxLen - 1);\n\n let splitAt: number;\n if (lastParagraph > 0) {\n splitAt = lastParagraph + 2;\n } else if (lastNewline > 0) {\n splitAt = lastNewline + 1;\n } else {\n splitAt = maxLen;\n }\n\n chunks.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n }\n\n return chunks;\n}\n"],"names":["Marked","markdownToTelegramHtml","markdownLexer","isParseEntitiesError","error","description","message","includes","htmlToPlainText","html","replace","chunkMarkdownForTelegram","markdown","maxLen","markdownChunks","splitMarkdownSource","chunks","markdownChunk","length","push","text","plainChunk","chunkMessage","depth","renderedLengthFits","splitPlainMarkdownText","current","tokens","lexer","token","raw","candidate","splitOversizedToken","flatMap","chunk","type","splitCodeToken","splitListToken","Array","isArray","undefined","item","items","fence","startsWith","lang","split","lines","currentLines","renderFence","codeLines","join","line","candidateLines","segment","splitCodeLine","segments","value","char","from","newlineUnits","packMarkdownUnits","sentenceUnits","match","wordUnits","splitByCodePoint","units","splitOversized","unit","remaining","lastParagraph","lastIndexOf","lastNewline","splitAt","slice"],"mappings":"AAAA,SAASA,MAAM,QAAiC,SAAS;AACzD,SAASC,sBAAsB,QAAQ,oBAAoB;AAE3D,MAAMC,gBAAgB,IAAIF;AAO1B,OAAO,SAASG,qBAAqBC,KAAc;IAC/C,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU,OAAO;IAChD,MAAMC,cAAc,AAACD,MAAmCC,WAAW;IACnE,MAAMC,UAAU,AAACF,MAA+BE,OAAO;IACvD,OAAO,AAAC,CAAA,AAACD,CAAAA,eAAe,EAAC,IAAMC,CAAAA,WAAW,EAAC,CAAC,EAAGC,QAAQ,CAAC;AAC5D;AAEA,OAAO,SAASC,gBAAgBC,IAAY;IACxC,OAAOA,KACFC,OAAO,CAAC,YAAY,IACpBA,OAAO,CAAC,SAAS,KACjBA,OAAO,CAAC,SAAS,KACjBA,OAAO,CAAC,WAAW,KACnBA,OAAO,CAAC,UAAU;AAC3B;AAEA,OAAO,SAASC,yBAAyBC,QAAgB,EAAEC,MAAc;IACrE,MAAMC,iBAAiBC,oBAAoBH,UAAUC;IACrD,MAAMG,SAAiC,EAAE;IAEzC,KAAK,MAAMC,iBAAiBH,eAAgB;QACxC,MAAML,OAAOR,uBAAuBgB;QACpC,IAAIR,KAAKS,MAAM,IAAIL,QAAQ;YACvB,IAAIJ,KAAKS,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAAC;gBAAEC,MAAMX;gBAAMA,MAAM;YAAK;YAC1D;QACJ;QAEA,KAAK,MAAMY,cAAcC,aAAaL,eAAeJ,QAAS;YAC1D,IAAIQ,WAAWH,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAAC;gBAAEC,MAAMC;gBAAYZ,MAAM;YAAM;QAC3E;IACJ;IAEA,OAAOO;AACX;AAEA,SAASD,oBAAoBH,QAAgB,EAAEC,MAAc,EAAEU,QAAQ,CAAC;IACpE,IAAIX,SAASM,MAAM,KAAK,GAAG,OAAO,EAAE;IACpC,IAAIM,mBAAmBZ,UAAUC,SAAS,OAAO;QAACD;KAAS;IAC3D,IAAIW,QAAQ,GAAG,OAAOE,uBAAuBb,UAAUC;IAEvD,MAAMG,SAAmB,EAAE;IAC3B,IAAIU,UAAU;IACd,MAAMC,SAASzB,cAAc0B,KAAK,CAAChB;IAEnC,KAAK,MAAMiB,SAASF,OAAQ;QACxB,MAAMG,MAAMD,MAAMC,GAAG,IAAI;QACzB,IAAIA,IAAIZ,MAAM,KAAK,GAAG;QAEtB,MAAMa,YAAYL,UAAUI;QAC5B,IAAIC,UAAUb,MAAM,GAAG,KAAKM,mBAAmBO,WAAWlB,SAAS;YAC/Da,UAAUK;YACV;QACJ;QAEA,IAAIL,QAAQR,MAAM,GAAG,GAAG;YACpBF,OAAOG,IAAI,CAACO;YACZA,UAAU;QACd;QAEA,IAAIF,mBAAmBM,KAAKjB,SAAS;YACjCa,UAAUI;QACd,OAAO;YACHd,OAAOG,IAAI,IAAIa,oBAAoBH,OAAOhB,QAAQU,QAAQ;QAC9D;IACJ;IAEA,IAAIG,QAAQR,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAACO;IACpC,OAAOV,OAAOiB,OAAO,CAAC,CAACC,QAAUV,mBAAmBU,OAAOrB,UAAU;YAACqB;SAAM,GAAGT,uBAAuBS,OAAOrB;AACjH;AAEA,SAASmB,oBAAoBH,KAAY,EAAEhB,MAAc,EAAEU,KAAa;IACpE,OAAQM,MAAMM,IAAI;QACd,KAAK;YACD,OAAOC,eAAeP,OAAsBhB;QAChD,KAAK;YACD,OAAOwB,eAAeR,OAAsBhB,QAAQU;QACxD,KAAK;QACL,KAAK;YACD,OAAOE,uBAAuBI,MAAMC,GAAG,EAAEjB;QAC7C;YACI,IAAI,YAAYgB,SAASS,MAAMC,OAAO,CAACV,MAAMF,MAAM,KAAKE,MAAMC,GAAG,KAAKU,WAAW;gBAC7E,OAAOzB,oBAAoBc,MAAMC,GAAG,EAAEjB,QAAQU;YAClD;YACA,OAAOE,uBAAuBI,MAAMC,GAAG,IAAI,IAAIjB;IACvD;AACJ;AAEA,SAASwB,eAAeR,KAAkB,EAAEhB,MAAc,EAAEU,KAAa;IACrE,MAAMP,SAAmB,EAAE;IAC3B,IAAIU,UAAU;IAEd,KAAK,MAAMe,QAAQZ,MAAMa,KAAK,CAAE;QAC5B,MAAMZ,MAAMW,KAAKX,GAAG;QACpB,MAAMC,YAAYL,UAAUI;QAC5B,IAAIC,UAAUb,MAAM,GAAG,KAAKM,mBAAmBO,WAAWlB,SAAS;YAC/Da,UAAUK;YACV;QACJ;QAEA,IAAIL,QAAQR,MAAM,GAAG,GAAG;YACpBF,OAAOG,IAAI,CAACO;YACZA,UAAU;QACd;QAEA,IAAIF,mBAAmBM,KAAKjB,SAAS;YACjCa,UAAUI;QACd,OAAO;YACHd,OAAOG,IAAI,IAAIJ,oBAAoBe,KAAKjB,QAAQU,QAAQ;QAC5D;IACJ;IAEA,IAAIG,QAAQR,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAACO;IACpC,OAAOV;AACX;AAEA,SAASoB,eAAeP,KAAkB,EAAEhB,MAAc;IACtD,MAAM8B,QAAQd,MAAMC,GAAG,CAACc,UAAU,CAAC,SAAS,QAAQ;IACpD,MAAMC,OAAOhB,MAAMgB,IAAI,GAAGhB,MAAMgB,IAAI,CAACC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG;IACtD,MAAMC,QAAQlB,MAAMT,IAAI,CAAC0B,KAAK,CAAC;IAC/B,MAAM9B,SAAmB,EAAE;IAC3B,IAAIgC,eAAyB,EAAE;IAE/B,MAAMC,cAAc,CAACC,YACjB,GAAGP,QAAQE,KAAK,EAAE,EAAEK,UAAUC,IAAI,CAAC,MAAM,EAAE,EAAER,MAAM,IAAI,CAAC;IAE5D,KAAK,MAAMS,QAAQL,MAAO;QACtB,MAAMM,iBAAiB;eAAIL;YAAcI;SAAK;QAC9C,IAAI5B,mBAAmByB,YAAYI,iBAAiBxC,SAAS;YACzDmC,eAAeK;YACf;QACJ;QAEA,IAAIL,aAAa9B,MAAM,GAAG,GAAG;YACzBF,OAAOG,IAAI,CAAC8B,YAAYD;YACxBA,eAAe,EAAE;QACrB;QAEA,IAAIxB,mBAAmByB,YAAY;YAACG;SAAK,GAAGvC,SAAS;YACjDmC,eAAe;gBAACI;aAAK;QACzB,OAAO;YACH,KAAK,MAAME,WAAWC,cAAcH,MAAMT,OAAOE,MAAMhC,QAAS;gBAC5DG,OAAOG,IAAI,CAAC8B,YAAY;oBAACK;iBAAQ;YACrC;QACJ;IACJ;IAEA,IAAIN,aAAa9B,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAAC8B,YAAYD;IACrD,OAAOhC;AACX;AAEA,SAASuC,cAAcH,IAAY,EAAET,KAAa,EAAEE,IAAY,EAAEhC,MAAc;IAC5E,MAAM2C,WAAqB,EAAE;IAC7B,IAAI9B,UAAU;IACd,MAAMuB,cAAc,CAACQ,QAA0B,GAAGd,QAAQE,KAAK,EAAE,EAAEY,MAAM,EAAE,EAAEd,MAAM,IAAI,CAAC;IAExF,KAAK,MAAMe,QAAQpB,MAAMqB,IAAI,CAACP,MAAO;QACjC,MAAMrB,YAAYL,UAAUgC;QAC5B,IAAIlC,mBAAmByB,YAAYlB,YAAYlB,SAAS;YACpDa,UAAUK;YACV;QACJ;QAEA,IAAIL,QAAQR,MAAM,GAAG,GAAG;YACpBsC,SAASrC,IAAI,CAACO;YACdA,UAAU;QACd;QAEA,IAAIF,mBAAmByB,YAAYS,OAAO7C,SAAS;YAC/Ca,UAAUgC;QACd,OAAO;YACHF,SAASrC,IAAI,CAACuC;QAClB;IACJ;IAEA,IAAIhC,QAAQR,MAAM,GAAG,GAAGsC,SAASrC,IAAI,CAACO;IACtC,OAAO8B;AACX;AAEA,SAAS/B,uBAAuBb,QAAgB,EAAEC,MAAc;IAC5D,IAAID,SAASM,MAAM,KAAK,GAAG,OAAO,EAAE;IACpC,IAAIM,mBAAmBZ,UAAUC,SAAS,OAAO;QAACD;KAAS;IAE3D,MAAMgD,eAAehD,SAASkC,KAAK,CAAC;IACpC,IAAIc,aAAa1C,MAAM,GAAG,GAAG;QACzB,OAAO2C,kBAAkBD,cAAc/C,QAAQY;IACnD;IAEA,MAAMqC,gBAAgBlD,SAASmD,KAAK,CAAC;IACrC,IAAID,iBAAiBA,cAAc5C,MAAM,GAAG,GAAG;QAC3C,OAAO2C,kBAAkBC,eAAejD,QAAQY;IACpD;IAEA,MAAMuC,YAAYpD,SAASmD,KAAK,CAAC;IACjC,IAAIC,aAAaA,UAAU9C,MAAM,GAAG,GAAG;QACnC,OAAO2C,kBAAkBG,WAAWnD,QAAQY;IAChD;IAEA,OAAOwC,iBAAiBrD,UAAUC;AACtC;AAEA,SAASgD,kBACLK,KAAe,EACfrD,MAAc,EACdsD,cAA0D;IAE1D,MAAMnD,SAAmB,EAAE;IAC3B,IAAIU,UAAU;IAEd,KAAK,MAAM0C,QAAQF,MAAO;QACtB,MAAMnC,YAAYL,UAAU0C;QAC5B,IAAI5C,mBAAmBO,WAAWlB,SAAS;YACvCa,UAAUK;YACV;QACJ;QAEA,IAAIL,QAAQR,MAAM,GAAG,GAAG;YACpBF,OAAOG,IAAI,CAACO;YACZA,UAAU;QACd;QAEA,IAAIF,mBAAmB4C,MAAMvD,SAAS;YAClCa,UAAU0C;QACd,OAAO;YACHpD,OAAOG,IAAI,IAAIgD,eAAeC,MAAMvD;QACxC;IACJ;IAEA,IAAIa,QAAQR,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAACO;IACpC,OAAOV;AACX;AAEA,SAASiD,iBAAiB7C,IAAY,EAAEP,MAAc;IAClD,MAAMG,SAAmB,EAAE;IAC3B,IAAIU,UAAU;IAEd,KAAK,MAAMgC,QAAQpB,MAAMqB,IAAI,CAACvC,MAAO;QACjC,MAAMW,YAAYL,UAAUgC;QAC5B,IAAIlC,mBAAmBO,WAAWlB,SAAS;YACvCa,UAAUK;YACV;QACJ;QAEA,IAAIL,QAAQR,MAAM,GAAG,GAAG;YACpBF,OAAOG,IAAI,CAACO;YACZA,UAAU;QACd;QAEA,IAAIF,mBAAmBkC,MAAM7C,SAAS;YAClCa,UAAUgC;QACd,OAAO;YACH1C,OAAOG,IAAI,CAACuC;QAChB;IACJ;IAEA,IAAIhC,QAAQR,MAAM,GAAG,GAAGF,OAAOG,IAAI,CAACO;IACpC,OAAOV;AACX;AAEA,SAASQ,mBAAmBZ,QAAgB,EAAEC,MAAc;IACxD,OAAOZ,uBAAuBW,UAAUM,MAAM,IAAIL;AACtD;AAEA;;;CAGC,GACD,OAAO,SAASS,aAAaF,IAAY,EAAEP,MAAc;IACrD,MAAMG,SAAmB,EAAE;IAC3B,IAAIqD,YAAYjD;IAEhB,MAAOiD,UAAUnD,MAAM,GAAG,EAAG;QACzB,IAAImD,UAAUnD,MAAM,IAAIL,QAAQ;YAC5BG,OAAOG,IAAI,CAACkD;YACZ;QACJ;QAEA,MAAMC,gBAAgBD,UAAUE,WAAW,CAAC,QAAQ1D,SAAS;QAC7D,MAAM2D,cAAcH,UAAUE,WAAW,CAAC,MAAM1D,SAAS;QAEzD,IAAI4D;QACJ,IAAIH,gBAAgB,GAAG;YACnBG,UAAUH,gBAAgB;QAC9B,OAAO,IAAIE,cAAc,GAAG;YACxBC,UAAUD,cAAc;QAC5B,OAAO;YACHC,UAAU5D;QACd;QAEAG,OAAOG,IAAI,CAACkD,UAAUK,KAAK,CAAC,GAAGD;QAC/BJ,YAAYA,UAAUK,KAAK,CAACD;IAChC;IAEA,OAAOzD;AACX"}
1
+ {"version":3,"sources":["../../../src/adapters/telegram/telegramMarkdown.ts"],"sourcesContent":["import { Marked, type Token, type Tokens } from \"marked\";\nimport { markdownToTelegramHtml } from \"./telegramHtml.js\";\n\nconst markdownLexer = new Marked();\n\nexport type TelegramMessageChunk = {\n text: string;\n html: boolean;\n};\n\nexport function isParseEntitiesError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const description = (error as { description?: string }).description;\n const message = (error as { message?: string }).message;\n return ((description ?? \"\") + (message ?? \"\")).includes(\"can't parse entities\");\n}\n\nexport function htmlToPlainText(html: string): string {\n return html\n .replace(/<[^>]+>/g, \"\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, \"&\");\n}\n\nexport function chunkMarkdownForTelegram(markdown: string, maxLen: number): TelegramMessageChunk[] {\n const markdownChunks = splitMarkdownSource(markdown, maxLen);\n const chunks: TelegramMessageChunk[] = [];\n\n for (const markdownChunk of markdownChunks) {\n const html = markdownToTelegramHtml(markdownChunk);\n if (html.length <= maxLen) {\n if (html.length > 0) chunks.push({ text: html, html: true });\n continue;\n }\n\n for (const plainChunk of chunkMessage(markdownChunk, maxLen)) {\n if (plainChunk.length > 0) chunks.push({ text: plainChunk, html: false });\n }\n }\n\n return chunks;\n}\n\nfunction splitMarkdownSource(markdown: string, maxLen: number, depth = 0): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n if (depth > 6) return splitPlainMarkdownText(markdown, maxLen);\n\n const chunks: string[] = [];\n let current = \"\";\n const tokens = markdownLexer.lexer(markdown);\n\n for (const token of tokens) {\n const raw = token.raw ?? \"\";\n if (raw.length === 0) continue;\n\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = \"\";\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitOversizedToken(token, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks.flatMap((chunk) =>\n renderedLengthFits(chunk, maxLen) ? [chunk] : splitPlainMarkdownText(chunk, maxLen),\n );\n}\n\nfunction splitOversizedToken(token: Token, maxLen: number, depth: number): string[] {\n switch (token.type) {\n case \"code\":\n return splitCodeToken(token as Tokens.Code, maxLen);\n case \"list\":\n return splitListToken(token as Tokens.List, maxLen, depth);\n case \"paragraph\":\n case \"text\":\n return splitPlainMarkdownText(token.raw, maxLen);\n default:\n if (\"tokens\" in token && Array.isArray(token.tokens) && token.raw !== undefined) {\n return splitMarkdownSource(token.raw, maxLen, depth);\n }\n return splitPlainMarkdownText(token.raw ?? \"\", maxLen);\n }\n}\n\nfunction splitListToken(token: Tokens.List, maxLen: number, depth: number): string[] {\n const chunks: string[] = [];\n let current = \"\";\n\n for (const item of token.items) {\n const raw = item.raw;\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = \"\";\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitMarkdownSource(raw, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitCodeToken(token: Tokens.Code, maxLen: number): string[] {\n const fence = token.raw.startsWith(\"~~~\") ? \"~~~\" : \"```\";\n const lang = token.lang ? token.lang.split(/\\s/)[0] : \"\";\n const lines = token.text.split(\"\\n\");\n const chunks: string[] = [];\n let currentLines: string[] = [];\n\n const renderFence = (codeLines: string[]): string =>\n `${fence}${lang}\\n${codeLines.join(\"\\n\")}\\n${fence}\\n\\n`;\n\n for (const line of lines) {\n const candidateLines = [...currentLines, line];\n if (renderedLengthFits(renderFence(candidateLines), maxLen)) {\n currentLines = candidateLines;\n continue;\n }\n\n if (currentLines.length > 0) {\n chunks.push(renderFence(currentLines));\n currentLines = [];\n }\n\n if (renderedLengthFits(renderFence([line]), maxLen)) {\n currentLines = [line];\n } else {\n for (const segment of splitCodeLine(line, fence, lang, maxLen)) {\n chunks.push(renderFence([segment]));\n }\n }\n }\n\n if (currentLines.length > 0) chunks.push(renderFence(currentLines));\n return chunks;\n}\n\nfunction splitCodeLine(line: string, fence: string, lang: string, maxLen: number): string[] {\n const segments: string[] = [];\n let current = \"\";\n const renderFence = (value: string): string => `${fence}${lang}\\n${value}\\n${fence}\\n\\n`;\n\n for (const char of Array.from(line)) {\n const candidate = current + char;\n if (renderedLengthFits(renderFence(candidate), maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n segments.push(current);\n current = \"\";\n }\n\n if (renderedLengthFits(renderFence(char), maxLen)) {\n current = char;\n } else {\n segments.push(char);\n }\n }\n\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction splitPlainMarkdownText(markdown: string, maxLen: number): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n\n const newlineUnits = markdown.split(/(?<=\\n)/u);\n if (newlineUnits.length > 1) {\n return packMarkdownUnits(newlineUnits, maxLen, splitPlainMarkdownText);\n }\n\n const sentenceUnits = markdown.match(/[^.!?]+[.!?]+(?:\\s+|$)|[^.!?]+$/gu);\n if (sentenceUnits && sentenceUnits.length > 1) {\n return packMarkdownUnits(sentenceUnits, maxLen, splitPlainMarkdownText);\n }\n\n const wordUnits = markdown.match(/\\S+\\s*/gu);\n if (wordUnits && wordUnits.length > 1) {\n return packMarkdownUnits(wordUnits, maxLen, splitPlainMarkdownText);\n }\n\n return splitByCodePoint(markdown, maxLen);\n}\n\nfunction packMarkdownUnits(\n units: string[],\n maxLen: number,\n splitOversized: (unit: string, maxLen: number) => string[],\n): string[] {\n const chunks: string[] = [];\n let current = \"\";\n\n for (const unit of units) {\n const candidate = current + unit;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = \"\";\n }\n\n if (renderedLengthFits(unit, maxLen)) {\n current = unit;\n } else {\n chunks.push(...splitOversized(unit, maxLen));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitByCodePoint(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let current = \"\";\n\n for (const char of Array.from(text)) {\n const candidate = current + char;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = \"\";\n }\n\n if (renderedLengthFits(char, maxLen)) {\n current = char;\n } else {\n chunks.push(char);\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction renderedLengthFits(markdown: string, maxLen: number): boolean {\n return markdownToTelegramHtml(markdown).length <= maxLen;\n}\n\n/**\n * Split text into chunks of maxLen or fewer characters. Prefers paragraph\n * boundaries (\\n\\n), then single newlines (\\n), then hard-splits at maxLen.\n */\nexport function chunkMessage(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLen) {\n chunks.push(remaining);\n break;\n }\n\n const lastParagraph = remaining.lastIndexOf(\"\\n\\n\", maxLen - 2);\n const lastNewline = remaining.lastIndexOf(\"\\n\", maxLen - 1);\n\n let splitAt: number;\n if (lastParagraph > 0) {\n splitAt = lastParagraph + 2;\n } else if (lastNewline > 0) {\n splitAt = lastNewline + 1;\n } else {\n splitAt = maxLen;\n }\n\n chunks.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n }\n\n return chunks;\n}\n"],"names":["Marked","markdownToTelegramHtml","markdownLexer","isParseEntitiesError","error","description","message","includes","htmlToPlainText","html","replace","chunkMarkdownForTelegram","markdown","maxLen","markdownChunks","splitMarkdownSource","chunks","markdownChunk","length","push","text","plainChunk","chunkMessage","depth","renderedLengthFits","splitPlainMarkdownText","current","tokens","lexer","token","raw","candidate","splitOversizedToken","flatMap","chunk","type","splitCodeToken","splitListToken","Array","isArray","undefined","item","items","fence","startsWith","lang","split","lines","currentLines","renderFence","codeLines","join","line","candidateLines","segment","splitCodeLine","segments","value","char","from","newlineUnits","packMarkdownUnits","sentenceUnits","match","wordUnits","splitByCodePoint","units","splitOversized","unit","remaining","lastParagraph","lastIndexOf","lastNewline","splitAt","slice"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { ChannelManager } from './ChannelManager.js';
2
- export { ChannelConfigRepository } from './ChannelConfigRepository.js';
3
- export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from './adapters/telegram/TelegramAdapter.js';
4
- export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials, } from './adapters/slack/SlackAdapter.js';
5
- export type { SlackIdentity } from './adapters/slack/SlackAdapter.js';
6
- export type { TelegramAdapterOptions } from './adapters/telegram/TelegramAdapter.js';
7
- export { isInteractiveChannelAdapter } from './adapters/ChannelAdapter.js';
8
- export type { ChannelAdapter, InteractiveChannelAdapter } from './adapters/ChannelAdapter.js';
9
- export type { IncomingMessage, MessageHandler, ChannelConfig, ChannelEntry, ChannelType, TelegramConfig, SlackConfig, SlackChannelEntry, SendMessageOptions, SentMessage, ChannelQuestion, ChannelQuestionOption, IncomingInteraction, InteractionHandler, InlineKeyboardButton, InlineKeyboard, IncomingCallback, CallbackHandler, } from './types.js';
1
+ export { ChannelManager } from "./ChannelManager.js";
2
+ export { ChannelConfigRepository } from "./ChannelConfigRepository.js";
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from "./adapters/telegram/TelegramAdapter.js";
4
+ export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials, } from "./adapters/slack/SlackAdapter.js";
5
+ export type { SlackIdentity } from "./adapters/slack/SlackAdapter.js";
6
+ export type { TelegramAdapterOptions } from "./adapters/telegram/TelegramAdapter.js";
7
+ export { isInteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
8
+ export type { ChannelAdapter, InteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
9
+ export type { IncomingMessage, MessageHandler, ChannelConfig, ChannelEntry, ChannelType, TelegramConfig, SlackConfig, SlackChannelEntry, SendMessageOptions, SentMessage, ChannelQuestion, ChannelQuestionOption, IncomingInteraction, InteractionHandler, InlineKeyboardButton, InlineKeyboard, IncomingCallback, CallbackHandler, } from "./types.js";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GAC3B,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAErF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,YAAY,EACR,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAClB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAErF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,YAAY,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- export { ChannelManager } from './ChannelManager.js';
2
- export { ChannelConfigRepository } from './ChannelConfigRepository.js';
3
- export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from './adapters/telegram/TelegramAdapter.js';
4
- export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials } from './adapters/slack/SlackAdapter.js';
5
- export { isInteractiveChannelAdapter } from './adapters/ChannelAdapter.js';
1
+ export { ChannelManager } from "./ChannelManager.js";
2
+ export { ChannelConfigRepository } from "./ChannelConfigRepository.js";
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from "./adapters/telegram/TelegramAdapter.js";
4
+ export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials } from "./adapters/slack/SlackAdapter.js";
5
+ export { isInteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
6
6
 
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { ChannelManager } from './ChannelManager.js';\nexport { ChannelConfigRepository } from './ChannelConfigRepository.js';\nexport { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from './adapters/telegram/TelegramAdapter.js';\nexport {\n SlackAdapter,\n SLACK_CHANNEL_TYPE,\n validateSlackAppToken,\n validateSlackCredentials,\n} from './adapters/slack/SlackAdapter.js';\nexport type { SlackIdentity } from './adapters/slack/SlackAdapter.js';\nexport type { TelegramAdapterOptions } from './adapters/telegram/TelegramAdapter.js';\n\nexport { isInteractiveChannelAdapter } from './adapters/ChannelAdapter.js';\nexport type { ChannelAdapter, InteractiveChannelAdapter } from './adapters/ChannelAdapter.js';\n\nexport type {\n IncomingMessage,\n MessageHandler,\n ChannelConfig,\n ChannelEntry,\n ChannelType,\n TelegramConfig,\n SlackConfig,\n SlackChannelEntry,\n SendMessageOptions,\n SentMessage,\n ChannelQuestion,\n ChannelQuestionOption,\n IncomingInteraction,\n InteractionHandler,\n InlineKeyboardButton,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from './types.js';\n"],"names":["ChannelManager","ChannelConfigRepository","TelegramAdapter","TELEGRAM_CHANNEL_TYPE","SlackAdapter","SLACK_CHANNEL_TYPE","validateSlackAppToken","validateSlackCredentials","isInteractiveChannelAdapter"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,uBAAuB,QAAQ,+BAA+B;AACvE,SAASC,eAAe,EAAEC,qBAAqB,QAAQ,yCAAyC;AAChG,SACIC,YAAY,EACZC,kBAAkB,EAClBC,qBAAqB,EACrBC,wBAAwB,QACrB,mCAAmC;AAI1C,SAASC,2BAA2B,QAAQ,+BAA+B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { ChannelManager } from \"./ChannelManager.js\";\nexport { ChannelConfigRepository } from \"./ChannelConfigRepository.js\";\nexport { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from \"./adapters/telegram/TelegramAdapter.js\";\nexport {\n SlackAdapter,\n SLACK_CHANNEL_TYPE,\n validateSlackAppToken,\n validateSlackCredentials,\n} from \"./adapters/slack/SlackAdapter.js\";\nexport type { SlackIdentity } from \"./adapters/slack/SlackAdapter.js\";\nexport type { TelegramAdapterOptions } from \"./adapters/telegram/TelegramAdapter.js\";\n\nexport { isInteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\nexport type { ChannelAdapter, InteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\n\nexport type {\n IncomingMessage,\n MessageHandler,\n ChannelConfig,\n ChannelEntry,\n ChannelType,\n TelegramConfig,\n SlackConfig,\n SlackChannelEntry,\n SendMessageOptions,\n SentMessage,\n ChannelQuestion,\n ChannelQuestionOption,\n IncomingInteraction,\n InteractionHandler,\n InlineKeyboardButton,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from \"./types.js\";\n"],"names":["ChannelManager","ChannelConfigRepository","TelegramAdapter","TELEGRAM_CHANNEL_TYPE","SlackAdapter","SLACK_CHANNEL_TYPE","validateSlackAppToken","validateSlackCredentials","isInteractiveChannelAdapter"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,uBAAuB,QAAQ,+BAA+B;AACvE,SAASC,eAAe,EAAEC,qBAAqB,QAAQ,yCAAyC;AAChG,SACEC,YAAY,EACZC,kBAAkB,EAClBC,qBAAqB,EACrBC,wBAAwB,QACnB,mCAAmC;AAI1C,SAASC,2BAA2B,QAAQ,+BAA+B"}
package/dist/types.d.ts CHANGED
@@ -32,22 +32,22 @@ interface BaseChannelEntry {
32
32
  createdAt: string;
33
33
  }
34
34
  export interface TelegramChannelEntry extends BaseChannelEntry {
35
- type: 'telegram';
35
+ type: "telegram";
36
36
  config: TelegramConfig;
37
37
  }
38
38
  export interface SlackChannelEntry extends BaseChannelEntry {
39
- type: 'slack';
39
+ type: "slack";
40
40
  config: SlackConfig;
41
41
  }
42
42
  export interface OtherChannelEntry extends BaseChannelEntry {
43
- type: Exclude<ChannelType, 'telegram' | 'slack'>;
43
+ type: Exclude<ChannelType, "telegram" | "slack">;
44
44
  config: Record<string, unknown>;
45
45
  }
46
46
  export type ChannelEntry = TelegramChannelEntry | SlackChannelEntry | OtherChannelEntry;
47
47
  /**
48
48
  * Supported channel types.
49
49
  */
50
- export type ChannelType = 'telegram' | 'slack' | 'whatsapp';
50
+ export type ChannelType = "telegram" | "slack" | "whatsapp";
51
51
  /**
52
52
  * Telegram-specific configuration.
53
53
  */
@@ -63,8 +63,8 @@ export interface SlackConfig {
63
63
  botUserId: string;
64
64
  workspaceId: string;
65
65
  workspaceName?: string;
66
- transport: 'socket-mode';
67
- audience: 'dm';
66
+ transport: "socket-mode";
67
+ audience: "dm";
68
68
  }
69
69
  export declare function isSlackEntry(entry: ChannelEntry): entry is SlackChannelEntry;
70
70
  export interface SendMessageOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * An incoming message from a messaging platform.
3
3
  * Generic — no agent-specific concepts.
4
4
  */ export function isSlackEntry(entry) {
5
- return entry.type === 'slack';
5
+ return entry.type === "slack";
6
6
  }
7
7
 
8
8
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * An incoming message from a messaging platform.\n * Generic — no agent-specific concepts.\n */\nexport interface IncomingMessage {\n channelType: string;\n chatId: string;\n userId: string;\n text: string;\n timestamp: Date;\n messageId?: string;\n threadId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Handler function provided by the consumer (e.g., CLI).\n * Fire-and-forget — returns void. Responses are sent separately via sendMessage().\n */\nexport type MessageHandler = (message: IncomingMessage) => Promise<void>;\n\n/**\n * Root configuration for all channels.\n */\nexport interface ChannelConfig {\n channels: Record<string, ChannelEntry>;\n}\n\n/**\n * Configuration entry for a single channel.\n */\ninterface BaseChannelEntry {\n enabled: boolean;\n createdAt: string;\n}\n\nexport interface TelegramChannelEntry extends BaseChannelEntry {\n type: 'telegram';\n config: TelegramConfig;\n}\n\nexport interface SlackChannelEntry extends BaseChannelEntry {\n type: 'slack';\n config: SlackConfig;\n}\n\nexport interface OtherChannelEntry extends BaseChannelEntry {\n type: Exclude<ChannelType, 'telegram' | 'slack'>;\n config: Record<string, unknown>;\n}\n\nexport type ChannelEntry = TelegramChannelEntry | SlackChannelEntry | OtherChannelEntry;\n\n/**\n * Supported channel types.\n */\nexport type ChannelType = 'telegram' | 'slack' | 'whatsapp';\n\n/**\n * Telegram-specific configuration.\n */\nexport interface TelegramConfig {\n botToken: string;\n botUsername: string;\n authorizedChatId?: number;\n}\n\nexport interface SlackConfig {\n appToken: string;\n botToken: string;\n appId?: string;\n botUserId: string;\n workspaceId: string;\n workspaceName?: string;\n transport: 'socket-mode';\n audience: 'dm';\n}\n\nexport function isSlackEntry(entry: ChannelEntry): entry is SlackChannelEntry {\n return entry.type === 'slack';\n}\n\nexport interface SendMessageOptions {\n threadId?: string;\n}\n\nexport interface SentMessage {\n messageId: string;\n threadId?: string;\n}\n\nexport interface ChannelQuestionOption {\n label: string;\n description?: string;\n value: string;\n}\n\nexport interface ChannelQuestion {\n id: string;\n question: string;\n header?: string;\n options: ChannelQuestionOption[];\n allowSkip: boolean;\n}\n\nexport interface IncomingInteraction {\n channelType: string;\n chatId: string;\n userId: string;\n interactionId: string;\n messageId: string;\n actionId: string;\n value: string;\n workspaceId?: string;\n timestamp: Date;\n}\n\nexport type InteractionHandler = (interaction: IncomingInteraction) => Promise<void>;\n\n/**\n * A single button in a Telegram-style inline keyboard.\n */\nexport interface InlineKeyboardButton {\n text: string;\n callbackData: string;\n}\n\n/**\n * An inline keyboard layout: rows of buttons.\n */\nexport type InlineKeyboard = InlineKeyboardButton[][];\n\n/**\n * An inline-keyboard tap delivered as a callback_query.\n */\nexport interface IncomingCallback {\n channelType: string;\n chatId: string;\n userId: string;\n messageId: number;\n callbackData: string;\n callbackQueryId: string;\n timestamp: Date;\n}\n\n/**\n * Handler for inline-keyboard taps.\n */\nexport type CallbackHandler = (callback: IncomingCallback) => Promise<void>;\n"],"names":["isSlackEntry","entry","type"],"mappings":"AAAA;;;CAGC,GA4ED,OAAO,SAASA,aAAaC,KAAmB;IAC5C,OAAOA,MAAMC,IAAI,KAAK;AAC1B"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * An incoming message from a messaging platform.\n * Generic — no agent-specific concepts.\n */\nexport interface IncomingMessage {\n channelType: string;\n chatId: string;\n userId: string;\n text: string;\n timestamp: Date;\n messageId?: string;\n threadId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Handler function provided by the consumer (e.g., CLI).\n * Fire-and-forget — returns void. Responses are sent separately via sendMessage().\n */\nexport type MessageHandler = (message: IncomingMessage) => Promise<void>;\n\n/**\n * Root configuration for all channels.\n */\nexport interface ChannelConfig {\n channels: Record<string, ChannelEntry>;\n}\n\n/**\n * Configuration entry for a single channel.\n */\ninterface BaseChannelEntry {\n enabled: boolean;\n createdAt: string;\n}\n\nexport interface TelegramChannelEntry extends BaseChannelEntry {\n type: \"telegram\";\n config: TelegramConfig;\n}\n\nexport interface SlackChannelEntry extends BaseChannelEntry {\n type: \"slack\";\n config: SlackConfig;\n}\n\nexport interface OtherChannelEntry extends BaseChannelEntry {\n type: Exclude<ChannelType, \"telegram\" | \"slack\">;\n config: Record<string, unknown>;\n}\n\nexport type ChannelEntry = TelegramChannelEntry | SlackChannelEntry | OtherChannelEntry;\n\n/**\n * Supported channel types.\n */\nexport type ChannelType = \"telegram\" | \"slack\" | \"whatsapp\";\n\n/**\n * Telegram-specific configuration.\n */\nexport interface TelegramConfig {\n botToken: string;\n botUsername: string;\n authorizedChatId?: number;\n}\n\nexport interface SlackConfig {\n appToken: string;\n botToken: string;\n appId?: string;\n botUserId: string;\n workspaceId: string;\n workspaceName?: string;\n transport: \"socket-mode\";\n audience: \"dm\";\n}\n\nexport function isSlackEntry(entry: ChannelEntry): entry is SlackChannelEntry {\n return entry.type === \"slack\";\n}\n\nexport interface SendMessageOptions {\n threadId?: string;\n}\n\nexport interface SentMessage {\n messageId: string;\n threadId?: string;\n}\n\nexport interface ChannelQuestionOption {\n label: string;\n description?: string;\n value: string;\n}\n\nexport interface ChannelQuestion {\n id: string;\n question: string;\n header?: string;\n options: ChannelQuestionOption[];\n allowSkip: boolean;\n}\n\nexport interface IncomingInteraction {\n channelType: string;\n chatId: string;\n userId: string;\n interactionId: string;\n messageId: string;\n actionId: string;\n value: string;\n workspaceId?: string;\n timestamp: Date;\n}\n\nexport type InteractionHandler = (interaction: IncomingInteraction) => Promise<void>;\n\n/**\n * A single button in a Telegram-style inline keyboard.\n */\nexport interface InlineKeyboardButton {\n text: string;\n callbackData: string;\n}\n\n/**\n * An inline keyboard layout: rows of buttons.\n */\nexport type InlineKeyboard = InlineKeyboardButton[][];\n\n/**\n * An inline-keyboard tap delivered as a callback_query.\n */\nexport interface IncomingCallback {\n channelType: string;\n chatId: string;\n userId: string;\n messageId: number;\n callbackData: string;\n callbackQueryId: string;\n timestamp: Date;\n}\n\n/**\n * Handler for inline-keyboard taps.\n */\nexport type CallbackHandler = (callback: IncomingCallback) => Promise<void>;\n"],"names":["isSlackEntry","entry","type"],"mappings":"AAAA;;;CAGC,GA4ED,OAAO,SAASA,aAAaC,KAAmB;IAC9C,OAAOA,MAAMC,IAAI,KAAK;AACxB"}
package/package.json CHANGED
@@ -1,11 +1,22 @@
1
1
  {
2
2
  "name": "@ai-devkit/channel-connector",
3
- "nx": {
4
- "name": "channel-connector"
3
+ "version": "0.13.4",
4
+ "description": "Generic messaging bridge for connecting to external communication platforms",
5
+ "keywords": [
6
+ "ai",
7
+ "channel",
8
+ "connector",
9
+ "messaging",
10
+ "telegram"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/codeaholicguy/ai-devkit.git",
17
+ "directory": "packages/channel-connector"
5
18
  },
6
- "version": "0.13.2",
7
19
  "type": "module",
8
- "description": "Generic messaging bridge for connecting to external communication platforms",
9
20
  "main": "dist/index.js",
10
21
  "types": "dist/index.d.ts",
11
22
  "exports": {
@@ -20,24 +31,12 @@
20
31
  "test": "vitest run",
21
32
  "test:watch": "vitest",
22
33
  "test:coverage": "vitest run --coverage",
23
- "lint": "eslint src --ext .ts",
34
+ "lint": "oxlint src",
35
+ "fmt": "oxfmt",
36
+ "fmt:check": "oxfmt --check",
24
37
  "typecheck": "tsc --noEmit",
25
38
  "clean": "rm -rf dist"
26
39
  },
27
- "keywords": [
28
- "ai",
29
- "channel",
30
- "connector",
31
- "telegram",
32
- "messaging"
33
- ],
34
- "author": "",
35
- "license": "MIT",
36
- "repository": {
37
- "type": "git",
38
- "url": "git+https://github.com/codeaholicguy/ai-devkit.git",
39
- "directory": "packages/channel-connector"
40
- },
41
40
  "dependencies": {
42
41
  "@slack/socket-mode": "^3.0.0",
43
42
  "@slack/web-api": "^8.0.0",
@@ -49,14 +48,14 @@
49
48
  "@swc/cli": "^0.8.1",
50
49
  "@swc/core": "^1.10.0",
51
50
  "@types/node": "^20.11.5",
52
- "@typescript-eslint/eslint-plugin": "^8.60.1",
53
- "@typescript-eslint/parser": "^8.60.1",
54
51
  "@vitest/coverage-v8": "^4.1.8",
55
- "eslint": "^8.56.0",
56
52
  "typescript": "^5.5.0",
57
53
  "vitest": "^4.1.8"
58
54
  },
59
55
  "engines": {
60
56
  "node": ">=20.20.0"
57
+ },
58
+ "nx": {
59
+ "name": "channel-connector"
61
60
  }
62
61
  }
package/vitest.config.ts CHANGED
@@ -1,20 +1,20 @@
1
- import { defineConfig } from 'vitest/config';
1
+ import { defineConfig } from "vitest/config";
2
2
 
3
3
  export default defineConfig({
4
- test: {
5
- globals: true,
6
- environment: 'node',
7
- include: ['src/**/__tests__/**/*.test.ts', 'src/**/*.test.ts'],
8
- coverage: {
9
- provider: 'v8',
10
- include: ['src/**/*.ts'],
11
- exclude: ['src/index.ts', 'src/**/*.d.ts', 'src/types.ts'],
12
- thresholds: {
13
- branches: 75,
14
- functions: 75,
15
- lines: 75,
16
- statements: 75,
17
- },
18
- },
4
+ test: {
5
+ globals: true,
6
+ environment: "node",
7
+ include: ["src/**/__tests__/**/*.test.ts", "src/**/*.test.ts"],
8
+ coverage: {
9
+ provider: "v8",
10
+ include: ["src/**/*.ts"],
11
+ exclude: ["src/index.ts", "src/**/*.d.ts", "src/types.ts"],
12
+ thresholds: {
13
+ branches: 75,
14
+ functions: 75,
15
+ lines: 75,
16
+ statements: 75,
17
+ },
19
18
  },
19
+ },
20
20
  });