@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.
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-1.714286 -1.714286 27.428572 27.428572">
2
2
  <!--
3
3
  Source: simple-icons@13.21.0, icons/slack.svg
4
4
  https://www.npmjs.com/package/simple-icons/v/13.21.0
@@ -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; } catch {}
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
- function pageIdentityFunctionSource(expectedIdentity) {
370
- return `const meetingIdentity = (rawUrl) => {
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
- inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
387
- inCall: SLACK_HUDDLE_SELECTORS.inCall
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: slackHuddleStatusCall,
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: slackHuddleOrigin,
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",
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.3"
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.3"
29
+ "pluginApi": ">=2026.11.5-beta.2"
30
30
  },
31
31
  "build": {
32
- "openclawVersion": "2026.11.3",
32
+ "openclawVersion": "2026.11.5-beta.2",
33
33
  "bundledDist": false
34
34
  },
35
35
  "release": {