@openclaw/slack-huddles 2026.11.3 → 2026.11.5-beta.2
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
|
@@ -0,0 +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":"736d2c1b31d62584ef5e4af71c7793b52c45b006e1d46db8bc2941113349011e","facadeSource":"extensions/slack-huddles/cli-metadata.ts","sources":["extensions/slack-huddles/cli-metadata.ts"]},{"output":"index.js","sha256":"7771f1ea5d657cfda58f1a3284acfdab43880916d060e8568009c4407201756c","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/index.js
CHANGED
|
@@ -61,28 +61,6 @@ const SLACK_HUDDLE_SELECTORS = {
|
|
|
61
61
|
captionText: [".p-huddle_closed_caption_event__event_text span[data-qa=\"huddle_closed_caption_event\"]", "[data-qa=\"huddle_transcribe_event\"]"]
|
|
62
62
|
};
|
|
63
63
|
//#endregion
|
|
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
64
|
//#region extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts
|
|
87
65
|
const SLACK_HUDDLE_JOIN_SETTLE_MS = 3e4;
|
|
88
66
|
const slackHuddleStatusPrelude = {
|
|
@@ -125,7 +103,7 @@ const slackHuddleStatusPrelude = {
|
|
|
125
103
|
let pageTeam;
|
|
126
104
|
try {
|
|
127
105
|
pageTeam = new URL(location.href).pathname.match(/^\\/(?:client|huddle)\\/([TE][A-Z0-9]{8,})\\//)?.[1];
|
|
128
|
-
} catch {}
|
|
106
|
+
} catch { /* An unparseable page URL cannot establish workspace membership. */ }
|
|
129
107
|
if (pageTeam) {
|
|
130
108
|
(window.__openclawSlackHuddleWorkspaces ||= {})[expectedIdentity] = pageTeam;
|
|
131
109
|
workspaceBound = true;
|
|
@@ -195,7 +173,8 @@ const slackHuddleStatusPrelude = {
|
|
|
195
173
|
/^\\/(?:signin|workspace-signin|get-started|check-login|ssb\\/signin)(?:\\/|$)/i.test(location.pathname);
|
|
196
174
|
let microphonePermissionState;
|
|
197
175
|
if (allowMicrophone && navigator.permissions?.query) {
|
|
198
|
-
try { microphonePermissionState = (await navigator.permissions.query({ name: "microphone" })).state; }
|
|
176
|
+
try { microphonePermissionState = (await navigator.permissions.query({ name: "microphone" })).state; }
|
|
177
|
+
catch { /* Unsupported permission queries leave permission state unknown. */ }
|
|
199
178
|
}
|
|
200
179
|
if (committedOwnerConflict && !canMutateSession) {
|
|
201
180
|
manualAction = manualActionFor("slack-session-conflict", "This Slack tab is owned by another active huddle session.");
|
|
@@ -366,8 +345,21 @@ function isRecoverableSlackHuddleTab(tab, url) {
|
|
|
366
345
|
}
|
|
367
346
|
//#endregion
|
|
368
347
|
//#region extensions/slack-huddles/src/transports/slack-huddles-page-scripts.ts
|
|
369
|
-
|
|
370
|
-
|
|
348
|
+
const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
349
|
+
platform: {
|
|
350
|
+
audioOutputElementIdPrefix: "openclaw-slack-huddle-audio-output-",
|
|
351
|
+
manualActionReasonPrefix: "slack",
|
|
352
|
+
displayName: "Slack huddle",
|
|
353
|
+
globals: {
|
|
354
|
+
audioOutputs: "__openclawSlackHuddleAudioOutputs",
|
|
355
|
+
captionArchive: "__openclawSlackHuddleCaptionArchive",
|
|
356
|
+
captions: "__openclawSlackHuddleCaptions",
|
|
357
|
+
meeting: "__openclawSlackHuddle"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
normalizeUrl: normalizeSlackHuddleUrlForReuse,
|
|
361
|
+
pageIdentitySource: (expectedIdentity) => {
|
|
362
|
+
return `const meetingIdentity = (rawUrl) => {
|
|
371
363
|
try {
|
|
372
364
|
const url = new URL(rawUrl);
|
|
373
365
|
if (url.protocol !== "https:" || url.port || url.username || url.password ||
|
|
@@ -383,9 +375,9 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
383
375
|
// The URL names only the viewed channel. While a call is live, only Slack's membership header for
|
|
384
376
|
// that channel (or this session's own settling Join) vouches for it; anything else fails closed.
|
|
385
377
|
const hooks = ${JSON.stringify({
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
378
|
+
inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
|
|
379
|
+
inCall: SLACK_HUDDLE_SELECTORS.inCall
|
|
380
|
+
})};
|
|
389
381
|
const found = (list) => list.some((selector) => document.querySelector(selector));
|
|
390
382
|
const marker = window.__openclawSlackHuddle;
|
|
391
383
|
const settlingJoin = marker?.identity === identity && marker.joinRequested === true &&
|
|
@@ -399,21 +391,7 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
399
391
|
: identity;
|
|
400
392
|
} catch { return undefined; }
|
|
401
393
|
};`;
|
|
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
394
|
},
|
|
415
|
-
normalizeUrl: normalizeSlackHuddleUrlForReuse,
|
|
416
|
-
pageIdentitySource: pageIdentityFunctionSource,
|
|
417
395
|
selectors: SLACK_HUDDLE_SELECTORS,
|
|
418
396
|
toggleStateFunction: () => `(input) => {
|
|
419
397
|
if (input?.ariaChecked === "true") return "on";
|
|
@@ -423,7 +401,26 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
423
401
|
return undefined;
|
|
424
402
|
}`,
|
|
425
403
|
statusPrelude: slackHuddleStatusPrelude,
|
|
426
|
-
statusCall:
|
|
404
|
+
statusCall: {
|
|
405
|
+
liveOwnershipSource: "authorityHolds()",
|
|
406
|
+
afterAudioRoutingSource: `if (inCall && !authorityHolds()) inCall = false;
|
|
407
|
+
if (inCall && allowMicrophone) {
|
|
408
|
+
refreshAudioInput();
|
|
409
|
+
if (canMutateSession && !audioInputRouted && readMicrophone() === "on") await setMicrophone("off");
|
|
410
|
+
}`,
|
|
411
|
+
captionEnableSource: `if (inCall && !authorityHolds()) {
|
|
412
|
+
inCall = false;
|
|
413
|
+
notes.push("Slack huddle membership changed during status; captions were not collected.");
|
|
414
|
+
}
|
|
415
|
+
if (inCall && captureCaptions && !captionsEnabledNow) {
|
|
416
|
+
notes.push("Slack captions are off or not visible. Enable the Slack preference to turn on captions by default when joining huddles.");
|
|
417
|
+
}`,
|
|
418
|
+
extraResultSource: `inCall: inCall && authorityHolds(),
|
|
419
|
+
meetingTitle: inCall && authorityHolds() ? text(firstRaw(selectors.title)) || undefined : undefined,
|
|
420
|
+
participantCount: inCall && authorityHolds()
|
|
421
|
+
? new Set(selectors.participants.flatMap((selector) => [...document.querySelectorAll(selector)])).size
|
|
422
|
+
: undefined,`
|
|
423
|
+
},
|
|
427
424
|
audioOwnershipSource: ({ expectedIdentity, pageIdentitySource }) => `
|
|
428
425
|
${pageIdentitySource}
|
|
429
426
|
const expectedIdentity = ${JSON.stringify(expectedIdentity)};
|
|
@@ -464,9 +461,6 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
464
461
|
});
|
|
465
462
|
//#endregion
|
|
466
463
|
//#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
|
-
}
|
|
470
464
|
const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
471
465
|
id: "slack-huddles",
|
|
472
466
|
displayName: "Slack huddles",
|
|
@@ -507,7 +501,7 @@ const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
|
507
501
|
manualActionReasonPrefix: "slack",
|
|
508
502
|
retryCaptions: false,
|
|
509
503
|
unavailableMessage: "Open the OpenClaw browser profile, finish Slack sign-in, admission, or permission prompt, then retry.",
|
|
510
|
-
origin:
|
|
504
|
+
origin: (meetingUrl) => normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0,
|
|
511
505
|
scripts: slackHuddlePageScripts
|
|
512
506
|
})
|
|
513
507
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/slack-huddles",
|
|
3
|
-
"version": "2026.11.
|
|
3
|
+
"version": "2026.11.5-beta.2",
|
|
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.
|
|
11
|
+
"openclaw": ">=2026.11.5-beta.2"
|
|
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.11.
|
|
29
|
+
"pluginApi": ">=2026.11.5-beta.2"
|
|
30
30
|
},
|
|
31
31
|
"build": {
|
|
32
|
-
"openclawVersion": "2026.11.
|
|
32
|
+
"openclawVersion": "2026.11.5-beta.2",
|
|
33
33
|
"bundledDist": false
|
|
34
34
|
},
|
|
35
35
|
"release": {
|