@openclaw/msteams 2026.3.13 → 2026.5.2-beta.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 (175) hide show
  1. package/api.ts +3 -0
  2. package/channel-config-api.ts +1 -0
  3. package/channel-plugin-api.ts +2 -0
  4. package/config-api.ts +4 -0
  5. package/contract-api.ts +4 -0
  6. package/index.ts +15 -12
  7. package/openclaw.plugin.json +553 -1
  8. package/package.json +46 -12
  9. package/runtime-api.ts +73 -0
  10. package/secret-contract-api.ts +5 -0
  11. package/setup-entry.ts +13 -0
  12. package/setup-plugin-api.ts +3 -0
  13. package/src/ai-entity.ts +7 -0
  14. package/src/approval-auth.ts +44 -0
  15. package/src/attachments/bot-framework.test.ts +461 -0
  16. package/src/attachments/bot-framework.ts +362 -0
  17. package/src/attachments/download.ts +63 -19
  18. package/src/attachments/graph.test.ts +416 -0
  19. package/src/attachments/graph.ts +163 -72
  20. package/src/attachments/html.ts +33 -1
  21. package/src/attachments/payload.ts +1 -1
  22. package/src/attachments/remote-media.test.ts +137 -0
  23. package/src/attachments/remote-media.ts +75 -8
  24. package/src/attachments/shared.test.ts +138 -1
  25. package/src/attachments/shared.ts +193 -26
  26. package/src/attachments/types.ts +10 -0
  27. package/src/attachments.graph.test.ts +342 -0
  28. package/src/attachments.helpers.test.ts +246 -0
  29. package/src/attachments.test-helpers.ts +17 -0
  30. package/src/attachments.test.ts +163 -418
  31. package/src/attachments.ts +5 -5
  32. package/src/block-streaming-config.test.ts +61 -0
  33. package/src/channel-api.ts +1 -0
  34. package/src/channel.actions.test.ts +742 -0
  35. package/src/channel.directory.test.ts +145 -4
  36. package/src/channel.runtime.ts +56 -0
  37. package/src/channel.setup.ts +77 -0
  38. package/src/channel.test.ts +128 -0
  39. package/src/channel.ts +1077 -395
  40. package/src/config-schema.ts +6 -0
  41. package/src/config-ui-hints.ts +12 -0
  42. package/src/conversation-store-fs.test.ts +4 -5
  43. package/src/conversation-store-fs.ts +35 -51
  44. package/src/conversation-store-helpers.test.ts +202 -0
  45. package/src/conversation-store-helpers.ts +105 -0
  46. package/src/conversation-store-memory.ts +27 -23
  47. package/src/conversation-store.shared.test.ts +225 -0
  48. package/src/conversation-store.ts +30 -0
  49. package/src/directory-live.test.ts +156 -0
  50. package/src/directory-live.ts +7 -4
  51. package/src/doctor.ts +27 -0
  52. package/src/errors.test.ts +64 -1
  53. package/src/errors.ts +50 -9
  54. package/src/feedback-reflection-prompt.ts +117 -0
  55. package/src/feedback-reflection-store.ts +114 -0
  56. package/src/feedback-reflection.test.ts +237 -0
  57. package/src/feedback-reflection.ts +283 -0
  58. package/src/file-consent-helpers.test.ts +83 -0
  59. package/src/file-consent-helpers.ts +64 -11
  60. package/src/file-consent-invoke.ts +150 -0
  61. package/src/file-consent.test.ts +363 -0
  62. package/src/file-consent.ts +165 -4
  63. package/src/graph-chat.ts +5 -3
  64. package/src/graph-group-management.test.ts +318 -0
  65. package/src/graph-group-management.ts +168 -0
  66. package/src/graph-members.test.ts +89 -0
  67. package/src/graph-members.ts +48 -0
  68. package/src/graph-messages.actions.test.ts +243 -0
  69. package/src/graph-messages.read.test.ts +391 -0
  70. package/src/graph-messages.search.test.ts +213 -0
  71. package/src/graph-messages.test-helpers.ts +50 -0
  72. package/src/graph-messages.ts +534 -0
  73. package/src/graph-teams.test.ts +215 -0
  74. package/src/graph-teams.ts +114 -0
  75. package/src/graph-thread.test.ts +246 -0
  76. package/src/graph-thread.ts +146 -0
  77. package/src/graph-upload.test.ts +161 -4
  78. package/src/graph-upload.ts +147 -56
  79. package/src/graph.test.ts +516 -0
  80. package/src/graph.ts +233 -21
  81. package/src/inbound.test.ts +156 -1
  82. package/src/inbound.ts +101 -1
  83. package/src/media-helpers.ts +1 -1
  84. package/src/mentions.test.ts +27 -18
  85. package/src/mentions.ts +2 -2
  86. package/src/messenger.test.ts +504 -23
  87. package/src/messenger.ts +133 -52
  88. package/src/monitor-handler/access.ts +125 -0
  89. package/src/monitor-handler/inbound-media.test.ts +289 -0
  90. package/src/monitor-handler/inbound-media.ts +57 -5
  91. package/src/monitor-handler/message-handler-mock-support.test-support.ts +28 -0
  92. package/src/monitor-handler/message-handler.authz.test.ts +588 -74
  93. package/src/monitor-handler/message-handler.dm-media.test.ts +54 -0
  94. package/src/monitor-handler/message-handler.test-support.ts +100 -0
  95. package/src/monitor-handler/message-handler.thread-parent.test.ts +223 -0
  96. package/src/monitor-handler/message-handler.thread-session.test.ts +77 -0
  97. package/src/monitor-handler/message-handler.ts +470 -164
  98. package/src/monitor-handler/reaction-handler.test.ts +267 -0
  99. package/src/monitor-handler/reaction-handler.ts +210 -0
  100. package/src/monitor-handler/thread-session.ts +17 -0
  101. package/src/monitor-handler.adaptive-card.test.ts +162 -0
  102. package/src/monitor-handler.feedback-authz.test.ts +314 -0
  103. package/src/monitor-handler.file-consent.test.ts +281 -79
  104. package/src/monitor-handler.sso.test.ts +563 -0
  105. package/src/monitor-handler.test-helpers.ts +180 -0
  106. package/src/monitor-handler.ts +459 -115
  107. package/src/monitor-handler.types.ts +27 -0
  108. package/src/monitor-types.ts +1 -0
  109. package/src/monitor.lifecycle.test.ts +74 -10
  110. package/src/monitor.test.ts +35 -1
  111. package/src/monitor.ts +143 -46
  112. package/src/oauth.flow.ts +77 -0
  113. package/src/oauth.shared.ts +37 -0
  114. package/src/oauth.test.ts +305 -0
  115. package/src/oauth.token.ts +158 -0
  116. package/src/oauth.ts +130 -0
  117. package/src/outbound.test.ts +10 -11
  118. package/src/outbound.ts +62 -44
  119. package/src/pending-uploads-fs.test.ts +246 -0
  120. package/src/pending-uploads-fs.ts +235 -0
  121. package/src/pending-uploads.test.ts +173 -0
  122. package/src/pending-uploads.ts +34 -2
  123. package/src/policy.test.ts +11 -5
  124. package/src/policy.ts +5 -5
  125. package/src/polls.test.ts +106 -5
  126. package/src/polls.ts +15 -7
  127. package/src/presentation.ts +68 -0
  128. package/src/probe.test.ts +27 -8
  129. package/src/probe.ts +43 -9
  130. package/src/reply-dispatcher.test.ts +437 -0
  131. package/src/reply-dispatcher.ts +259 -73
  132. package/src/reply-stream-controller.test.ts +235 -0
  133. package/src/reply-stream-controller.ts +147 -0
  134. package/src/resolve-allowlist.test.ts +105 -1
  135. package/src/resolve-allowlist.ts +112 -7
  136. package/src/runtime.ts +6 -3
  137. package/src/sdk-types.ts +43 -3
  138. package/src/sdk.test.ts +666 -0
  139. package/src/sdk.ts +867 -16
  140. package/src/secret-contract.ts +49 -0
  141. package/src/secret-input.ts +1 -1
  142. package/src/send-context.ts +76 -9
  143. package/src/send.test.ts +389 -5
  144. package/src/send.ts +140 -32
  145. package/src/sent-message-cache.ts +30 -18
  146. package/src/session-route.ts +40 -0
  147. package/src/setup-core.ts +160 -0
  148. package/src/setup-surface.test.ts +202 -0
  149. package/src/setup-surface.ts +320 -0
  150. package/src/sso-token-store.test.ts +72 -0
  151. package/src/sso-token-store.ts +166 -0
  152. package/src/sso.ts +300 -0
  153. package/src/storage.ts +1 -1
  154. package/src/store-fs.ts +2 -2
  155. package/src/streaming-message.test.ts +262 -0
  156. package/src/streaming-message.ts +297 -0
  157. package/src/test-runtime.ts +1 -1
  158. package/src/thread-parent-context.test.ts +224 -0
  159. package/src/thread-parent-context.ts +159 -0
  160. package/src/token.test.ts +237 -50
  161. package/src/token.ts +162 -7
  162. package/src/user-agent.test.ts +86 -0
  163. package/src/user-agent.ts +53 -0
  164. package/src/webhook-timeouts.ts +27 -0
  165. package/src/welcome-card.test.ts +81 -0
  166. package/src/welcome-card.ts +57 -0
  167. package/test-api.ts +1 -0
  168. package/tsconfig.json +16 -0
  169. package/CHANGELOG.md +0 -107
  170. package/src/file-lock.ts +0 -1
  171. package/src/graph-users.test.ts +0 -66
  172. package/src/onboarding.ts +0 -381
  173. package/src/polls-store.test.ts +0 -38
  174. package/src/revoked-context.test.ts +0 -39
  175. package/src/token-response.test.ts +0 -23
@@ -1,13 +1,25 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { buildMentionEntities, formatMentionText, parseMentions } from "./mentions.js";
3
3
 
4
+ function requireFirstEntity(result: ReturnType<typeof parseMentions>) {
5
+ const entity = result.entities[0];
6
+ if (!entity) {
7
+ throw new Error("expected parseMentions to return at least one entity");
8
+ }
9
+ return entity;
10
+ }
11
+
12
+ function requireOnlyEntity(result: ReturnType<typeof parseMentions>) {
13
+ expect(result.entities).toHaveLength(1);
14
+ return requireFirstEntity(result);
15
+ }
16
+
4
17
  describe("parseMentions", () => {
5
18
  it("parses single mention", () => {
6
19
  const result = parseMentions("Hello @[John Doe](28:a1b2c3-d4e5f6)!");
7
20
 
8
21
  expect(result.text).toBe("Hello <at>John Doe</at>!");
9
- expect(result.entities).toHaveLength(1);
10
- expect(result.entities[0]).toEqual({
22
+ expect(requireOnlyEntity(result)).toEqual({
11
23
  type: "mention",
12
24
  text: "<at>John Doe</at>",
13
25
  mentioned: {
@@ -58,13 +70,13 @@ describe("parseMentions", () => {
58
70
  const result = parseMentions("@[John Peter Smith](28:a1b2c3)");
59
71
 
60
72
  expect(result.text).toBe("<at>John Peter Smith</at>");
61
- expect(result.entities[0]?.mentioned.name).toBe("John Peter Smith");
73
+ expect(requireFirstEntity(result).mentioned.name).toBe("John Peter Smith");
62
74
  });
63
75
 
64
76
  it("trims whitespace from id and name", () => {
65
77
  const result = parseMentions("@[ John Doe ]( 28:a1b2c3 )");
66
78
 
67
- expect(result.entities[0]).toEqual({
79
+ expect(requireOnlyEntity(result)).toEqual({
68
80
  type: "mention",
69
81
  text: "<at>John Doe</at>",
70
82
  mentioned: {
@@ -79,8 +91,7 @@ describe("parseMentions", () => {
79
91
  const result = parseMentions(input);
80
92
 
81
93
  expect(result.text).toBe("<at>タナカ タロウ</at> スキル化完了しました!");
82
- expect(result.entities).toHaveLength(1);
83
- expect(result.entities[0]).toEqual({
94
+ expect(requireOnlyEntity(result)).toEqual({
84
95
  type: "mention",
85
96
  text: "<at>タナカ タロウ</at>",
86
97
  mentioned: {
@@ -90,7 +101,7 @@ describe("parseMentions", () => {
90
101
  });
91
102
 
92
103
  // Verify entity text exactly matches what's in the formatted text
93
- const entityText = result.entities[0]?.text;
104
+ const entityText = requireFirstEntity(result).text;
94
105
  expect(result.text).toContain(entityText);
95
106
  expect(result.text.indexOf(entityText)).toBe(0);
96
107
  });
@@ -107,9 +118,9 @@ describe("parseMentions", () => {
107
118
  const result = parseMentions(input);
108
119
 
109
120
  // Only the real mention should be parsed; the documentation example should be left as-is
110
- expect(result.entities).toHaveLength(1);
111
- expect(result.entities[0]?.mentioned.id).toBe("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
112
- expect(result.entities[0]?.mentioned.name).toBe("タナカ タロウ");
121
+ const firstEntity = requireOnlyEntity(result);
122
+ expect(firstEntity.mentioned.id).toBe("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
123
+ expect(firstEntity.mentioned.name).toBe("タナカ タロウ");
113
124
 
114
125
  // The documentation pattern must remain untouched in the text
115
126
  expect(result.text).toContain("`@[表示名](ユーザーID)`");
@@ -117,26 +128,24 @@ describe("parseMentions", () => {
117
128
 
118
129
  it("accepts Bot Framework IDs (28:xxx)", () => {
119
130
  const result = parseMentions("@[Bot](28:abc-123)");
120
- expect(result.entities).toHaveLength(1);
121
- expect(result.entities[0]?.mentioned.id).toBe("28:abc-123");
131
+ expect(requireOnlyEntity(result).mentioned.id).toBe("28:abc-123");
122
132
  });
123
133
 
124
134
  it("accepts Bot Framework IDs with non-hex payloads (29:xxx)", () => {
125
135
  const result = parseMentions("@[Bot](29:08q2j2o3jc09au90eucae)");
126
- expect(result.entities).toHaveLength(1);
127
- expect(result.entities[0]?.mentioned.id).toBe("29:08q2j2o3jc09au90eucae");
136
+ expect(requireOnlyEntity(result).mentioned.id).toBe("29:08q2j2o3jc09au90eucae");
128
137
  });
129
138
 
130
139
  it("accepts org-scoped IDs with extra segments (8:orgid:...)", () => {
131
140
  const result = parseMentions("@[User](8:orgid:2d8c2d2c-1111-2222-3333-444444444444)");
132
- expect(result.entities).toHaveLength(1);
133
- expect(result.entities[0]?.mentioned.id).toBe("8:orgid:2d8c2d2c-1111-2222-3333-444444444444");
141
+ expect(requireOnlyEntity(result).mentioned.id).toBe(
142
+ "8:orgid:2d8c2d2c-1111-2222-3333-444444444444",
143
+ );
134
144
  });
135
145
 
136
146
  it("accepts AAD object IDs (UUIDs)", () => {
137
147
  const result = parseMentions("@[User](a1b2c3d4-e5f6-7890-abcd-ef1234567890)");
138
- expect(result.entities).toHaveLength(1);
139
- expect(result.entities[0]?.mentioned.id).toBe("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
148
+ expect(requireOnlyEntity(result).mentioned.id).toBe("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
140
149
  });
141
150
 
142
151
  it("rejects non-ID strings as mention targets", () => {
package/src/mentions.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * 2. entities array with mention metadata
7
7
  */
8
8
 
9
- export type MentionEntity = {
9
+ type MentionEntity = {
10
10
  type: "mention";
11
11
  text: string;
12
12
  mentioned: {
@@ -15,7 +15,7 @@ export type MentionEntity = {
15
15
  };
16
16
  };
17
17
 
18
- export type MentionInfo = {
18
+ type MentionInfo = {
19
19
  /** User/bot ID (e.g., "28:xxx" or AAD object ID) */
20
20
  id: string;
21
21
  /** Display name */