@openclaw/slack-huddles 2026.10.10 → 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":"1779ebf5020851985bc2c41d6b9fdc019e0082b702e9dba3cb22320813963c50","facadeSource":"extensions/slack-huddles/cli-metadata.ts","sources":["extensions/slack-huddles/cli-metadata.ts"]},{"output":"index.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/index.js
CHANGED
|
@@ -59,27 +59,6 @@ const SLACK_HUDDLE_SELECTORS = {
|
|
|
59
59
|
captionAuthor: [".p-huddle_closed_caption_event__member_name"],
|
|
60
60
|
captionText: [".p-huddle_closed_caption_event__event_text span[data-qa=\"huddle_closed_caption_event\"]", "[data-qa=\"huddle_transcribe_event\"]"]
|
|
61
61
|
};
|
|
62
|
-
// extensions/slack-huddles/src/transports/slack-huddles-status-call-source.ts
|
|
63
|
-
const slackHuddleStatusCall = {
|
|
64
|
-
liveOwnershipSource: "authorityHolds()",
|
|
65
|
-
afterAudioRoutingSource: `if (inCall && !authorityHolds()) inCall = false;
|
|
66
|
-
if (inCall && allowMicrophone) {
|
|
67
|
-
refreshAudioInput();
|
|
68
|
-
if (canMutateSession && !audioInputRouted && readMicrophone() === "on") await setMicrophone("off");
|
|
69
|
-
}`,
|
|
70
|
-
captionEnableSource: `if (inCall && !authorityHolds()) {
|
|
71
|
-
inCall = false;
|
|
72
|
-
notes.push("Slack huddle membership changed during status; captions were not collected.");
|
|
73
|
-
}
|
|
74
|
-
if (inCall && captureCaptions && !captionsEnabledNow) {
|
|
75
|
-
notes.push("Slack captions are off or not visible. Enable the Slack preference to turn on captions by default when joining huddles.");
|
|
76
|
-
}`,
|
|
77
|
-
extraResultSource: `inCall: inCall && authorityHolds(),
|
|
78
|
-
meetingTitle: inCall && authorityHolds() ? text(firstRaw(selectors.title)) || undefined : undefined,
|
|
79
|
-
participantCount: inCall && authorityHolds()
|
|
80
|
-
? new Set(selectors.participants.flatMap((selector) => [...document.querySelectorAll(selector)])).size
|
|
81
|
-
: undefined,`
|
|
82
|
-
};
|
|
83
62
|
// extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts
|
|
84
63
|
const SLACK_HUDDLE_JOIN_SETTLE_MS = 3e4;
|
|
85
64
|
const slackHuddleStatusPrelude = {
|
|
@@ -122,7 +101,7 @@ const slackHuddleStatusPrelude = {
|
|
|
122
101
|
let pageTeam;
|
|
123
102
|
try {
|
|
124
103
|
pageTeam = new URL(location.href).pathname.match(/^\\/(?:client|huddle)\\/([TE][A-Z0-9]{8,})\\//)?.[1];
|
|
125
|
-
} catch {}
|
|
104
|
+
} catch { /* An unparseable page URL cannot establish workspace membership. */ }
|
|
126
105
|
if (pageTeam) {
|
|
127
106
|
(window.__openclawSlackHuddleWorkspaces ||= {})[expectedIdentity] = pageTeam;
|
|
128
107
|
workspaceBound = true;
|
|
@@ -192,7 +171,8 @@ const slackHuddleStatusPrelude = {
|
|
|
192
171
|
/^\\/(?:signin|workspace-signin|get-started|check-login|ssb\\/signin)(?:\\/|$)/i.test(location.pathname);
|
|
193
172
|
let microphonePermissionState;
|
|
194
173
|
if (allowMicrophone && navigator.permissions?.query) {
|
|
195
|
-
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. */ }
|
|
196
176
|
}
|
|
197
177
|
if (committedOwnerConflict && !canMutateSession) {
|
|
198
178
|
manualAction = manualActionFor("slack-session-conflict", "This Slack tab is owned by another active huddle session.");
|
|
@@ -361,8 +341,21 @@ function isRecoverableSlackHuddleTab(tab, url) {
|
|
|
361
341
|
return url ? isSameSlackHuddleUrl(tab.url, url) : Boolean(normalizeSlackHuddleUrlForReuse(tab.url));
|
|
362
342
|
}
|
|
363
343
|
// extensions/slack-huddles/src/transports/slack-huddles-page-scripts.ts
|
|
364
|
-
|
|
365
|
-
|
|
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) => {
|
|
366
359
|
try {
|
|
367
360
|
const url = new URL(rawUrl);
|
|
368
361
|
if (url.protocol !== "https:" || url.port || url.username || url.password ||
|
|
@@ -378,9 +371,9 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
378
371
|
// The URL names only the viewed channel. While a call is live, only Slack's membership header for
|
|
379
372
|
// that channel (or this session's own settling Join) vouches for it; anything else fails closed.
|
|
380
373
|
const hooks = ${JSON.stringify({
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
374
|
+
inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
|
|
375
|
+
inCall: SLACK_HUDDLE_SELECTORS.inCall
|
|
376
|
+
})};
|
|
384
377
|
const found = (list) => list.some((selector) => document.querySelector(selector));
|
|
385
378
|
const marker = window.__openclawSlackHuddle;
|
|
386
379
|
const settlingJoin = marker?.identity === identity && marker.joinRequested === true &&
|
|
@@ -394,21 +387,7 @@ function pageIdentityFunctionSource(expectedIdentity) {
|
|
|
394
387
|
: identity;
|
|
395
388
|
} catch { return undefined; }
|
|
396
389
|
};`;
|
|
397
|
-
}
|
|
398
|
-
const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
399
|
-
platform: {
|
|
400
|
-
audioOutputElementIdPrefix: "openclaw-slack-huddle-audio-output-",
|
|
401
|
-
manualActionReasonPrefix: "slack",
|
|
402
|
-
displayName: "Slack huddle",
|
|
403
|
-
globals: {
|
|
404
|
-
audioOutputs: "__openclawSlackHuddleAudioOutputs",
|
|
405
|
-
captionArchive: "__openclawSlackHuddleCaptionArchive",
|
|
406
|
-
captions: "__openclawSlackHuddleCaptions",
|
|
407
|
-
meeting: "__openclawSlackHuddle"
|
|
408
|
-
}
|
|
409
390
|
},
|
|
410
|
-
normalizeUrl: normalizeSlackHuddleUrlForReuse,
|
|
411
|
-
pageIdentitySource: pageIdentityFunctionSource,
|
|
412
391
|
selectors: SLACK_HUDDLE_SELECTORS,
|
|
413
392
|
toggleStateFunction: () => `(input) => {
|
|
414
393
|
if (input?.ariaChecked === "true") return "on";
|
|
@@ -418,7 +397,26 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
418
397
|
return undefined;
|
|
419
398
|
}`,
|
|
420
399
|
statusPrelude: slackHuddleStatusPrelude,
|
|
421
|
-
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
|
+
},
|
|
422
420
|
audioOwnershipSource: ({ expectedIdentity, pageIdentitySource }) => `
|
|
423
421
|
${pageIdentitySource}
|
|
424
422
|
const expectedIdentity = ${JSON.stringify(expectedIdentity)};
|
|
@@ -458,9 +456,6 @@ const slackHuddlePageScripts = MeetingPlatformAdapter.createPageScripts({
|
|
|
458
456
|
}
|
|
459
457
|
});
|
|
460
458
|
// extensions/slack-huddles/src/transports/slack-huddles-platform-adapter.ts
|
|
461
|
-
function slackHuddleOrigin(meetingUrl) {
|
|
462
|
-
return normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0;
|
|
463
|
-
}
|
|
464
459
|
const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
465
460
|
id: "slack-huddles",
|
|
466
461
|
displayName: "Slack huddles",
|
|
@@ -501,7 +496,7 @@ const SLACK_HUDDLES_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
|
501
496
|
manualActionReasonPrefix: "slack",
|
|
502
497
|
retryCaptions: false,
|
|
503
498
|
unavailableMessage: "Open the OpenClaw browser profile, finish Slack sign-in, admission, or permission prompt, then retry.",
|
|
504
|
-
origin:
|
|
499
|
+
origin: (meetingUrl) => normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0,
|
|
505
500
|
scripts: slackHuddlePageScripts
|
|
506
501
|
})
|
|
507
502
|
});
|
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": {
|