@skaile/workspaces 1.14.1 → 1.15.1

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 (193) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/NOTICE +13 -0
  3. package/dist/app-sdk/index.js +1 -1
  4. package/dist/{asset-feeds-ZQLJ2DCP.js → asset-feeds-MWEMXMZA.js} +5 -5
  5. package/dist/{asset-feeds-ZQLJ2DCP.js.map → asset-feeds-MWEMXMZA.js.map} +1 -1
  6. package/dist/asset-manager/index.js +5 -5
  7. package/dist/asset-manager/installer.js +1 -1
  8. package/dist/bridge/drivers/claude-sdk.js +31 -26
  9. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  10. package/dist/bridge/drivers/codex.js +1 -1
  11. package/dist/bridge/drivers/continue.js +2 -2
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +3 -3
  14. package/dist/bridge/drivers/goose.js +2 -2
  15. package/dist/bridge/drivers/omp.js +1 -1
  16. package/dist/bridge/drivers/opencode.js +2 -2
  17. package/dist/bridge/drivers/qwen.js +3 -3
  18. package/dist/bridge/index.js +2 -2
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts +12 -56
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  21. package/dist/channels/adapters/msteams/activity.d.ts +70 -0
  22. package/dist/channels/adapters/msteams/activity.d.ts.map +1 -0
  23. package/dist/channels/adapters/msteams/client.d.ts +46 -0
  24. package/dist/channels/adapters/msteams/client.d.ts.map +1 -0
  25. package/dist/channels/adapters/msteams/index.d.ts +81 -0
  26. package/dist/channels/adapters/msteams/index.d.ts.map +1 -0
  27. package/dist/channels/adapters/msteams/jwt.d.ts +27 -0
  28. package/dist/channels/adapters/msteams/jwt.d.ts.map +1 -0
  29. package/dist/channels/adapters/msteams.d.ts +2 -0
  30. package/dist/channels/adapters/msteams.js +595 -0
  31. package/dist/channels/adapters/msteams.js.map +1 -0
  32. package/dist/channels/index.d.ts +2 -0
  33. package/dist/channels/index.js +1069 -0
  34. package/dist/channels/index.js.map +1 -0
  35. package/dist/channels/src/adapter.d.ts +54 -0
  36. package/dist/channels/src/adapter.d.ts.map +1 -0
  37. package/dist/channels/src/dedupe.d.ts +67 -0
  38. package/dist/channels/src/dedupe.d.ts.map +1 -0
  39. package/dist/channels/src/egress/output-mirror.d.ts +63 -0
  40. package/dist/channels/src/egress/output-mirror.d.ts.map +1 -0
  41. package/dist/channels/src/egress/vendor/auto-close-streaming.d.ts +26 -0
  42. package/dist/channels/src/egress/vendor/auto-close-streaming.d.ts.map +1 -0
  43. package/dist/channels/src/egress/vendor/chunked-message-stream.d.ts +79 -0
  44. package/dist/channels/src/egress/vendor/chunked-message-stream.d.ts.map +1 -0
  45. package/dist/channels/src/egress/vendor/markdown-to-mrkdwn.d.ts +21 -0
  46. package/dist/channels/src/egress/vendor/markdown-to-mrkdwn.d.ts.map +1 -0
  47. package/dist/channels/src/egress/vendor/message-stream.d.ts +57 -0
  48. package/dist/channels/src/egress/vendor/message-stream.d.ts.map +1 -0
  49. package/dist/channels/src/engine.d.ts +125 -0
  50. package/dist/channels/src/engine.d.ts.map +1 -0
  51. package/dist/channels/src/format/adaptive-card.d.ts +17 -0
  52. package/dist/channels/src/format/adaptive-card.d.ts.map +1 -0
  53. package/dist/channels/src/format/mrkdwn.d.ts +4 -0
  54. package/dist/channels/src/format/mrkdwn.d.ts.map +1 -0
  55. package/dist/channels/src/format/types.d.ts +9 -0
  56. package/dist/channels/src/format/types.d.ts.map +1 -0
  57. package/dist/channels/src/index.d.ts +17 -0
  58. package/dist/channels/src/index.d.ts.map +1 -0
  59. package/dist/channels/src/mention/lookup-tool.d.ts +23 -0
  60. package/dist/channels/src/mention/lookup-tool.d.ts.map +1 -0
  61. package/dist/channels/src/mention/normalize.d.ts +27 -0
  62. package/dist/channels/src/mention/normalize.d.ts.map +1 -0
  63. package/dist/channels/src/mention/render.d.ts +10 -0
  64. package/dist/channels/src/mention/render.d.ts.map +1 -0
  65. package/dist/channels/src/ports.d.ts +71 -0
  66. package/dist/channels/src/ports.d.ts.map +1 -0
  67. package/dist/channels/src/types.d.ts +169 -0
  68. package/dist/channels/src/types.d.ts.map +1 -0
  69. package/dist/{chunk-A7GDV5BV.js → chunk-2BQBWWFX.js} +2 -2
  70. package/dist/{chunk-A7GDV5BV.js.map → chunk-2BQBWWFX.js.map} +1 -1
  71. package/dist/{chunk-MWE7DEGC.js → chunk-344DEXZS.js} +3 -3
  72. package/dist/{chunk-MWE7DEGC.js.map → chunk-344DEXZS.js.map} +1 -1
  73. package/dist/{chunk-T2H2ZCU4.js → chunk-73HV7RV3.js} +3 -3
  74. package/dist/{chunk-T2H2ZCU4.js.map → chunk-73HV7RV3.js.map} +1 -1
  75. package/dist/{chunk-HLIN4HRK.js → chunk-ACWCVB5Q.js} +2 -2
  76. package/dist/{chunk-HLIN4HRK.js.map → chunk-ACWCVB5Q.js.map} +1 -1
  77. package/dist/{chunk-P5VLR3L7.js → chunk-BI2NKPA4.js} +8 -4
  78. package/dist/chunk-BI2NKPA4.js.map +1 -0
  79. package/dist/{chunk-4RI4TNMO.js → chunk-DB264AVQ.js} +2 -2
  80. package/dist/{chunk-4RI4TNMO.js.map → chunk-DB264AVQ.js.map} +1 -1
  81. package/dist/{chunk-IIGWJE5T.js → chunk-DPUZJI45.js} +3 -3
  82. package/dist/{chunk-IIGWJE5T.js.map → chunk-DPUZJI45.js.map} +1 -1
  83. package/dist/{chunk-ZWPXSHMW.js → chunk-EKGB4ZWR.js} +336 -100
  84. package/dist/chunk-EKGB4ZWR.js.map +1 -0
  85. package/dist/chunk-F2IBDVBP.js +72 -0
  86. package/dist/chunk-F2IBDVBP.js.map +1 -0
  87. package/dist/{chunk-G73FOLLO.js → chunk-M5GJT3D7.js} +3 -3
  88. package/dist/{chunk-G73FOLLO.js.map → chunk-M5GJT3D7.js.map} +1 -1
  89. package/dist/{chunk-CS6NFRNQ.js → chunk-MJEUK6VJ.js} +2 -2
  90. package/dist/{chunk-CS6NFRNQ.js.map → chunk-MJEUK6VJ.js.map} +1 -1
  91. package/dist/{chunk-NIZNN42B.js → chunk-MNKUZUN2.js} +3 -3
  92. package/dist/{chunk-NIZNN42B.js.map → chunk-MNKUZUN2.js.map} +1 -1
  93. package/dist/{chunk-AF2NTM4B.js → chunk-NRXVS7E4.js} +6 -6
  94. package/dist/{chunk-AF2NTM4B.js.map → chunk-NRXVS7E4.js.map} +1 -1
  95. package/dist/{chunk-CC6LFFTI.js → chunk-O5VCUU6D.js} +4 -4
  96. package/dist/{chunk-CC6LFFTI.js.map → chunk-O5VCUU6D.js.map} +1 -1
  97. package/dist/{chunk-UDUFMVJD.js → chunk-RADBQ5XJ.js} +7 -7
  98. package/dist/{chunk-UDUFMVJD.js.map → chunk-RADBQ5XJ.js.map} +1 -1
  99. package/dist/{chunk-TSB46BHR.js → chunk-RDE43ORT.js} +4 -4
  100. package/dist/{chunk-TSB46BHR.js.map → chunk-RDE43ORT.js.map} +1 -1
  101. package/dist/{chunk-KECY74AL.js → chunk-SRWIVMJI.js} +4 -4
  102. package/dist/{chunk-KECY74AL.js.map → chunk-SRWIVMJI.js.map} +1 -1
  103. package/dist/{chunk-VK24PIAB.js → chunk-TFIFNDT2.js} +3 -3
  104. package/dist/{chunk-VK24PIAB.js.map → chunk-TFIFNDT2.js.map} +1 -1
  105. package/dist/{chunk-BIAA3N2A.js → chunk-Z6NGK5YC.js} +3 -3
  106. package/dist/{chunk-BIAA3N2A.js.map → chunk-Z6NGK5YC.js.map} +1 -1
  107. package/dist/cli/index.js +41 -41
  108. package/dist/connectors/config.js +1 -1
  109. package/dist/connectors/index.js +1 -1
  110. package/dist/core/index.js +1 -1
  111. package/dist/deploy/index.js +1 -1
  112. package/dist/{ensure-sources-O7X3LYLG.js → ensure-sources-QGL44IRI.js} +8 -8
  113. package/dist/{ensure-sources-O7X3LYLG.js.map → ensure-sources-QGL44IRI.js.map} +1 -1
  114. package/dist/factory-assets/connectors/box.js +1 -1
  115. package/dist/factory-assets/connectors/deploy.js +1 -1
  116. package/dist/factory-assets/connectors/devserver.js +1 -1
  117. package/dist/factory-assets/connectors/flow/adapter.js +1 -1
  118. package/dist/factory-assets/connectors/flow/engine.js +1 -1
  119. package/dist/factory-assets/connectors/flow/run-flow.js +2 -2
  120. package/dist/factory-assets/connectors/flow.js +1 -1
  121. package/dist/factory-assets/connectors/git.js +1 -1
  122. package/dist/factory-assets/connectors/gmail.js +1 -1
  123. package/dist/factory-assets/connectors/googledrive.js +1 -1
  124. package/dist/factory-assets/connectors/local.js +1 -1
  125. package/dist/factory-assets/connectors/mattermost.js +1 -1
  126. package/dist/factory-assets/connectors/memory.js +1 -1
  127. package/dist/factory-assets/connectors/minio.js +1 -1
  128. package/dist/factory-assets/connectors/postgres.js +1 -1
  129. package/dist/factory-assets/connectors/s3.js +1 -1
  130. package/dist/factory-assets/connectors/sharepoint.js +1 -1
  131. package/dist/factory-assets/connectors/sqlite.js +1 -1
  132. package/dist/factory-assets/connectors/static-server.js +1 -1
  133. package/dist/factory-assets/connectors/tunnel.js +1 -1
  134. package/dist/factory-assets/connectors/webdav.js +1 -1
  135. package/dist/factory-assets/connectors/xstate-store.js +1 -1
  136. package/dist/factory-assets/connectors/xstate.js +1 -1
  137. package/dist/{flows-TIUWM7SZ.js → flows-FHWBCLXF.js} +3 -3
  138. package/dist/{flows-TIUWM7SZ.js.map → flows-FHWBCLXF.js.map} +1 -1
  139. package/dist/{helpers-DNTGJSA5.js → helpers-FMWODXTW.js} +8 -8
  140. package/dist/{helpers-DNTGJSA5.js.map → helpers-FMWODXTW.js.map} +1 -1
  141. package/dist/library/index.js +4 -4
  142. package/dist/library/install.js +1 -1
  143. package/dist/{library-publish-XKQN6RTR.js → library-publish-7YDHQGBN.js} +10 -10
  144. package/dist/{library-publish-XKQN6RTR.js.map → library-publish-7YDHQGBN.js.map} +1 -1
  145. package/dist/{open-library-2BWIUK4F.js → open-library-O6T3ELPK.js} +9 -9
  146. package/dist/{open-library-2BWIUK4F.js.map → open-library-O6T3ELPK.js.map} +1 -1
  147. package/dist/{paths-KOKCMBL5.js → paths-5QJJBAND.js} +7 -7
  148. package/dist/{paths-KOKCMBL5.js.map → paths-5QJJBAND.js.map} +1 -1
  149. package/dist/{plugin-store-QMJ2B3VM.js → plugin-store-ZBJZ7F6D.js} +3 -3
  150. package/dist/{plugin-store-QMJ2B3VM.js.map → plugin-store-ZBJZ7F6D.js.map} +1 -1
  151. package/dist/{project-4NPDM7R3.js → project-HAMLHLD5.js} +9 -9
  152. package/dist/{project-4NPDM7R3.js.map → project-HAMLHLD5.js.map} +1 -1
  153. package/dist/runner/index.js +8 -8
  154. package/dist/runner/src/serve.d.ts +138 -1
  155. package/dist/runner/src/serve.d.ts.map +1 -1
  156. package/dist/sdk/asset-manager.js +5 -5
  157. package/dist/sdk/bridge.js +2 -2
  158. package/dist/sdk/core.js +1 -1
  159. package/dist/sdk/flow.js +1 -1
  160. package/dist/sdk/index.js +8 -8
  161. package/dist/sdk/runner.js +8 -8
  162. package/dist/sdk/session.js +2 -2
  163. package/dist/sdk/transport/ws.js +1 -1
  164. package/dist/sdk/transport.js +1 -1
  165. package/dist/sdk/types.js +1 -1
  166. package/dist/session/index.js +2 -2
  167. package/dist/session/src/dispatcher.d.ts.map +1 -1
  168. package/dist/{setup-TNHKXCBL.js → setup-WJPNUE32.js} +5 -5
  169. package/dist/{setup-TNHKXCBL.js.map → setup-WJPNUE32.js.map} +1 -1
  170. package/dist/{source-HVMQJZU7.js → source-ITDH4367.js} +10 -10
  171. package/dist/{source-HVMQJZU7.js.map → source-ITDH4367.js.map} +1 -1
  172. package/dist/{source-manifest-publish-JN62UMZD.js → source-manifest-publish-RMHC7R6M.js} +11 -11
  173. package/dist/{source-manifest-publish-JN62UMZD.js.map → source-manifest-publish-RMHC7R6M.js.map} +1 -1
  174. package/dist/transport/index.js +1 -1
  175. package/dist/transport/ws.js +1 -1
  176. package/dist/tui/index.js +8 -8
  177. package/dist/types/index.js +1 -1
  178. package/dist/types/src/events.d.ts +74 -1
  179. package/dist/types/src/events.d.ts.map +1 -1
  180. package/dist/types/src/flow.d.ts +34 -0
  181. package/dist/types/src/flow.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -2
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/protocol.d.ts +6 -0
  185. package/dist/types/src/protocol.d.ts.map +1 -1
  186. package/dist/types/src/version.d.ts +23 -1
  187. package/dist/types/src/version.d.ts.map +1 -1
  188. package/dist/workspace-plugin/adapters/mcp.js +1 -1
  189. package/dist/workspace-plugin/adapters/omp.js +3 -3
  190. package/dist/workspace-plugin/index.js +1 -1
  191. package/package.json +15 -2
  192. package/dist/chunk-P5VLR3L7.js.map +0 -1
  193. package/dist/chunk-ZWPXSHMW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../channels/adapters/msteams/activity.ts","../../../channels/adapters/msteams/client.ts","../../../channels/adapters/msteams/jwt.ts","../../../channels/adapters/msteams/index.ts"],"names":[],"mappings":"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","file":"msteams.js","sourcesContent":["/**\n * Minimal hand-rolled Bot Framework activity types and their normalization\n * into the channels core's {@link ChannelMessage} (spec §7.1.2). No botbuilder:\n * only the fields the adapter actually reads are typed.\n */\nimport type { IdentityPort } from \"../../src/ports.js\";\nimport type { ChannelMentionEntity } from \"../../src/mention/normalize.js\";\nimport { normalizeMentions } from \"../../src/mention/normalize.js\";\nimport type { ChannelActor, ChannelMessage, ConversationKey, MessageRef } from \"../../src/types.js\";\nimport { makeConversationKey } from \"../../src/types.js\";\n\n/** The Teams `conversation.id` thread separator: `<channelId>;messageid=<rootId>`. */\nconst MESSAGE_ID_SEPARATOR = \";messageid=\";\n\n/** A Bot Framework activity, reduced to the fields the Teams adapter consumes. */\nexport type TeamsActivity = {\n /** \"message\", \"messageReaction\", \"conversationUpdate\", … */\n type: string;\n id: string;\n timestamp?: string;\n serviceUrl: string;\n /** Always \"msteams\" for Teams traffic. */\n channelId: string;\n from: { id: string; name?: string; aadObjectId?: string };\n conversation: { id: string; tenantId?: string; conversationType?: string };\n /** The bot the activity was addressed to. */\n recipient: { id: string; name?: string };\n text?: string;\n entities?: Array<{ type: string; mentioned?: { id: string; name?: string }; text?: string }>;\n replyToId?: string;\n /** Action.Submit payload, e.g. `{ option }` from a question card. */\n value?: unknown;\n channelData?: { tenant?: { id: string } };\n};\n\n/**\n * `\"19:x@thread;messageid=123\"` → key `msteams:19:x@thread/123`; no messageid →\n * channel-level key.\n */\nexport function conversationKeyFromActivity(a: TeamsActivity): ConversationKey {\n const sep = a.conversation.id.indexOf(MESSAGE_ID_SEPARATOR);\n if (sep === -1) return makeConversationKey(\"msteams\", a.conversation.id);\n return makeConversationKey(\n \"msteams\",\n a.conversation.id.slice(0, sep),\n a.conversation.id.slice(sep + MESSAGE_ID_SEPARATOR.length),\n );\n}\n\n/** Teams tenant id — `conversation.tenantId` with the channelData fallback. */\nexport function tenantIdOfActivity(a: TeamsActivity): string | undefined {\n return a.conversation.tenantId ?? a.channelData?.tenant?.id;\n}\n\n/** The sending user as a {@link ChannelActor} (AAD object id preferred as externalId). */\nexport function actorOfActivity(a: TeamsActivity): ChannelActor {\n return {\n platform: \"msteams\",\n externalId: a.from.aadObjectId ?? a.from.id,\n displayName: a.from.name ?? \"\",\n tenantId: tenantIdOfActivity(a),\n };\n}\n\n/**\n * Replaces each mention entity's `<at>…</at>` token in the text with its\n * display name and records the entity's position in the stripped text — so\n * downstream Mention offsets stay meaningful.\n */\nfunction stripMentionTokens(a: TeamsActivity): {\n text: string;\n entities: ChannelMentionEntity[];\n} {\n let text = a.text ?? \"\";\n const entities: ChannelMentionEntity[] = [];\n for (const e of a.entities ?? []) {\n if (e.type !== \"mention\" || !e.mentioned) continue;\n const displayName = e.mentioned.name ?? \"\";\n let offset = 0;\n if (e.text) {\n const at = text.indexOf(e.text);\n if (at !== -1) {\n text = text.slice(0, at) + displayName + text.slice(at + e.text.length);\n offset = at;\n }\n }\n entities.push({\n externalId: e.mentioned.id,\n displayName,\n isBot: e.mentioned.id === a.recipient.id,\n offset,\n length: displayName.length,\n });\n }\n return { text, entities };\n}\n\n/** The Action.Submit `option` string, when the activity's value carries one. */\nfunction optionOf(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const option = (value as { option?: unknown }).option;\n return typeof option === \"string\" ? option : undefined;\n}\n\n/**\n * Normalizes a message activity into a ChannelMessage (spec §7.1.2):\n * payload { type:\"prompt\", prompt: textWithMentionTokensStripped },\n * meta.channel { platform:\"msteams\", conversationKey, eventId: a.id, tenantId,\n * actor, messageRef }, meta.mentions via normalize (bot recipient id ⇒ isBot\n * entity). A text-less Action.Submit (question-card answer) uses its `option`\n * as the prompt. Returns null for non-message activities and for the bot's own\n * messages (a.from.id === a.recipient.id — the adapter-level loop filter,\n * spec §8).\n */\nexport async function activityToChannelMessage(\n a: TeamsActivity,\n identity: IdentityPort,\n): Promise<ChannelMessage | null> {\n if (a.type !== \"message\") return null;\n if (a.from.id === a.recipient.id) return null;\n\n const conversationKey = conversationKeyFromActivity(a);\n const { text, entities } = stripMentionTokens(a);\n const mentions = await normalizeMentions(\n entities,\n (e) => ({\n platform: \"msteams\",\n externalId: e.externalId,\n displayName: e.displayName,\n tenantId: tenantIdOfActivity(a),\n }),\n identity,\n );\n\n const actor = actorOfActivity(a);\n const messageRef: MessageRef = {\n platform: \"msteams\",\n conversationKey,\n messageId: a.id,\n raw: { serviceUrl: a.serviceUrl, conversationId: a.conversation.id },\n };\n return {\n id: crypto.randomUUID(),\n // seq/sessionId are assigned on the session side; ingress carries placeholders.\n seq: 0,\n timestamp: a.timestamp ?? new Date().toISOString(),\n sessionId: \"\",\n payload: { type: \"prompt\", prompt: text || (optionOf(a.value) ?? \"\") },\n meta: {\n mentions,\n channel: {\n platform: \"msteams\",\n conversationKey,\n eventId: a.id,\n tenantId: tenantIdOfActivity(a),\n actor: { externalId: actor.externalId, displayName: actor.displayName },\n messageRef,\n },\n },\n };\n}\n","/**\n * The shared bottom-layer Bot Framework REST client (spec §4.1) — written once\n * here, reused by the later agent-side tool-face step. Raw fetch only; no\n * botbuilder.\n */\n\n/** Entra token endpoint base for the Bot Framework's shared tenant. */\nconst DEFAULT_LOGIN_BASE_URL = \"https://login.microsoftonline.com/botframework.com\";\n\n/** OAuth scope every connector-service call is authorized under. */\nconst BOTFRAMEWORK_SCOPE = \"https://api.botframework.com/.default\";\n\n/** Refresh the cached token this long before its actual expiry. */\nconst TOKEN_EXPIRY_MARGIN_MS = 60_000;\n\n/** Max attempts for one connector-service call (initial + retries on 429). */\nconst MAX_TRIES = 3;\n\n/** Options for {@link MsTeamsClient}. */\nexport type MsTeamsClientOptions = {\n appId: string;\n clientSecret: string;\n /** Default \"https://login.microsoftonline.com/botframework.com\" — injectable for mocks. */\n loginBaseUrl?: string;\n fetchImpl?: typeof fetch;\n now?: () => number;\n};\n\n/** A failed connector-service call, with the HTTP status for callers to branch on. */\nexport class MsTeamsApiError extends Error {\n constructor(\n readonly status: number,\n message: string,\n ) {\n super(message);\n this.name = \"MsTeamsApiError\";\n }\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Minimal Bot Framework connector-service client: client_credentials token\n * acquisition (cached) plus activity post/update against a channel-provided\n * serviceUrl. Honors 429 Retry-After with jittered backoff, max 3 tries.\n */\nexport class MsTeamsClient {\n private readonly opts: MsTeamsClientOptions;\n private readonly fetchImpl: typeof fetch;\n private readonly now: () => number;\n private token?: { value: string; expiresAt: number };\n\n constructor(opts: MsTeamsClientOptions) {\n this.opts = opts;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.now = opts.now ?? Date.now;\n }\n\n /** client_credentials token for scope https://api.botframework.com/.default; cached until exp-60s. */\n async getToken(): Promise<string> {\n if (this.token && this.token.expiresAt > this.now()) return this.token.value;\n const loginBaseUrl = this.opts.loginBaseUrl ?? DEFAULT_LOGIN_BASE_URL;\n const res = await this.fetchImpl(`${loginBaseUrl}/oauth2/v2.0/token`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.appId,\n client_secret: this.opts.clientSecret,\n scope: BOTFRAMEWORK_SCOPE,\n }).toString(),\n });\n if (!res.ok) throw new MsTeamsApiError(res.status, `token request failed: ${res.status}`);\n const body = (await res.json()) as { access_token: string; expires_in: number };\n this.token = {\n value: body.access_token,\n expiresAt: this.now() + body.expires_in * 1000 - TOKEN_EXPIRY_MARGIN_MS,\n };\n return body.access_token;\n }\n\n /** POST {serviceUrl}/v3/conversations/{conversationId}/activities[/{replyToId}] → { id }. */\n async postActivity(\n serviceUrl: string,\n conversationId: string,\n activity: Record<string, unknown>,\n replyToId?: string,\n ): Promise<{ id: string }> {\n const suffix = replyToId ? `/${encodeURIComponent(replyToId)}` : \"\";\n const res = await this.request(\n \"POST\",\n `${this.activitiesUrl(serviceUrl, conversationId)}${suffix}`,\n activity,\n );\n const body = (await res.json().catch(() => ({}))) as { id?: string };\n return { id: body.id ?? \"\" };\n }\n\n /** PUT {serviceUrl}/v3/conversations/{conversationId}/activities/{activityId}. Same retry policy. */\n async updateActivity(\n serviceUrl: string,\n conversationId: string,\n activityId: string,\n activity: Record<string, unknown>,\n ): Promise<void> {\n const url = `${this.activitiesUrl(serviceUrl, conversationId)}/${encodeURIComponent(activityId)}`;\n await this.request(\"PUT\", url, activity);\n }\n\n private activitiesUrl(serviceUrl: string, conversationId: string): string {\n const base = serviceUrl.replace(/\\/+$/, \"\");\n return `${base}/v3/conversations/${encodeURIComponent(conversationId)}/activities`;\n }\n\n /**\n * Authorized JSON request honoring 429 Retry-After with jittered backoff,\n * max 3 tries. One 401 forces a fresh token and a single immediate retry.\n */\n private async request(\n method: string,\n url: string,\n body: Record<string, unknown>,\n ): Promise<Response> {\n let retried401 = false;\n for (let attempt = 1; ; attempt++) {\n const token = await this.getToken();\n const res = await this.fetchImpl(url, {\n method,\n headers: { authorization: `Bearer ${token}`, \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (res.ok) return res;\n if (res.status === 401 && !retried401 && attempt < MAX_TRIES) {\n // The cached token was revoked or expired early — re-acquire once.\n retried401 = true;\n this.token = undefined;\n continue;\n }\n if (res.status !== 429 || attempt >= MAX_TRIES) {\n throw new MsTeamsApiError(res.status, `${method} ${url} failed: ${res.status}`);\n }\n const retryAfterSec = Number(res.headers.get(\"retry-after\"));\n const baseDelayMs =\n Number.isFinite(retryAfterSec) && retryAfterSec > 0 ? retryAfterSec * 1000 : 1000 * attempt;\n await sleep(baseDelayMs + Math.random() * 250);\n }\n }\n}\n","/**\n * Bot Framework channel→bot JWT validation (spec §8 \"Verify\"), implemented on\n * WebCrypto + raw fetch only — no botbuilder. Claim checks run before the\n * signature check so obviously-bad tokens never cost a JWKS fetch.\n */\nimport { Buffer } from \"node:buffer\";\n\n/** Bot Framework's published OpenID metadata document for channel→bot tokens. */\nconst DEFAULT_OPENID_METADATA_URL =\n \"https://login.botframework.com/v1/.well-known/openidconfiguration\";\n\n/** The only issuer Bot Framework channel→bot tokens carry. */\nconst BOTFRAMEWORK_ISSUER = \"https://api.botframework.com\";\n\n/** Default clock skew tolerated on `exp`/`nbf` (5 min). */\nconst DEFAULT_CLOCK_SKEW_MS = 300_000;\n\n/** How long fetched JWKS keys stay cached (24 h). */\nconst JWKS_CACHE_TTL_MS = 86_400_000;\n\n/** Min interval between unknown-kid forced refetches per metadata URL (60 s). */\nconst JWKS_FORCED_REFETCH_MIN_INTERVAL_MS = 60_000;\n\n/** Options for {@link validateBotFrameworkJwt}. */\nexport type JwtValidationOptions = {\n /** The Skaile-published multi-tenant Entra app id — the expected `aud`. */\n appId: string;\n /** Default \"https://login.botframework.com/v1/.well-known/openidconfiguration\". */\n openIdMetadataUrl?: string;\n /** Default 300_000 (5 min). */\n clockSkewMs?: number;\n fetchImpl?: typeof fetch;\n now?: () => number;\n};\n\n/** Outcome of {@link validateBotFrameworkJwt} — `reason` is safe to log, never secret. */\nexport type JwtValidationResult = { ok: true } | { ok: false; reason: string };\n\n/**\n * In-module JWKS cache — process-global by design, keyed per metadata URL, so\n * multiple adapter instances (gov-cloud vs commercial, tests beside prod)\n * share fetches without colliding. Values map kid → imported verify-only\n * CryptoKey.\n */\nconst jwksCache = new Map<string, { expiresAt: number; keysByKid: Map<string, CryptoKey> }>();\n\n/** metadata URL → last unknown-kid forced refetch (rate limit; process-global like the cache). */\nconst lastForcedRefetch = new Map<string, number>();\n\nconst fail = (reason: string): JwtValidationResult => ({ ok: false, reason });\n\n/** Decodes one base64url JWT segment into JSON; throws on malformed input. */\nfunction decodeSegment(segment: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(Buffer.from(segment, \"base64url\").toString(\"utf8\"));\n if (typeof parsed !== \"object\" || parsed === null) throw new Error(\"non-object JWT segment\");\n return parsed as Record<string, unknown>;\n}\n\n/**\n * Resolves the verify key for `kid` via metadata → JWKS, caching all imported\n * keys for 24h. A kid missing from a fresh cache (Microsoft key rotation)\n * forces one refetch, rate-limited to one per minute per metadata URL so a\n * flood of bad-kid tokens cannot hammer the endpoint. Returns undefined for a\n * kid still unknown after that.\n */\nasync function getSigningKey(\n metadataUrl: string,\n kid: string,\n fetchImpl: typeof fetch,\n now: () => number,\n): Promise<CryptoKey | undefined> {\n const cached = jwksCache.get(metadataUrl);\n if (cached && cached.expiresAt > now()) {\n const key = cached.keysByKid.get(kid);\n if (key) return key;\n const last = lastForcedRefetch.get(metadataUrl);\n if (last !== undefined && now() - last < JWKS_FORCED_REFETCH_MIN_INTERVAL_MS) return undefined;\n // Recorded before the fetch so a failing endpoint is not hammered either.\n lastForcedRefetch.set(metadataUrl, now());\n }\n\n const metadataRes = await fetchImpl(metadataUrl);\n if (!metadataRes.ok) throw new Error(`OpenID metadata fetch failed: ${metadataRes.status}`);\n const metadata = (await metadataRes.json()) as { jwks_uri?: string };\n if (typeof metadata.jwks_uri !== \"string\") throw new Error(\"OpenID metadata has no jwks_uri\");\n\n const jwksRes = await fetchImpl(metadata.jwks_uri);\n if (!jwksRes.ok) throw new Error(`JWKS fetch failed: ${jwksRes.status}`);\n const jwks = (await jwksRes.json()) as { keys?: Array<JsonWebKey & { kid?: string }> };\n\n const keysByKid = new Map<string, CryptoKey>();\n for (const jwk of jwks.keys ?? []) {\n if (typeof jwk.kid !== \"string\" || jwk.kty !== \"RSA\") continue;\n try {\n const key = await crypto.subtle.importKey(\n \"jwk\",\n jwk,\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"verify\"],\n );\n keysByKid.set(jwk.kid, key);\n } catch {\n // Unimportable key (foreign alg/params) — skip; other keys stay usable.\n }\n }\n jwksCache.set(metadataUrl, { expiresAt: now() + JWKS_CACHE_TTL_MS, keysByKid });\n return keysByKid.get(kid);\n}\n\n/**\n * Validates a Bot Framework channel→bot JWT (RS256 via the published JWKS):\n * Bearer present, alg RS256, iss \"https://api.botframework.com\", aud === appId,\n * exp/nbf within skew, serviceurl claim === the activity's serviceUrl.\n * JWKS keys cached in-module by kid for 24h; an unknown kid forces one\n * rate-limited refetch (key rotation) before the token is rejected.\n */\nexport async function validateBotFrameworkJwt(\n authorizationHeader: string | undefined,\n activityServiceUrl: string,\n opts: JwtValidationOptions,\n): Promise<JwtValidationResult> {\n const clockSkewMs = opts.clockSkewMs ?? DEFAULT_CLOCK_SKEW_MS;\n const fetchImpl = opts.fetchImpl ?? fetch;\n const now = opts.now ?? Date.now;\n const metadataUrl = opts.openIdMetadataUrl ?? DEFAULT_OPENID_METADATA_URL;\n\n if (!authorizationHeader?.startsWith(\"Bearer \")) return fail(\"missing Bearer token\");\n const token = authorizationHeader.slice(\"Bearer \".length).trim();\n const parts = token.split(\".\");\n if (parts.length !== 3) return fail(\"malformed JWT (expected three segments)\");\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n header = decodeSegment(parts[0]);\n payload = decodeSegment(parts[1]);\n } catch {\n return fail(\"undecodable JWT header or payload\");\n }\n\n if (header.alg !== \"RS256\") return fail(`unexpected alg \"${String(header.alg)}\"`);\n if (payload.iss !== BOTFRAMEWORK_ISSUER) return fail(`wrong iss \"${String(payload.iss)}\"`);\n const aud = payload.aud;\n const audOk = Array.isArray(aud) ? aud.includes(opts.appId) : aud === opts.appId;\n if (!audOk) return fail(`wrong aud \"${String(aud)}\"`);\n if (typeof payload.exp !== \"number\") return fail(\"missing exp claim\");\n if (now() > payload.exp * 1000 + clockSkewMs) return fail(\"token expired\");\n if (typeof payload.nbf === \"number\" && now() < payload.nbf * 1000 - clockSkewMs) {\n return fail(\"token not yet valid\");\n }\n if (payload.serviceurl !== activityServiceUrl) {\n return fail(\"serviceurl claim does not match the activity serviceUrl\");\n }\n if (typeof header.kid !== \"string\") return fail(\"missing kid header\");\n\n let key: CryptoKey | undefined;\n try {\n key = await getSigningKey(metadataUrl, header.kid, fetchImpl, now);\n } catch (err) {\n return fail(`signing key resolution failed: ${String(err)}`);\n }\n if (!key) return fail(`unknown signing key \"${header.kid}\"`);\n\n const valid = await crypto.subtle.verify(\n \"RSASSA-PKCS1-v1_5\",\n key,\n Buffer.from(parts[2], \"base64url\"),\n new TextEncoder().encode(`${parts[0]}.${parts[1]}`),\n );\n return valid ? { ok: true } : fail(\"invalid signature\");\n}\n","/**\n * MS Teams {@link ChannelAdapter}: Bot Framework webhook ingress (JWT-verified,\n * fast-acked) + connector-service egress via {@link MsTeamsClient}. Raw fetch\n * only — no botbuilder. Identity stays with the engine: the adapter only tags\n * `isBot` mention entities and never resolves users itself (Decision 16).\n */\nimport type { AdapterContext, ChannelAdapter } from \"../../src/adapter.js\";\nimport type { CredentialPort, IdentityPort } from \"../../src/ports.js\";\nimport type {\n ActorQuery,\n ChannelActor,\n ConversationHealth,\n ConversationKey,\n InboundReaction,\n MessageRef,\n OutboundMessage,\n ReplyTarget,\n SurfaceCapabilities,\n} from \"../../src/types.js\";\nimport { makeConversationKey, parseConversationKey } from \"../../src/types.js\";\nimport { makeQuestionCard, markdownToTeamsText } from \"../../src/format/adaptive-card.js\";\nimport type { TeamsActivity } from \"./activity.js\";\nimport {\n activityToChannelMessage,\n actorOfActivity,\n conversationKeyFromActivity,\n tenantIdOfActivity,\n} from \"./activity.js\";\nimport { MsTeamsApiError, MsTeamsClient } from \"./client.js\";\nimport { validateBotFrameworkJwt } from \"./jwt.js\";\n\nexport * from \"./activity.js\";\nexport * from \"./client.js\";\nexport * from \"./jwt.js\";\n\n/** Where the host mounts the Bot Framework messaging endpoint by default. */\nconst DEFAULT_INGRESS_PATH = \"/channels/msteams/messages\";\n\n/** How long a `post` dedupe key retains its MessageRef (10 min). */\nconst DEDUPE_TTL_MS = 600_000;\n\n/** Mention entities are only `isBot`-tagged here; the engine owns identity (Decision 16). */\nconst NULL_IDENTITY: IdentityPort = { resolveActor: async () => null };\n\n/** A reaction-carrying activity; the extra arrays live outside {@link TeamsActivity}. */\ntype ReactionActivity = TeamsActivity & {\n reactionsAdded?: Array<{ type: string }>;\n reactionsRemoved?: Array<{ type: string }>;\n};\n\n/** Options for {@link MsTeamsAdapter}. */\nexport type MsTeamsAdapterOptions = {\n /** Skaile's multi-tenant Entra app id (non-secret; the secret comes via CredentialPort). */\n appId: string;\n /** Default \"/channels/msteams/messages\". */\n ingressPath?: string;\n openIdMetadataUrl?: string;\n loginBaseUrl?: string;\n fetchImpl?: typeof fetch;\n};\n\n/** What ingress remembers per conversation — egress needs both to post back. */\ntype ConversationInfo = { serviceUrl: string; tenantId?: string };\n\nconst emptyOk = (): Response => new Response(null, { status: 200 });\nconst jsonOk = (): Response =>\n new Response(\"{}\", { status: 200, headers: { \"content-type\": \"application/json\" } });\n\n/**\n * The MS Teams adapter (spec §6, plan Task 10). Webhook-style: `start` only\n * registers the ingress route — there is no outbound socket. Egress posting\n * requires the conversation to have been seen on ingress (serviceUrl + tenant\n * are remembered per conversationKey; Bot Framework provides no directory).\n */\nexport class MsTeamsAdapter implements ChannelAdapter {\n readonly platform = \"msteams\" as const;\n readonly capabilities: SurfaceCapabilities = {\n canEditMessages: true,\n canDeleteMessages: true,\n supportsThreads: true,\n supportsCards: true,\n supportsTyping: true,\n supportsEphemeral: false,\n supportsReactions: true,\n maxMessageLength: 25000,\n ackDeadlineMs: 15000,\n editThrottleMs: 1000,\n textFormat: \"adaptive-card\",\n };\n\n private readonly opts: MsTeamsAdapterOptions;\n private ctx?: AdapterContext;\n /** tenantId → lazily-created provider client (promise-cached to collapse races). */\n private readonly clients = new Map<string, Promise<MsTeamsClient>>();\n /** Ingress-observed conversation facts, keyed by conversationKey (thread AND channel level). */\n private readonly conversations = new Map<ConversationKey, ConversationInfo>();\n /** Ingress-observed actors by externalId — the lookupActor roster. */\n private readonly roster = new Map<string, ChannelActor>();\n /** post() idempotency: dedupeKey → prior ref, TTL {@link DEDUPE_TTL_MS}. */\n private readonly posted = new Map<string, { ref: MessageRef; expiresAt: number }>();\n\n constructor(opts: MsTeamsAdapterOptions) {\n this.opts = opts;\n }\n\n /** Registers the ingress route on the host; no connection is opened. */\n async start(ctx: AdapterContext): Promise<void> {\n this.ctx = ctx;\n ctx.ingress.registerHttpRoute?.(\n this.opts.ingressPath ?? DEFAULT_INGRESS_PATH,\n this.handleRequest,\n );\n }\n\n /** Drops the context and per-tenant clients; the host owns route teardown. */\n async stop(): Promise<void> {\n this.ctx = undefined;\n this.clients.clear();\n }\n\n /**\n * The Bot Framework messaging endpoint. Guarded by a `Promise.race` at\n * `ackDeadlineMs - 1000`: if processing overruns, Teams still gets its 200\n * and at-least-once redelivery covers the rest.\n */\n readonly handleRequest = async (req: Request): Promise<Response> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const guard = new Promise<Response>((resolve) => {\n timer = setTimeout(() => resolve(jsonOk()), this.capabilities.ackDeadlineMs - 1000);\n });\n try {\n return await Promise.race([this.processRequest(req), guard]);\n } finally {\n clearTimeout(timer);\n }\n };\n\n private async processRequest(req: Request): Promise<Response> {\n const ctx = this.ctx;\n if (!ctx) return new Response(\"adapter not started\", { status: 503 });\n\n let activity: ReactionActivity;\n try {\n activity = (await req.json()) as ReactionActivity;\n } catch {\n return new Response(\"invalid JSON body\", { status: 400 });\n }\n if (typeof activity?.type !== \"string\" || typeof activity?.serviceUrl !== \"string\") {\n return new Response(\"not a Bot Framework activity\", { status: 400 });\n }\n\n const verdict = await validateBotFrameworkJwt(\n req.headers.get(\"authorization\") ?? undefined,\n activity.serviceUrl,\n {\n appId: this.opts.appId,\n openIdMetadataUrl: this.opts.openIdMetadataUrl,\n fetchImpl: this.opts.fetchImpl,\n },\n );\n if (!verdict.ok) return new Response(verdict.reason, { status: 401 });\n\n this.rememberConversation(activity);\n this.rememberActors(activity);\n\n // Own-bot loop filter (spec §8) — before any sink call.\n if (activity.from?.id === activity.recipient?.id) return emptyOk();\n if (activity.type === \"messageReaction\") {\n await this.forwardReactions(activity, ctx);\n return emptyOk();\n }\n if (activity.type !== \"message\") return emptyOk();\n\n const msg = await activityToChannelMessage(activity, NULL_IDENTITY);\n if (!msg) return emptyOk();\n await ctx.sink.onMessage(msg);\n return jsonOk();\n }\n\n /** Records serviceUrl + tenant under the thread key AND its channel-level key. */\n private rememberConversation(a: TeamsActivity): void {\n const key = conversationKeyFromActivity(a);\n const info: ConversationInfo = { serviceUrl: a.serviceUrl, tenantId: tenantIdOfActivity(a) };\n this.conversations.set(key, info);\n const { conversationId } = parseConversationKey(key);\n this.conversations.set(makeConversationKey(\"msteams\", conversationId), info);\n }\n\n /** Grows the lookupActor roster from the sender and mention entities (bot excluded). */\n private rememberActors(a: TeamsActivity): void {\n if (a.from?.id !== a.recipient?.id) {\n const actor = actorOfActivity(a);\n if (actor.externalId) this.roster.set(actor.externalId, actor);\n }\n for (const e of a.entities ?? []) {\n if (e.type !== \"mention\" || !e.mentioned || e.mentioned.id === a.recipient?.id) continue;\n this.roster.set(e.mentioned.id, {\n platform: \"msteams\",\n externalId: e.mentioned.id,\n displayName: e.mentioned.name ?? \"\",\n tenantId: tenantIdOfActivity(a),\n });\n }\n }\n\n /** Maps a messageReaction activity onto InboundReaction events (one per emoji). */\n private async forwardReactions(a: ReactionActivity, ctx: AdapterContext): Promise<void> {\n if (!ctx.sink.onReaction) return;\n const conversationKey = conversationKeyFromActivity(a);\n const actor = actorOfActivity(a);\n const messageRef: MessageRef = {\n platform: \"msteams\",\n conversationKey,\n // Teams points a reaction at its target via replyToId.\n messageId: a.replyToId ?? a.id,\n raw: { serviceUrl: a.serviceUrl, conversationId: a.conversation.id },\n };\n const groups: Array<[InboundReaction[\"action\"], Array<{ type: string }>]> = [\n [\"added\", a.reactionsAdded ?? []],\n [\"removed\", a.reactionsRemoved ?? []],\n ];\n for (const [action, reactions] of groups) {\n for (const reaction of reactions) {\n await ctx.sink.onReaction({\n conversationKey,\n messageRef,\n emoji: reaction.type,\n actor,\n action,\n eventId: `${a.id}:${action}:${reaction.type}`,\n });\n }\n }\n }\n\n /** Posts a message; a repeated `dedupeKey` returns the prior ref with no second side effect. */\n async post(target: ReplyTarget, msg: OutboundMessage, dedupeKey: string): Promise<MessageRef> {\n const prior = this.dedupeGet(dedupeKey);\n if (prior) return prior;\n if (msg.markdown.length > this.capabilities.maxMessageLength) {\n throw new Error(\n `message length ${msg.markdown.length} exceeds maxMessageLength ${this.capabilities.maxMessageLength} — chunk upstream`,\n );\n }\n const { serviceUrl, conversationId } = this.resolveTarget(target);\n const client = await this.clientForConversation(target.conversationKey);\n const { id } = await client.postActivity(serviceUrl, conversationId, this.buildActivity(msg));\n const ref: MessageRef = {\n platform: \"msteams\",\n conversationKey: target.conversationKey,\n messageId: id,\n raw: { serviceUrl, conversationId },\n };\n this.posted.set(dedupeKey, { ref, expiresAt: Date.now() + DEDUPE_TTL_MS });\n return ref;\n }\n\n /** Replaces a previously posted activity's content in place. */\n async update(ref: MessageRef, msg: OutboundMessage): Promise<void> {\n const raw = (ref.raw ?? {}) as Partial<ConversationInfo & { conversationId: string }>;\n const fallback =\n typeof raw.serviceUrl === \"string\" && typeof raw.conversationId === \"string\"\n ? { serviceUrl: raw.serviceUrl, conversationId: raw.conversationId }\n : this.resolveTarget({ conversationKey: ref.conversationKey });\n const client = await this.clientForConversation(ref.conversationKey);\n await client.updateActivity(\n fallback.serviceUrl,\n fallback.conversationId,\n ref.messageId,\n this.buildActivity(msg),\n );\n }\n\n /** Native Teams typing indicator — fire-and-forget, never deduped. */\n async indicateTyping(target: ReplyTarget): Promise<void> {\n const { serviceUrl, conversationId } = this.resolveTarget(target);\n const client = await this.clientForConversation(target.conversationKey);\n await client.postActivity(serviceUrl, conversationId, { type: \"typing\" });\n }\n\n /** Preflight: a typing probe proves the bot can post; 403/404 → actionable problem. */\n async verifyConversation(key: ConversationKey): Promise<ConversationHealth> {\n try {\n const { serviceUrl, conversationId } = this.resolveTarget({ conversationKey: key });\n const client = await this.clientForConversation(key);\n await client.postActivity(serviceUrl, conversationId, { type: \"typing\" });\n return { ok: true, problems: [] };\n } catch (err) {\n if (err instanceof MsTeamsApiError && (err.status === 403 || err.status === 404)) {\n return {\n ok: false,\n problems: [\n `bot cannot post to ${key} — check the app is installed in the team and the bot has access`,\n ],\n };\n }\n return { ok: false, problems: [err instanceof Error ? err.message : String(err)] };\n }\n }\n\n /** Resolves from the ingress-observed roster only (Graph lookup is platform glue, later). */\n async lookupActor(query: ActorQuery): Promise<ChannelActor | undefined> {\n if (query.externalId) return this.roster.get(query.externalId);\n for (const actor of this.roster.values()) {\n if (query.email && actor.email === query.email) return actor;\n if (query.name && actor.displayName.toLowerCase().includes(query.name.toLowerCase())) {\n return actor;\n }\n }\n return undefined;\n }\n\n /** Decision 11: Adaptive Card for questions with options; markdown text otherwise. */\n private buildActivity(msg: OutboundMessage): Record<string, unknown> {\n if (msg.kind === \"question\" && msg.options?.length) {\n return {\n type: \"message\",\n attachments: [\n {\n contentType: \"application/vnd.microsoft.card.adaptive\",\n content: makeQuestionCard(markdownToTeamsText(msg.markdown), msg.options),\n },\n ],\n };\n }\n const text = markdownToTeamsText(msg.markdown);\n return {\n type: \"message\",\n textFormat: \"markdown\",\n text: msg.kind === \"error\" ? `⚠️ ${text}` : text,\n };\n }\n\n /** serviceUrl + native conversation id for a target — threadRef.raw first, ingress memory else. */\n private resolveTarget(target: ReplyTarget): { serviceUrl: string; conversationId: string } {\n const raw = (target.threadRef?.raw ?? {}) as { serviceUrl?: unknown; conversationId?: unknown };\n if (typeof raw.serviceUrl === \"string\" && typeof raw.conversationId === \"string\") {\n return { serviceUrl: raw.serviceUrl, conversationId: raw.conversationId };\n }\n const { conversationId, threadRootId } = parseConversationKey(target.conversationKey);\n const nativeId = threadRootId ? `${conversationId};messageid=${threadRootId}` : conversationId;\n const info = this.infoFor(target.conversationKey);\n if (!info) {\n throw new Error(\n `no known serviceUrl for ${target.conversationKey} — the conversation has not been seen on ingress`,\n );\n }\n return { serviceUrl: info.serviceUrl, conversationId: nativeId };\n }\n\n /** Conversation facts under the exact key, falling back to its channel-level key. */\n private infoFor(key: ConversationKey): ConversationInfo | undefined {\n const exact = this.conversations.get(key);\n if (exact) return exact;\n const { conversationId } = parseConversationKey(key);\n return this.conversations.get(makeConversationKey(\"msteams\", conversationId));\n }\n\n /** One MsTeamsClient per tenant, built from CredentialPort (kind must be \"msteams\"). */\n private clientForConversation(key: ConversationKey): Promise<MsTeamsClient> {\n const ctx = this.ctx;\n if (!ctx) return Promise.reject(new Error(\"adapter not started\"));\n const tenantId = this.infoFor(key)?.tenantId;\n if (!tenantId) {\n return Promise.reject(\n new Error(`no known tenant for ${key} — the conversation has not been seen on ingress`),\n );\n }\n return this.clientForTenant(tenantId, ctx.credentials);\n }\n\n private clientForTenant(tenantId: string, credentials: CredentialPort): Promise<MsTeamsClient> {\n const cached = this.clients.get(tenantId);\n if (cached) return cached;\n const created = (async () => {\n const cred = await credentials.forTenant(\"msteams\", tenantId);\n if (cred.kind !== \"msteams\") {\n throw new Error(\n `expected \"msteams\" credentials for tenant ${tenantId}, got \"${cred.kind}\"`,\n );\n }\n return new MsTeamsClient({\n appId: cred.appId,\n clientSecret: cred.clientSecret,\n loginBaseUrl: this.opts.loginBaseUrl,\n fetchImpl: this.opts.fetchImpl,\n });\n })();\n this.clients.set(tenantId, created);\n // A failed credential resolution must not be cached forever.\n created.catch(() => this.clients.delete(tenantId));\n return created;\n }\n\n /** Live dedupe hit for `key`, sweeping expired entries opportunistically. */\n private dedupeGet(key: string): MessageRef | undefined {\n const now = Date.now();\n for (const [k, entry] of this.posted) {\n if (entry.expiresAt <= now) this.posted.delete(k);\n }\n return this.posted.get(key)?.ref;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ // Auto-generated by _scripts/emit-dts-sidecars.ts — do not edit by hand.
2
+ export * from "./src/index.js";