@openclaw/slack-huddles 2026.10.10-beta.5 → 2026.11.5-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/assets/activity.svg
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"entries":[{"output":"cli-metadata.js","source":"extensions/slack-huddles/cli-metadata.ts"},{"output":"index.js","source":"extensions/slack-huddles/index.ts"}],"chunks":[{"output":"cli-metadata.js","sha256":"
|
|
1
|
+
{"version":3,"entries":[{"output":"cli-metadata.js","source":"extensions/slack-huddles/cli-metadata.ts"},{"output":"index.js","source":"extensions/slack-huddles/index.ts"}],"chunks":[{"output":"cli-metadata.js","sha256":"1779ebf5020851985bc2c41d6b9fdc019e0082b702e9dba3cb22320813963c50","facadeSource":"extensions/slack-huddles/cli-metadata.ts","sources":["extensions/slack-huddles/cli-metadata.ts"]},{"output":"index.js","sha256":"a98123779695cd2472eded47b0ebd0c72d920c845f3c330c87772395d973a1c9","facadeSource":"extensions/slack-huddles/index.ts","sources":["extensions/slack-huddles/index.ts","extensions/slack-huddles/src/errors.ts","extensions/slack-huddles/src/transports/slack-huddles-page-scripts.ts","extensions/slack-huddles/src/transports/slack-huddles-platform-adapter.ts","extensions/slack-huddles/src/transports/slack-huddles-selectors.ts","extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts","extensions/slack-huddles/src/transports/slack-huddles-urls.ts"]}],"unrenderedSources":[]}
|
package/dist/cli-metadata.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getRootOptionAwareCommandPath } from "openclaw/plugin-sdk/cli-argv";
|
|
2
|
-
|
|
2
|
+
// extensions/slack-huddles/cli-metadata.ts
|
|
3
3
|
const descriptor = {
|
|
4
4
|
name: "slackhuddles",
|
|
5
5
|
description: "Join and manage Slack huddle participants",
|
|
@@ -15,5 +15,4 @@ const SLACK_HUDDLES_CLI_METADATA = {
|
|
|
15
15
|
api.registerCli(() => {}, { descriptors: [descriptor] });
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
|
-
//#endregion
|
|
19
18
|
export { SLACK_HUDDLES_CLI_METADATA, SLACK_HUDDLES_CLI_METADATA as default };
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,9 @@ import { SLACK_HUDDLES_CLI_METADATA } from "./cli-metadata.js";
|
|
|
2
2
|
import { MeetingPlatformAdapter } from "openclaw/plugin-sdk/meeting-runtime";
|
|
3
3
|
import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
|
|
4
4
|
import { REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME } from "openclaw/plugin-sdk/realtime-voice";
|
|
5
|
-
|
|
5
|
+
// extensions/slack-huddles/src/errors.ts
|
|
6
6
|
var SlackHuddlesInvalidRequestError = class extends Error {};
|
|
7
|
-
|
|
8
|
-
//#region extensions/slack-huddles/src/transports/slack-huddles-selectors.ts
|
|
7
|
+
// extensions/slack-huddles/src/transports/slack-huddles-selectors.ts
|
|
9
8
|
const SLACK_HUDDLE_SELECTORS = {
|
|
10
9
|
preview: ["[data-qa=\"huddle_join_preview_modal\"]"],
|
|
11
10
|
join: ["[data-qa=\"huddle_join_preview_modal_go\"]"],
|
|
@@ -60,30 +59,7 @@ const SLACK_HUDDLE_SELECTORS = {
|
|
|
60
59
|
captionAuthor: [".p-huddle_closed_caption_event__member_name"],
|
|
61
60
|
captionText: [".p-huddle_closed_caption_event__event_text span[data-qa=\"huddle_closed_caption_event\"]", "[data-qa=\"huddle_transcribe_event\"]"]
|
|
62
61
|
};
|
|
63
|
-
|
|
64
|
-
//#region extensions/slack-huddles/src/transports/slack-huddles-status-call-source.ts
|
|
65
|
-
const slackHuddleStatusCall = {
|
|
66
|
-
liveOwnershipSource: "authorityHolds()",
|
|
67
|
-
afterAudioRoutingSource: `if (inCall && !authorityHolds()) inCall = false;
|
|
68
|
-
if (inCall && allowMicrophone) {
|
|
69
|
-
refreshAudioInput();
|
|
70
|
-
if (canMutateSession && !audioInputRouted && readMicrophone() === "on") await setMicrophone("off");
|
|
71
|
-
}`,
|
|
72
|
-
captionEnableSource: `if (inCall && !authorityHolds()) {
|
|
73
|
-
inCall = false;
|
|
74
|
-
notes.push("Slack huddle membership changed during status; captions were not collected.");
|
|
75
|
-
}
|
|
76
|
-
if (inCall && captureCaptions && !captionsEnabledNow) {
|
|
77
|
-
notes.push("Slack captions are off or not visible. Enable the Slack preference to turn on captions by default when joining huddles.");
|
|
78
|
-
}`,
|
|
79
|
-
extraResultSource: `inCall: inCall && authorityHolds(),
|
|
80
|
-
meetingTitle: inCall && authorityHolds() ? text(firstRaw(selectors.title)) || undefined : undefined,
|
|
81
|
-
participantCount: inCall && authorityHolds()
|
|
82
|
-
? new Set(selectors.participants.flatMap((selector) => [...document.querySelectorAll(selector)])).size
|
|
83
|
-
: undefined,`
|
|
84
|
-
};
|
|
85
|
-
//#endregion
|
|
86
|
-
//#region extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts
|
|
62
|
+
// extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts
|
|
87
63
|
const SLACK_HUDDLE_JOIN_SETTLE_MS = 3e4;
|
|
88
64
|
const slackHuddleStatusPrelude = {
|
|
89
65
|
controlLookupSource: `const findTextButton = (root, pattern) => [...(root?.querySelectorAll("button") || [])]
|
|
@@ -125,7 +101,7 @@ const slackHuddleStatusPrelude = {
|
|
|
125
101
|
let pageTeam;
|
|
126
102
|
try {
|
|
127
103
|
pageTeam = new URL(location.href).pathname.match(/^\\/(?:client|huddle)\\/([TE][A-Z0-9]{8,})\\//)?.[1];
|
|
128
|
-
} catch {}
|
|
104
|
+
} catch { /* An unparseable page URL cannot establish workspace membership. */ }
|
|
129
105
|
if (pageTeam) {
|
|
130
106
|
(window.__openclawSlackHuddleWorkspaces ||= {})[expectedIdentity] = pageTeam;
|
|
131
107
|
workspaceBound = true;
|
|
@@ -195,7 +171,8 @@ const slackHuddleStatusPrelude = {
|
|
|
195
171
|
/^\\/(?:signin|workspace-signin|get-started|check-login|ssb\\/signin)(?:\\/|$)/i.test(location.pathname);
|
|
196
172
|
let microphonePermissionState;
|
|
197
173
|
if (allowMicrophone && navigator.permissions?.query) {
|
|
198
|
-
try { microphonePermissionState = (await navigator.permissions.query({ name: "microphone" })).state; }
|
|
174
|
+
try { microphonePermissionState = (await navigator.permissions.query({ name: "microphone" })).state; }
|
|
175
|
+
catch { /* Unsupported permission queries leave permission state unknown. */ }
|
|
199
176
|
}
|
|
200
177
|
if (committedOwnerConflict && !canMutateSession) {
|
|
201
178
|
manualAction = manualActionFor("slack-session-conflict", "This Slack tab is owned by another active huddle session.");
|
|
@@ -324,8 +301,7 @@ const slackHuddleStatusPrelude = {
|
|
|
324
301
|
}`,
|
|
325
302
|
manualActionSource: ""
|
|
326
303
|
};
|
|
327
|
-
|
|
328
|
-
//#region extensions/slack-huddles/src/transports/slack-huddles-urls.ts
|
|
304
|
+
// extensions/slack-huddles/src/transports/slack-huddles-urls.ts
|
|
329
305
|
function parseSlackHuddleIdentity(input) {
|
|
330
306
|
if (!input) return;
|
|
331
307
|
const value = input.trim();
|
|
@@ -364,10 +340,22 @@ function isSameSlackHuddleUrl(left, right) {
|
|
|
364
340
|
function isRecoverableSlackHuddleTab(tab, url) {
|
|
365
341
|
return url ? isSameSlackHuddleUrl(tab.url, url) : Boolean(normalizeSlackHuddleUrlForReuse(tab.url));
|
|
366
342
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
343
|
+
// extensions/slack-huddles/src/transports/slack-huddles-page-scripts.ts
|
|
344
|
+
const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
345
|
+
platform: {
|
|
346
|
+
audioOutputElementIdPrefix: "openclaw-slack-huddle-audio-output-",
|
|
347
|
+
manualActionReasonPrefix: "slack",
|
|
348
|
+
displayName: "Slack huddle",
|
|
349
|
+
globals: {
|
|
350
|
+
audioOutputs: "__openclawSlackHuddleAudioOutputs",
|
|
351
|
+
captionArchive: "__openclawSlackHuddleCaptionArchive",
|
|
352
|
+
captions: "__openclawSlackHuddleCaptions",
|
|
353
|
+
meeting: "__openclawSlackHuddle"
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
normalizeUrl: normalizeSlackHuddleUrlForReuse,
|
|
357
|
+
pageIdentitySource: (expectedIdentity) => {
|
|
358
|
+
return `const meetingIdentity = (rawUrl) => {
|
|
371
359
|
try {
|
|
372
360
|
const url = new URL(rawUrl);
|
|
373
361
|
if (url.protocol !== "https:" || url.port || url.username || url.password ||
|
|
@@ -383,9 +371,9 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
383
371
|
// The URL names only the viewed channel. While a call is live, only Slack's membership header for
|
|
384
372
|
// that channel (or this session's own settling Join) vouches for it; anything else fails closed.
|
|
385
373
|
const hooks = ${JSON.stringify({
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
374
|
+
inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
|
|
375
|
+
inCall: SLACK_HUDDLE_SELECTORS.inCall
|
|
376
|
+
})};
|
|
389
377
|
const found = (list) => list.some((selector) => document.querySelector(selector));
|
|
390
378
|
const marker = window.__openclawSlackHuddle;
|
|
391
379
|
const settlingJoin = marker?.identity === identity && marker.joinRequested === true &&
|
|
@@ -399,21 +387,7 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
399
387
|
: identity;
|
|
400
388
|
} catch { return undefined; }
|
|
401
389
|
};`;
|
|
402
|
-
}
|
|
403
|
-
const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
404
|
-
platform: {
|
|
405
|
-
audioOutputElementIdPrefix: "openclaw-slack-huddle-audio-output-",
|
|
406
|
-
manualActionReasonPrefix: "slack",
|
|
407
|
-
displayName: "Slack huddle",
|
|
408
|
-
globals: {
|
|
409
|
-
audioOutputs: "__openclawSlackHuddleAudioOutputs",
|
|
410
|
-
captionArchive: "__openclawSlackHuddleCaptionArchive",
|
|
411
|
-
captions: "__openclawSlackHuddleCaptions",
|
|
412
|
-
meeting: "__openclawSlackHuddle"
|
|
413
|
-
}
|
|
414
390
|
},
|
|
415
|
-
normalizeUrl: normalizeSlackHuddleUrlForReuse,
|
|
416
|
-
pageIdentitySource: pageIdentityFunctionSource,
|
|
417
391
|
selectors: SLACK_HUDDLE_SELECTORS,
|
|
418
392
|
toggleStateFunction: () => `(input) => {
|
|
419
393
|
if (input?.ariaChecked === "true") return "on";
|
|
@@ -423,7 +397,26 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
423
397
|
return undefined;
|
|
424
398
|
}`,
|
|
425
399
|
statusPrelude: slackHuddleStatusPrelude,
|
|
426
|
-
statusCall:
|
|
400
|
+
statusCall: {
|
|
401
|
+
liveOwnershipSource: "authorityHolds()",
|
|
402
|
+
afterAudioRoutingSource: `if (inCall && !authorityHolds()) inCall = false;
|
|
403
|
+
if (inCall && allowMicrophone) {
|
|
404
|
+
refreshAudioInput();
|
|
405
|
+
if (canMutateSession && !audioInputRouted && readMicrophone() === "on") await setMicrophone("off");
|
|
406
|
+
}`,
|
|
407
|
+
captionEnableSource: `if (inCall && !authorityHolds()) {
|
|
408
|
+
inCall = false;
|
|
409
|
+
notes.push("Slack huddle membership changed during status; captions were not collected.");
|
|
410
|
+
}
|
|
411
|
+
if (inCall && captureCaptions && !captionsEnabledNow) {
|
|
412
|
+
notes.push("Slack captions are off or not visible. Enable the Slack preference to turn on captions by default when joining huddles.");
|
|
413
|
+
}`,
|
|
414
|
+
extraResultSource: `inCall: inCall && authorityHolds(),
|
|
415
|
+
meetingTitle: inCall && authorityHolds() ? text(firstRaw(selectors.title)) || undefined : undefined,
|
|
416
|
+
participantCount: inCall && authorityHolds()
|
|
417
|
+
? new Set(selectors.participants.flatMap((selector) => [...document.querySelectorAll(selector)])).size
|
|
418
|
+
: undefined,`
|
|
419
|
+
},
|
|
427
420
|
audioOwnershipSource: ({ expectedIdentity, pageIdentitySource }) => `
|
|
428
421
|
${pageIdentitySource}
|
|
429
422
|
const expectedIdentity = ${JSON.stringify(expectedIdentity)};
|
|
@@ -462,11 +455,7 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
462
455
|
(!state?.sessionId && currentIdentity === expectedIdentity && (!state?.identity || state.identity === expectedIdentity));`
|
|
463
456
|
}
|
|
464
457
|
});
|
|
465
|
-
|
|
466
|
-
//#region extensions/slack-huddles/src/transports/slack-huddles-platform-adapter.ts
|
|
467
|
-
function slackHuddleOrigin(meetingUrl) {
|
|
468
|
-
return normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0;
|
|
469
|
-
}
|
|
458
|
+
// extensions/slack-huddles/src/transports/slack-huddles-platform-adapter.ts
|
|
470
459
|
const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
471
460
|
id: "slack-huddles",
|
|
472
461
|
displayName: "Slack huddles",
|
|
@@ -507,12 +496,11 @@ const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
|
507
496
|
manualActionReasonPrefix: "slack",
|
|
508
497
|
retryCaptions: false,
|
|
509
498
|
unavailableMessage: "Open the OpenClaw browser profile, finish Slack sign-in, admission, or permission prompt, then retry.",
|
|
510
|
-
origin:
|
|
499
|
+
origin: (meetingUrl) => normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0,
|
|
511
500
|
scripts: slackHuddlePageScripts
|
|
512
501
|
})
|
|
513
502
|
});
|
|
514
|
-
|
|
515
|
-
//#region extensions/slack-huddles/index.ts
|
|
503
|
+
// extensions/slack-huddles/index.ts
|
|
516
504
|
const slackHuddlesPlugin = MeetingPlatformAdapter.defineBrowserMeetingPlugin({
|
|
517
505
|
platform: SLACK_HUDDLES_PLATFORM_ADAPTER,
|
|
518
506
|
labels: {
|
|
@@ -559,5 +547,4 @@ const slackHuddlesPlugin = MeetingPlatformAdapter.defineBrowserMeetingPlugin({
|
|
|
559
547
|
}
|
|
560
548
|
});
|
|
561
549
|
var slack_huddles_default = slackHuddlesPlugin.plugin;
|
|
562
|
-
//#endregion
|
|
563
550
|
export { slack_huddles_default as default, slackHuddlesPlugin };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/slack-huddles",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.11.5-beta.1",
|
|
4
4
|
"description": "OpenClaw Slack huddle browser meeting participant plugin.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"openclaw": ">=2026.
|
|
11
|
+
"openclaw": ">=2026.11.5-beta.1"
|
|
12
12
|
},
|
|
13
13
|
"peerDependenciesMeta": {
|
|
14
14
|
"openclaw": {
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"minHostVersion": ">=2026.9.8"
|
|
27
27
|
},
|
|
28
28
|
"compat": {
|
|
29
|
-
"pluginApi": ">=2026.
|
|
29
|
+
"pluginApi": ">=2026.11.5-beta.1"
|
|
30
30
|
},
|
|
31
31
|
"build": {
|
|
32
|
-
"openclawVersion": "2026.
|
|
32
|
+
"openclawVersion": "2026.11.5-beta.1",
|
|
33
33
|
"bundledDist": false
|
|
34
34
|
},
|
|
35
35
|
"release": {
|