@absolutejs/meeting 0.0.1-beta.0 → 0.0.1-beta.10
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/LICENSE +88 -0
- package/README.md +25 -1
- package/dist/bufferSource.d.ts +3 -0
- package/dist/emitter.d.ts +16 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +131 -35
- package/dist/manager.d.ts +36 -0
- package/dist/manifest.d.ts +28 -0
- package/dist/manifest.js +268 -0
- package/dist/manifest.json +408 -0
- package/dist/meeting.d.ts +27 -1
- package/dist/source.d.ts +79 -1
- package/package.json +70 -35
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/manifest.ts
|
|
3
|
+
import {
|
|
4
|
+
defineImplementation,
|
|
5
|
+
defineManifest,
|
|
6
|
+
toolFactory
|
|
7
|
+
} from "@absolutejs/manifest";
|
|
8
|
+
import { Type } from "@sinclair/typebox";
|
|
9
|
+
var tool = toolFactory();
|
|
10
|
+
var MAX_TRANSCRIPT_TURNS = 200;
|
|
11
|
+
var DEFAULT_TRANSCRIPT_TURNS = 50;
|
|
12
|
+
var MAX_CHAT_LENGTH = 2000;
|
|
13
|
+
var manifest = defineManifest()({
|
|
14
|
+
contract: 2,
|
|
15
|
+
identity: {
|
|
16
|
+
accent: "#f97316",
|
|
17
|
+
category: "voice",
|
|
18
|
+
description: "Meeting-bot core: join a call through a `MeetingSource` platform adapter (`@absolutejs/meeting-*`), transcribe it live with the `@absolutejs/voice` scribe, and surface diarized turns, the participant roster, and call chat for analysis (deal coaching, summaries, action items). The bot can also speak into the call and post chat where the platform allows.",
|
|
19
|
+
docsUrl: "https://github.com/absolutejs/meeting",
|
|
20
|
+
name: "@absolutejs/meeting",
|
|
21
|
+
tagline: "Put a bot in your meetings \u2014 live transcripts and analysis."
|
|
22
|
+
},
|
|
23
|
+
implements: [
|
|
24
|
+
defineImplementation()({
|
|
25
|
+
contract: "meeting/source-factory",
|
|
26
|
+
factory: "createBufferMeetingSourceFactory",
|
|
27
|
+
from: "@absolutejs/meeting",
|
|
28
|
+
settings: Type.Object({
|
|
29
|
+
chunkMs: Type.Optional(Type.Number({
|
|
30
|
+
description: "How often a slice of the buffer is emitted, in milliseconds. Default 40.",
|
|
31
|
+
minimum: 1,
|
|
32
|
+
title: "Chunk cadence"
|
|
33
|
+
}))
|
|
34
|
+
}),
|
|
35
|
+
title: "In-memory audio buffer (testing without a live platform)",
|
|
36
|
+
wiring: {
|
|
37
|
+
code: [
|
|
38
|
+
"createBufferMeetingSourceFactory({",
|
|
39
|
+
"\tchunkMs: ${settings.chunkMs},",
|
|
40
|
+
"\tformat: { channels: 1, container: 'raw', encoding: 'pcm_s16le', sampleRateHz: 16000 },",
|
|
41
|
+
"\t// TODO: supply raw PCM matching `format` (e.g. a recorded test fixture).",
|
|
42
|
+
"\tpcm: new Uint8Array(0)",
|
|
43
|
+
"})"
|
|
44
|
+
].join(`
|
|
45
|
+
`),
|
|
46
|
+
imports: [
|
|
47
|
+
{
|
|
48
|
+
from: "@absolutejs/meeting",
|
|
49
|
+
names: ["createBufferMeetingSourceFactory"]
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
],
|
|
55
|
+
settings: Type.Object({
|
|
56
|
+
languageStrategy: Type.Optional(Type.Union([
|
|
57
|
+
Type.Object({
|
|
58
|
+
allowedLanguages: Type.Optional(Type.Array(Type.String())),
|
|
59
|
+
mode: Type.Literal("auto-detect")
|
|
60
|
+
}),
|
|
61
|
+
Type.Object({
|
|
62
|
+
mode: Type.Literal("fixed"),
|
|
63
|
+
primaryLanguage: Type.String(),
|
|
64
|
+
secondaryLanguages: Type.Optional(Type.Array(Type.String()))
|
|
65
|
+
}),
|
|
66
|
+
Type.Object({
|
|
67
|
+
mode: Type.Literal("allow-switching"),
|
|
68
|
+
primaryLanguage: Type.Optional(Type.String()),
|
|
69
|
+
secondaryLanguages: Type.Array(Type.String())
|
|
70
|
+
})
|
|
71
|
+
], {
|
|
72
|
+
description: "What languages the calls are in. Auto-detect works for most teams; pin a language for better accuracy in single-language calls.",
|
|
73
|
+
title: "Meeting languages"
|
|
74
|
+
})),
|
|
75
|
+
phraseHints: Type.Optional(Type.Array(Type.Object({
|
|
76
|
+
aliases: Type.Optional(Type.Array(Type.String())),
|
|
77
|
+
boost: Type.Optional(Type.Number()),
|
|
78
|
+
text: Type.String()
|
|
79
|
+
}), {
|
|
80
|
+
description: "Names, products, and jargon the transcriber should recognize \u2014 improves accuracy on words unique to your business.",
|
|
81
|
+
title: "Vocabulary hints"
|
|
82
|
+
}))
|
|
83
|
+
}),
|
|
84
|
+
slots: {
|
|
85
|
+
source: {
|
|
86
|
+
configPath: "source",
|
|
87
|
+
contract: "meeting/source-factory",
|
|
88
|
+
description: "The platform the bot joins calls on",
|
|
89
|
+
known: [
|
|
90
|
+
"@absolutejs/meeting-recall",
|
|
91
|
+
"@absolutejs/meeting-discord",
|
|
92
|
+
"@absolutejs/meeting#buffer"
|
|
93
|
+
],
|
|
94
|
+
required: true
|
|
95
|
+
},
|
|
96
|
+
stt: {
|
|
97
|
+
configPath: "stt",
|
|
98
|
+
contract: "voice/stt",
|
|
99
|
+
description: "Who turns the call audio into text",
|
|
100
|
+
known: ["@absolutejs/voice-deepgram"],
|
|
101
|
+
required: true
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
tools: {
|
|
105
|
+
join_meeting: tool.runtime({
|
|
106
|
+
annotations: { idempotentHint: true, openWorldHint: true },
|
|
107
|
+
authorization: {
|
|
108
|
+
approval: "policy",
|
|
109
|
+
audience: "owner",
|
|
110
|
+
destinations: ["configured-meeting-platform"],
|
|
111
|
+
effects: ["write", "external-network"],
|
|
112
|
+
idempotency: { mode: "resource" },
|
|
113
|
+
requiredScopes: ["meeting:join"],
|
|
114
|
+
resource: { idField: "sessionId", type: "active-meeting" },
|
|
115
|
+
reversible: false
|
|
116
|
+
},
|
|
117
|
+
description: "Join one call through the configured platform adapter. The target is adapter-defined: a Meet/Zoom/Teams URL for Recall or a voice-channel id for Discord.",
|
|
118
|
+
handler: async ({ sessionId, target }, meetings) => {
|
|
119
|
+
await meetings.start({ sessionId, target });
|
|
120
|
+
return `joined meeting ${sessionId}`;
|
|
121
|
+
},
|
|
122
|
+
input: Type.Object({
|
|
123
|
+
sessionId: Type.String({ minLength: 1 }),
|
|
124
|
+
target: Type.String({ maxLength: 2048, minLength: 1 })
|
|
125
|
+
})
|
|
126
|
+
}),
|
|
127
|
+
leave_meeting: tool.runtime({
|
|
128
|
+
annotations: { destructiveHint: true, idempotentHint: true },
|
|
129
|
+
authorization: {
|
|
130
|
+
approval: "policy",
|
|
131
|
+
audience: "owner",
|
|
132
|
+
destinations: ["configured-meeting-platform"],
|
|
133
|
+
effects: ["write", "send", "external-network"],
|
|
134
|
+
idempotency: { mode: "resource" },
|
|
135
|
+
requiredScopes: ["meeting:leave"],
|
|
136
|
+
resource: { idField: "sessionId", type: "active-meeting" },
|
|
137
|
+
reversible: false
|
|
138
|
+
},
|
|
139
|
+
description: "Make the bot leave the call, finalize the transcript, and end the session.",
|
|
140
|
+
handler: async ({ reason, sessionId }, meetings) => {
|
|
141
|
+
const stopped = await meetings.stop(sessionId, reason);
|
|
142
|
+
return stopped ? "left the meeting" : "meeting is not active";
|
|
143
|
+
},
|
|
144
|
+
input: Type.Object({
|
|
145
|
+
reason: Type.Optional(Type.String()),
|
|
146
|
+
sessionId: Type.String({ minLength: 1 })
|
|
147
|
+
})
|
|
148
|
+
}),
|
|
149
|
+
active_meetings: tool.runtime({
|
|
150
|
+
annotations: { readOnlyHint: true },
|
|
151
|
+
authorization: {
|
|
152
|
+
approval: "never",
|
|
153
|
+
audience: "owner",
|
|
154
|
+
effects: ["read"],
|
|
155
|
+
requiredScopes: ["meeting:read"]
|
|
156
|
+
},
|
|
157
|
+
description: "List active meeting session identities and targets.",
|
|
158
|
+
handler: (_input, meetings) => JSON.stringify(meetings.list().map(({ sessionId, target }) => ({
|
|
159
|
+
sessionId,
|
|
160
|
+
target
|
|
161
|
+
}))),
|
|
162
|
+
input: Type.Object({})
|
|
163
|
+
}),
|
|
164
|
+
meeting_participants: tool.runtime({
|
|
165
|
+
annotations: { readOnlyHint: true },
|
|
166
|
+
authorization: {
|
|
167
|
+
approval: "never",
|
|
168
|
+
audience: "owner",
|
|
169
|
+
effects: ["read"],
|
|
170
|
+
requiredScopes: ["meeting:read"]
|
|
171
|
+
},
|
|
172
|
+
description: "List the participants the call platform has reported for this meeting.",
|
|
173
|
+
handler: ({ sessionId }, meetings) => {
|
|
174
|
+
const meeting = meetings.get(sessionId);
|
|
175
|
+
if (meeting === undefined)
|
|
176
|
+
return "meeting is not active";
|
|
177
|
+
return JSON.stringify(meeting.getParticipants().map((participant) => ({
|
|
178
|
+
id: participant.id,
|
|
179
|
+
name: participant.name ?? null,
|
|
180
|
+
platform: participant.platform ?? null
|
|
181
|
+
})));
|
|
182
|
+
},
|
|
183
|
+
input: Type.Object({ sessionId: Type.String({ minLength: 1 }) })
|
|
184
|
+
}),
|
|
185
|
+
meeting_transcript: tool.runtime({
|
|
186
|
+
annotations: { readOnlyHint: true },
|
|
187
|
+
authorization: {
|
|
188
|
+
approval: "never",
|
|
189
|
+
audience: "owner",
|
|
190
|
+
effects: ["read"],
|
|
191
|
+
requiredScopes: ["meeting:read"]
|
|
192
|
+
},
|
|
193
|
+
description: "Read the diarized transcript so far \u2014 the most recent turns, each with its speaker and (when known) the resolved participant.",
|
|
194
|
+
handler: ({ limit, sessionId }, meetings) => {
|
|
195
|
+
const meeting = meetings.get(sessionId);
|
|
196
|
+
if (meeting === undefined)
|
|
197
|
+
return "meeting is not active";
|
|
198
|
+
const turns = meeting.getTranscript();
|
|
199
|
+
return JSON.stringify(turns.slice(-(limit ?? DEFAULT_TRANSCRIPT_TURNS)).map((turn) => ({
|
|
200
|
+
participant: turn.participant?.name ?? null,
|
|
201
|
+
speaker: turn.speaker,
|
|
202
|
+
text: turn.text
|
|
203
|
+
})));
|
|
204
|
+
},
|
|
205
|
+
input: Type.Object({
|
|
206
|
+
limit: Type.Optional(Type.Integer({
|
|
207
|
+
default: DEFAULT_TRANSCRIPT_TURNS,
|
|
208
|
+
maximum: MAX_TRANSCRIPT_TURNS,
|
|
209
|
+
minimum: 1
|
|
210
|
+
})),
|
|
211
|
+
sessionId: Type.String({ minLength: 1 })
|
|
212
|
+
})
|
|
213
|
+
}),
|
|
214
|
+
send_chat_message: tool.runtime({
|
|
215
|
+
annotations: { openWorldHint: true },
|
|
216
|
+
authorization: {
|
|
217
|
+
approval: "policy",
|
|
218
|
+
audience: "owner",
|
|
219
|
+
destinations: ["configured-meeting-platform"],
|
|
220
|
+
effects: ["send", "external-network"],
|
|
221
|
+
idempotency: { mode: "resource" },
|
|
222
|
+
requiredScopes: ["meeting:chat:send"],
|
|
223
|
+
resource: { idField: "sessionId", type: "active-meeting" },
|
|
224
|
+
reversible: false
|
|
225
|
+
},
|
|
226
|
+
description: "Post a text message into the call chat as the bot. Fails cleanly when the platform adapter can't write chat (check first: not every source supports it).",
|
|
227
|
+
handler: async ({ sessionId, text }, meetings) => {
|
|
228
|
+
const meeting = meetings.get(sessionId);
|
|
229
|
+
if (meeting === undefined)
|
|
230
|
+
return "meeting is not active";
|
|
231
|
+
if (!meeting.capabilities.canChat) {
|
|
232
|
+
return "this meeting's platform adapter can't post to the call chat";
|
|
233
|
+
}
|
|
234
|
+
await meeting.sendChat(text);
|
|
235
|
+
return "chat message sent";
|
|
236
|
+
},
|
|
237
|
+
input: Type.Object({
|
|
238
|
+
sessionId: Type.String({ minLength: 1 }),
|
|
239
|
+
text: Type.String({ maxLength: MAX_CHAT_LENGTH, minLength: 1 })
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
},
|
|
243
|
+
wiring: [
|
|
244
|
+
{
|
|
245
|
+
description: "Create a multi-session meeting manager. Joining a specific call is an explicit governed action, so installation never contacts a meeting platform.",
|
|
246
|
+
id: "default",
|
|
247
|
+
server: {
|
|
248
|
+
code: [
|
|
249
|
+
"const meetings = createMeetingManager({",
|
|
250
|
+
"\tlanguageStrategy: ${settings.languageStrategy},",
|
|
251
|
+
"\tphraseHints: ${settings.phraseHints},",
|
|
252
|
+
"\tsource: ${slot.source},",
|
|
253
|
+
"\tstt: ${slot.stt}",
|
|
254
|
+
"});"
|
|
255
|
+
].join(`
|
|
256
|
+
`),
|
|
257
|
+
imports: [
|
|
258
|
+
{ from: "@absolutejs/meeting", names: ["createMeetingManager"] }
|
|
259
|
+
],
|
|
260
|
+
placement: "module-scope"
|
|
261
|
+
},
|
|
262
|
+
title: "Create the meeting manager"
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
});
|
|
266
|
+
export {
|
|
267
|
+
manifest
|
|
268
|
+
};
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contract": 2,
|
|
3
|
+
"identity": {
|
|
4
|
+
"accent": "#f97316",
|
|
5
|
+
"category": "voice",
|
|
6
|
+
"description": "Meeting-bot core: join a call through a `MeetingSource` platform adapter (`@absolutejs/meeting-*`), transcribe it live with the `@absolutejs/voice` scribe, and surface diarized turns, the participant roster, and call chat for analysis (deal coaching, summaries, action items). The bot can also speak into the call and post chat where the platform allows.",
|
|
7
|
+
"docsUrl": "https://github.com/absolutejs/meeting",
|
|
8
|
+
"name": "@absolutejs/meeting",
|
|
9
|
+
"tagline": "Put a bot in your meetings — live transcripts and analysis."
|
|
10
|
+
},
|
|
11
|
+
"implements": [
|
|
12
|
+
{
|
|
13
|
+
"contract": "meeting/source-factory",
|
|
14
|
+
"factory": "createBufferMeetingSourceFactory",
|
|
15
|
+
"from": "@absolutejs/meeting",
|
|
16
|
+
"settings": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"chunkMs": {
|
|
20
|
+
"description": "How often a slice of the buffer is emitted, in milliseconds. Default 40.",
|
|
21
|
+
"minimum": 1,
|
|
22
|
+
"title": "Chunk cadence",
|
|
23
|
+
"type": "number"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"title": "In-memory audio buffer (testing without a live platform)",
|
|
28
|
+
"wiring": {
|
|
29
|
+
"code": "createBufferMeetingSourceFactory({\n\tchunkMs: ${settings.chunkMs},\n\tformat: { channels: 1, container: 'raw', encoding: 'pcm_s16le', sampleRateHz: 16000 },\n\t// TODO: supply raw PCM matching `format` (e.g. a recorded test fixture).\n\tpcm: new Uint8Array(0)\n})",
|
|
30
|
+
"imports": [
|
|
31
|
+
{
|
|
32
|
+
"from": "@absolutejs/meeting",
|
|
33
|
+
"names": [
|
|
34
|
+
"createBufferMeetingSourceFactory"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"settings": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"properties": {
|
|
44
|
+
"languageStrategy": {
|
|
45
|
+
"description": "What languages the calls are in. Auto-detect works for most teams; pin a language for better accuracy in single-language calls.",
|
|
46
|
+
"title": "Meeting languages",
|
|
47
|
+
"anyOf": [
|
|
48
|
+
{
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": [
|
|
51
|
+
"mode"
|
|
52
|
+
],
|
|
53
|
+
"properties": {
|
|
54
|
+
"allowedLanguages": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "string"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"mode": {
|
|
61
|
+
"const": "auto-detect",
|
|
62
|
+
"type": "string"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "object",
|
|
68
|
+
"required": [
|
|
69
|
+
"mode",
|
|
70
|
+
"primaryLanguage"
|
|
71
|
+
],
|
|
72
|
+
"properties": {
|
|
73
|
+
"mode": {
|
|
74
|
+
"const": "fixed",
|
|
75
|
+
"type": "string"
|
|
76
|
+
},
|
|
77
|
+
"primaryLanguage": {
|
|
78
|
+
"type": "string"
|
|
79
|
+
},
|
|
80
|
+
"secondaryLanguages": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": {
|
|
83
|
+
"type": "string"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": [
|
|
91
|
+
"mode",
|
|
92
|
+
"secondaryLanguages"
|
|
93
|
+
],
|
|
94
|
+
"properties": {
|
|
95
|
+
"mode": {
|
|
96
|
+
"const": "allow-switching",
|
|
97
|
+
"type": "string"
|
|
98
|
+
},
|
|
99
|
+
"primaryLanguage": {
|
|
100
|
+
"type": "string"
|
|
101
|
+
},
|
|
102
|
+
"secondaryLanguages": {
|
|
103
|
+
"type": "array",
|
|
104
|
+
"items": {
|
|
105
|
+
"type": "string"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"phraseHints": {
|
|
113
|
+
"description": "Names, products, and jargon the transcriber should recognize — improves accuracy on words unique to your business.",
|
|
114
|
+
"title": "Vocabulary hints",
|
|
115
|
+
"type": "array",
|
|
116
|
+
"items": {
|
|
117
|
+
"type": "object",
|
|
118
|
+
"required": [
|
|
119
|
+
"text"
|
|
120
|
+
],
|
|
121
|
+
"properties": {
|
|
122
|
+
"aliases": {
|
|
123
|
+
"type": "array",
|
|
124
|
+
"items": {
|
|
125
|
+
"type": "string"
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"boost": {
|
|
129
|
+
"type": "number"
|
|
130
|
+
},
|
|
131
|
+
"text": {
|
|
132
|
+
"type": "string"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"slots": {
|
|
140
|
+
"source": {
|
|
141
|
+
"configPath": "source",
|
|
142
|
+
"contract": "meeting/source-factory",
|
|
143
|
+
"description": "The platform the bot joins calls on",
|
|
144
|
+
"known": [
|
|
145
|
+
"@absolutejs/meeting-recall",
|
|
146
|
+
"@absolutejs/meeting-discord",
|
|
147
|
+
"@absolutejs/meeting#buffer"
|
|
148
|
+
],
|
|
149
|
+
"required": true
|
|
150
|
+
},
|
|
151
|
+
"stt": {
|
|
152
|
+
"configPath": "stt",
|
|
153
|
+
"contract": "voice/stt",
|
|
154
|
+
"description": "Who turns the call audio into text",
|
|
155
|
+
"known": [
|
|
156
|
+
"@absolutejs/voice-deepgram"
|
|
157
|
+
],
|
|
158
|
+
"required": true
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"wiring": [
|
|
162
|
+
{
|
|
163
|
+
"description": "Create a multi-session meeting manager. Joining a specific call is an explicit governed action, so installation never contacts a meeting platform.",
|
|
164
|
+
"id": "default",
|
|
165
|
+
"server": {
|
|
166
|
+
"code": "const meetings = createMeetingManager({\n\tlanguageStrategy: ${settings.languageStrategy},\n\tphraseHints: ${settings.phraseHints},\n\tsource: ${slot.source},\n\tstt: ${slot.stt}\n});",
|
|
167
|
+
"imports": [
|
|
168
|
+
{
|
|
169
|
+
"from": "@absolutejs/meeting",
|
|
170
|
+
"names": [
|
|
171
|
+
"createMeetingManager"
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"placement": "module-scope"
|
|
176
|
+
},
|
|
177
|
+
"title": "Create the meeting manager"
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"tools": {
|
|
181
|
+
"join_meeting": {
|
|
182
|
+
"annotations": {
|
|
183
|
+
"idempotentHint": true,
|
|
184
|
+
"openWorldHint": true
|
|
185
|
+
},
|
|
186
|
+
"authorization": {
|
|
187
|
+
"approval": "policy",
|
|
188
|
+
"audience": "owner",
|
|
189
|
+
"destinations": [
|
|
190
|
+
"configured-meeting-platform"
|
|
191
|
+
],
|
|
192
|
+
"effects": [
|
|
193
|
+
"write",
|
|
194
|
+
"external-network"
|
|
195
|
+
],
|
|
196
|
+
"idempotency": {
|
|
197
|
+
"mode": "resource"
|
|
198
|
+
},
|
|
199
|
+
"requiredScopes": [
|
|
200
|
+
"meeting:join"
|
|
201
|
+
],
|
|
202
|
+
"resource": {
|
|
203
|
+
"idField": "sessionId",
|
|
204
|
+
"type": "active-meeting"
|
|
205
|
+
},
|
|
206
|
+
"reversible": false
|
|
207
|
+
},
|
|
208
|
+
"description": "Join one call through the configured platform adapter. The target is adapter-defined: a Meet/Zoom/Teams URL for Recall or a voice-channel id for Discord.",
|
|
209
|
+
"input": {
|
|
210
|
+
"type": "object",
|
|
211
|
+
"required": [
|
|
212
|
+
"sessionId",
|
|
213
|
+
"target"
|
|
214
|
+
],
|
|
215
|
+
"properties": {
|
|
216
|
+
"sessionId": {
|
|
217
|
+
"minLength": 1,
|
|
218
|
+
"type": "string"
|
|
219
|
+
},
|
|
220
|
+
"target": {
|
|
221
|
+
"maxLength": 2048,
|
|
222
|
+
"minLength": 1,
|
|
223
|
+
"type": "string"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"kind": "runtime"
|
|
228
|
+
},
|
|
229
|
+
"leave_meeting": {
|
|
230
|
+
"annotations": {
|
|
231
|
+
"destructiveHint": true,
|
|
232
|
+
"idempotentHint": true
|
|
233
|
+
},
|
|
234
|
+
"authorization": {
|
|
235
|
+
"approval": "policy",
|
|
236
|
+
"audience": "owner",
|
|
237
|
+
"destinations": [
|
|
238
|
+
"configured-meeting-platform"
|
|
239
|
+
],
|
|
240
|
+
"effects": [
|
|
241
|
+
"write",
|
|
242
|
+
"send",
|
|
243
|
+
"external-network"
|
|
244
|
+
],
|
|
245
|
+
"idempotency": {
|
|
246
|
+
"mode": "resource"
|
|
247
|
+
},
|
|
248
|
+
"requiredScopes": [
|
|
249
|
+
"meeting:leave"
|
|
250
|
+
],
|
|
251
|
+
"resource": {
|
|
252
|
+
"idField": "sessionId",
|
|
253
|
+
"type": "active-meeting"
|
|
254
|
+
},
|
|
255
|
+
"reversible": false
|
|
256
|
+
},
|
|
257
|
+
"description": "Make the bot leave the call, finalize the transcript, and end the session.",
|
|
258
|
+
"input": {
|
|
259
|
+
"type": "object",
|
|
260
|
+
"required": [
|
|
261
|
+
"sessionId"
|
|
262
|
+
],
|
|
263
|
+
"properties": {
|
|
264
|
+
"reason": {
|
|
265
|
+
"type": "string"
|
|
266
|
+
},
|
|
267
|
+
"sessionId": {
|
|
268
|
+
"minLength": 1,
|
|
269
|
+
"type": "string"
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"kind": "runtime"
|
|
274
|
+
},
|
|
275
|
+
"active_meetings": {
|
|
276
|
+
"annotations": {
|
|
277
|
+
"readOnlyHint": true
|
|
278
|
+
},
|
|
279
|
+
"authorization": {
|
|
280
|
+
"approval": "never",
|
|
281
|
+
"audience": "owner",
|
|
282
|
+
"effects": [
|
|
283
|
+
"read"
|
|
284
|
+
],
|
|
285
|
+
"requiredScopes": [
|
|
286
|
+
"meeting:read"
|
|
287
|
+
]
|
|
288
|
+
},
|
|
289
|
+
"description": "List active meeting session identities and targets.",
|
|
290
|
+
"input": {
|
|
291
|
+
"type": "object",
|
|
292
|
+
"properties": {}
|
|
293
|
+
},
|
|
294
|
+
"kind": "runtime"
|
|
295
|
+
},
|
|
296
|
+
"meeting_participants": {
|
|
297
|
+
"annotations": {
|
|
298
|
+
"readOnlyHint": true
|
|
299
|
+
},
|
|
300
|
+
"authorization": {
|
|
301
|
+
"approval": "never",
|
|
302
|
+
"audience": "owner",
|
|
303
|
+
"effects": [
|
|
304
|
+
"read"
|
|
305
|
+
],
|
|
306
|
+
"requiredScopes": [
|
|
307
|
+
"meeting:read"
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
"description": "List the participants the call platform has reported for this meeting.",
|
|
311
|
+
"input": {
|
|
312
|
+
"type": "object",
|
|
313
|
+
"required": [
|
|
314
|
+
"sessionId"
|
|
315
|
+
],
|
|
316
|
+
"properties": {
|
|
317
|
+
"sessionId": {
|
|
318
|
+
"minLength": 1,
|
|
319
|
+
"type": "string"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"kind": "runtime"
|
|
324
|
+
},
|
|
325
|
+
"meeting_transcript": {
|
|
326
|
+
"annotations": {
|
|
327
|
+
"readOnlyHint": true
|
|
328
|
+
},
|
|
329
|
+
"authorization": {
|
|
330
|
+
"approval": "never",
|
|
331
|
+
"audience": "owner",
|
|
332
|
+
"effects": [
|
|
333
|
+
"read"
|
|
334
|
+
],
|
|
335
|
+
"requiredScopes": [
|
|
336
|
+
"meeting:read"
|
|
337
|
+
]
|
|
338
|
+
},
|
|
339
|
+
"description": "Read the diarized transcript so far — the most recent turns, each with its speaker and (when known) the resolved participant.",
|
|
340
|
+
"input": {
|
|
341
|
+
"type": "object",
|
|
342
|
+
"required": [
|
|
343
|
+
"sessionId"
|
|
344
|
+
],
|
|
345
|
+
"properties": {
|
|
346
|
+
"limit": {
|
|
347
|
+
"default": 50,
|
|
348
|
+
"maximum": 200,
|
|
349
|
+
"minimum": 1,
|
|
350
|
+
"type": "integer"
|
|
351
|
+
},
|
|
352
|
+
"sessionId": {
|
|
353
|
+
"minLength": 1,
|
|
354
|
+
"type": "string"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"kind": "runtime"
|
|
359
|
+
},
|
|
360
|
+
"send_chat_message": {
|
|
361
|
+
"annotations": {
|
|
362
|
+
"openWorldHint": true
|
|
363
|
+
},
|
|
364
|
+
"authorization": {
|
|
365
|
+
"approval": "policy",
|
|
366
|
+
"audience": "owner",
|
|
367
|
+
"destinations": [
|
|
368
|
+
"configured-meeting-platform"
|
|
369
|
+
],
|
|
370
|
+
"effects": [
|
|
371
|
+
"send",
|
|
372
|
+
"external-network"
|
|
373
|
+
],
|
|
374
|
+
"idempotency": {
|
|
375
|
+
"mode": "resource"
|
|
376
|
+
},
|
|
377
|
+
"requiredScopes": [
|
|
378
|
+
"meeting:chat:send"
|
|
379
|
+
],
|
|
380
|
+
"resource": {
|
|
381
|
+
"idField": "sessionId",
|
|
382
|
+
"type": "active-meeting"
|
|
383
|
+
},
|
|
384
|
+
"reversible": false
|
|
385
|
+
},
|
|
386
|
+
"description": "Post a text message into the call chat as the bot. Fails cleanly when the platform adapter can't write chat (check first: not every source supports it).",
|
|
387
|
+
"input": {
|
|
388
|
+
"type": "object",
|
|
389
|
+
"required": [
|
|
390
|
+
"sessionId",
|
|
391
|
+
"text"
|
|
392
|
+
],
|
|
393
|
+
"properties": {
|
|
394
|
+
"sessionId": {
|
|
395
|
+
"minLength": 1,
|
|
396
|
+
"type": "string"
|
|
397
|
+
},
|
|
398
|
+
"text": {
|
|
399
|
+
"maxLength": 2000,
|
|
400
|
+
"minLength": 1,
|
|
401
|
+
"type": "string"
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"kind": "runtime"
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|