@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.
@@ -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":"736d2c1b31d62584ef5e4af71c7793b52c45b006e1d46db8bc2941113349011e","facadeSource":"extensions/slack-huddles/cli-metadata.ts","sources":["extensions/slack-huddles/cli-metadata.ts"]},{"output":"index.js","sha256":"5cba375e0559bc7d0aa96e65479574bfe569b5c4f1807bc3cbd9020cac6f7b69","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":[]}
@@ -1,5 +1,5 @@
1
1
  import { getRootOptionAwareCommandPath } from "openclaw/plugin-sdk/cli-argv";
2
- //#region extensions/slack-huddles/cli-metadata.ts
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
- //#region extensions/slack-huddles/src/errors.ts
5
+ // extensions/slack-huddles/src/errors.ts
6
6
  var SlackHuddlesInvalidRequestError = class extends Error {};
7
- //#endregion
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
- //#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
- //#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; } catch {}
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
- //#endregion
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
- //#endregion
368
- //#region extensions/slack-huddles/src/transports/slack-huddles-page-scripts.ts
369
- function pageIdentityFunctionSource(expectedIdentity) {
370
- return `const meetingIdentity = (rawUrl) => {
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
- inHuddle: SLACK_HUDDLE_SELECTORS.channelHeaderInHuddle,
387
- inCall: SLACK_HUDDLE_SELECTORS.inCall
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: 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
+ },
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
- //#endregion
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: slackHuddleOrigin,
499
+ origin: (meetingUrl) => normalizeSlackHuddleUrlForReuse(meetingUrl) ? "https://app.slack.com" : void 0,
511
500
  scripts: slackHuddlePageScripts
512
501
  })
513
502
  });
514
- //#endregion
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.10.10-beta.5",
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-beta.5"
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-beta.5"
29
+ "pluginApi": ">=2026.11.5-beta.1"
30
30
  },
31
31
  "build": {
32
- "openclawVersion": "2026.10.10-beta.5",
32
+ "openclawVersion": "2026.11.5-beta.1",
33
33
  "bundledDist": false
34
34
  },
35
35
  "release": {