@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.
@@ -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
@@ -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":"bbfe097613a0ef70c2ce1eec54a0e2d023498c430027f28f2565592e8e35a05e","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-call-source.ts","extensions/slack-huddles/src/transports/slack-huddles-status-prejoin-source.ts","extensions/slack-huddles/src/transports/slack-huddles-urls.ts"]}],"unrenderedSources":[]}
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; } catch {}
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
- function pageIdentityFunctionSource(expectedIdentity) {
365
- return `const meetingIdentity = (rawUrl) => {
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
- inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
382
- inCall: SLACK_HUDDLE_SELECTORS.inCall
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: slackHuddleStatusCall,
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: slackHuddleOrigin,
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.10.10",
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.10.10"
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.10.10"
29
+ "pluginApi": ">=2026.11.5-beta.1"
30
30
  },
31
31
  "build": {
32
- "openclawVersion": "2026.10.10",
32
+ "openclawVersion": "2026.11.5-beta.1",
33
33
  "bundledDist": false
34
34
  },
35
35
  "release": {