@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.
- package/api.ts +3 -0
- package/channel-config-api.ts +1 -0
- package/channel-plugin-api.ts +2 -0
- package/config-api.ts +4 -0
- package/contract-api.ts +4 -0
- package/index.ts +15 -12
- package/openclaw.plugin.json +553 -1
- package/package.json +46 -12
- package/runtime-api.ts +73 -0
- package/secret-contract-api.ts +5 -0
- package/setup-entry.ts +13 -0
- package/setup-plugin-api.ts +3 -0
- package/src/ai-entity.ts +7 -0
- package/src/approval-auth.ts +44 -0
- package/src/attachments/bot-framework.test.ts +461 -0
- package/src/attachments/bot-framework.ts +362 -0
- package/src/attachments/download.ts +63 -19
- package/src/attachments/graph.test.ts +416 -0
- package/src/attachments/graph.ts +163 -72
- package/src/attachments/html.ts +33 -1
- package/src/attachments/payload.ts +1 -1
- package/src/attachments/remote-media.test.ts +137 -0
- package/src/attachments/remote-media.ts +75 -8
- package/src/attachments/shared.test.ts +138 -1
- package/src/attachments/shared.ts +193 -26
- package/src/attachments/types.ts +10 -0
- package/src/attachments.graph.test.ts +342 -0
- package/src/attachments.helpers.test.ts +246 -0
- package/src/attachments.test-helpers.ts +17 -0
- package/src/attachments.test.ts +163 -418
- package/src/attachments.ts +5 -5
- package/src/block-streaming-config.test.ts +61 -0
- package/src/channel-api.ts +1 -0
- package/src/channel.actions.test.ts +742 -0
- package/src/channel.directory.test.ts +145 -4
- package/src/channel.runtime.ts +56 -0
- package/src/channel.setup.ts +77 -0
- package/src/channel.test.ts +128 -0
- package/src/channel.ts +1077 -395
- package/src/config-schema.ts +6 -0
- package/src/config-ui-hints.ts +12 -0
- package/src/conversation-store-fs.test.ts +4 -5
- package/src/conversation-store-fs.ts +35 -51
- package/src/conversation-store-helpers.test.ts +202 -0
- package/src/conversation-store-helpers.ts +105 -0
- package/src/conversation-store-memory.ts +27 -23
- package/src/conversation-store.shared.test.ts +225 -0
- package/src/conversation-store.ts +30 -0
- package/src/directory-live.test.ts +156 -0
- package/src/directory-live.ts +7 -4
- package/src/doctor.ts +27 -0
- package/src/errors.test.ts +64 -1
- package/src/errors.ts +50 -9
- package/src/feedback-reflection-prompt.ts +117 -0
- package/src/feedback-reflection-store.ts +114 -0
- package/src/feedback-reflection.test.ts +237 -0
- package/src/feedback-reflection.ts +283 -0
- package/src/file-consent-helpers.test.ts +83 -0
- package/src/file-consent-helpers.ts +64 -11
- package/src/file-consent-invoke.ts +150 -0
- package/src/file-consent.test.ts +363 -0
- package/src/file-consent.ts +165 -4
- package/src/graph-chat.ts +5 -3
- package/src/graph-group-management.test.ts +318 -0
- package/src/graph-group-management.ts +168 -0
- package/src/graph-members.test.ts +89 -0
- package/src/graph-members.ts +48 -0
- package/src/graph-messages.actions.test.ts +243 -0
- package/src/graph-messages.read.test.ts +391 -0
- package/src/graph-messages.search.test.ts +213 -0
- package/src/graph-messages.test-helpers.ts +50 -0
- package/src/graph-messages.ts +534 -0
- package/src/graph-teams.test.ts +215 -0
- package/src/graph-teams.ts +114 -0
- package/src/graph-thread.test.ts +246 -0
- package/src/graph-thread.ts +146 -0
- package/src/graph-upload.test.ts +161 -4
- package/src/graph-upload.ts +147 -56
- package/src/graph.test.ts +516 -0
- package/src/graph.ts +233 -21
- package/src/inbound.test.ts +156 -1
- package/src/inbound.ts +101 -1
- package/src/media-helpers.ts +1 -1
- package/src/mentions.test.ts +27 -18
- package/src/mentions.ts +2 -2
- package/src/messenger.test.ts +504 -23
- package/src/messenger.ts +133 -52
- package/src/monitor-handler/access.ts +125 -0
- package/src/monitor-handler/inbound-media.test.ts +289 -0
- package/src/monitor-handler/inbound-media.ts +57 -5
- package/src/monitor-handler/message-handler-mock-support.test-support.ts +28 -0
- package/src/monitor-handler/message-handler.authz.test.ts +588 -74
- package/src/monitor-handler/message-handler.dm-media.test.ts +54 -0
- package/src/monitor-handler/message-handler.test-support.ts +100 -0
- package/src/monitor-handler/message-handler.thread-parent.test.ts +223 -0
- package/src/monitor-handler/message-handler.thread-session.test.ts +77 -0
- package/src/monitor-handler/message-handler.ts +470 -164
- package/src/monitor-handler/reaction-handler.test.ts +267 -0
- package/src/monitor-handler/reaction-handler.ts +210 -0
- package/src/monitor-handler/thread-session.ts +17 -0
- package/src/monitor-handler.adaptive-card.test.ts +162 -0
- package/src/monitor-handler.feedback-authz.test.ts +314 -0
- package/src/monitor-handler.file-consent.test.ts +281 -79
- package/src/monitor-handler.sso.test.ts +563 -0
- package/src/monitor-handler.test-helpers.ts +180 -0
- package/src/monitor-handler.ts +459 -115
- package/src/monitor-handler.types.ts +27 -0
- package/src/monitor-types.ts +1 -0
- package/src/monitor.lifecycle.test.ts +74 -10
- package/src/monitor.test.ts +35 -1
- package/src/monitor.ts +143 -46
- package/src/oauth.flow.ts +77 -0
- package/src/oauth.shared.ts +37 -0
- package/src/oauth.test.ts +305 -0
- package/src/oauth.token.ts +158 -0
- package/src/oauth.ts +130 -0
- package/src/outbound.test.ts +10 -11
- package/src/outbound.ts +62 -44
- package/src/pending-uploads-fs.test.ts +246 -0
- package/src/pending-uploads-fs.ts +235 -0
- package/src/pending-uploads.test.ts +173 -0
- package/src/pending-uploads.ts +34 -2
- package/src/policy.test.ts +11 -5
- package/src/policy.ts +5 -5
- package/src/polls.test.ts +106 -5
- package/src/polls.ts +15 -7
- package/src/presentation.ts +68 -0
- package/src/probe.test.ts +27 -8
- package/src/probe.ts +43 -9
- package/src/reply-dispatcher.test.ts +437 -0
- package/src/reply-dispatcher.ts +259 -73
- package/src/reply-stream-controller.test.ts +235 -0
- package/src/reply-stream-controller.ts +147 -0
- package/src/resolve-allowlist.test.ts +105 -1
- package/src/resolve-allowlist.ts +112 -7
- package/src/runtime.ts +6 -3
- package/src/sdk-types.ts +43 -3
- package/src/sdk.test.ts +666 -0
- package/src/sdk.ts +867 -16
- package/src/secret-contract.ts +49 -0
- package/src/secret-input.ts +1 -1
- package/src/send-context.ts +76 -9
- package/src/send.test.ts +389 -5
- package/src/send.ts +140 -32
- package/src/sent-message-cache.ts +30 -18
- package/src/session-route.ts +40 -0
- package/src/setup-core.ts +160 -0
- package/src/setup-surface.test.ts +202 -0
- package/src/setup-surface.ts +320 -0
- package/src/sso-token-store.test.ts +72 -0
- package/src/sso-token-store.ts +166 -0
- package/src/sso.ts +300 -0
- package/src/storage.ts +1 -1
- package/src/store-fs.ts +2 -2
- package/src/streaming-message.test.ts +262 -0
- package/src/streaming-message.ts +297 -0
- package/src/test-runtime.ts +1 -1
- package/src/thread-parent-context.test.ts +224 -0
- package/src/thread-parent-context.ts +159 -0
- package/src/token.test.ts +237 -50
- package/src/token.ts +162 -7
- package/src/user-agent.test.ts +86 -0
- package/src/user-agent.ts +53 -0
- package/src/webhook-timeouts.ts +27 -0
- package/src/welcome-card.test.ts +81 -0
- package/src/welcome-card.ts +57 -0
- package/test-api.ts +1 -0
- package/tsconfig.json +16 -0
- package/CHANGELOG.md +0 -107
- package/src/file-lock.ts +0 -1
- package/src/graph-users.test.ts +0 -66
- package/src/onboarding.ts +0 -381
- package/src/polls-store.test.ts +0 -38
- package/src/revoked-context.test.ts +0 -39
- package/src/token-response.test.ts +0 -23
package/src/mentions.test.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
111
|
-
expect(
|
|
112
|
-
expect(
|
|
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.
|
|
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.
|
|
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.
|
|
133
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
18
|
+
type MentionInfo = {
|
|
19
19
|
/** User/bot ID (e.g., "28:xxx" or AAD object ID) */
|
|
20
20
|
id: string;
|
|
21
21
|
/** Display name */
|