sealclaw 2026.7.29 → 2026.7.30

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.
Files changed (24) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/build-info.json +3 -3
  3. package/dist/{channel-BK9zHrYN.js → channel-BLm40qc7.js} +10 -10
  4. package/dist/{channels.cn-Buix7ae-.js → channels.cn-DAG4fol_.js} +24 -4
  5. package/dist/cli-startup-metadata.json +1 -1
  6. package/dist/extensions/feishu/api.js +2 -2
  7. package/dist/extensions/feishu/channel-plugin-api.js +1 -1
  8. package/dist/extensions/feishu/index.js +1 -1
  9. package/dist/extensions/feishu/setup-api.js +1 -1
  10. package/dist/gateway/server.js +1 -1
  11. package/dist/{lark-cli-DSD2dZbN.js → lark-cli-BfLpX7UJ.js} +1 -1
  12. package/dist/{lark-cli-X9ksa9sV.js → lark-cli-CvYGYXO9.js} +3 -1
  13. package/dist/{message-handler-DCUtahkd.js → message-handler-C0wuchVM.js} +1 -1
  14. package/dist/{monitor-DBiRTDG7.js → monitor-SDF3Cq9V.js} +1 -1
  15. package/dist/{monitor.account-Buqn31nP.js → monitor.account-C9H4fNuT.js} +71 -48
  16. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  17. package/dist/postinstall-inventory.json +13 -13
  18. package/dist/{server-methods-DhK_tx6O.js → server-methods-D-2SBsLi.js} +1 -1
  19. package/dist/{server-plugin-bootstrap-B9AZTmfO.js → server-plugin-bootstrap-CmtBet1G.js} +1 -1
  20. package/dist/{server-plugins-D1lwAViQ.js → server-plugins-CXmbhH3C.js} +1 -1
  21. package/dist/{server-startup-plugins-0E76wiXn.js → server-startup-plugins-CD669zFA.js} +1 -1
  22. package/dist/{server-ws-runtime-CVpsmRTi.js → server-ws-runtime-D-Rc5DAy.js} +1 -1
  23. package/dist/{server.impl-CS2qhNzH.js → server.impl-D--I0QBQ.js} +6 -6
  24. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -109,6 +109,8 @@ Docs: https://docs.openclaw.ai
109
109
 
110
110
  ### Fixes
111
111
 
112
+ - Control UI/Feishu: detect when the installed lark-cli is still bound to a previous Feishu application after credential reconfiguration, require fresh authorization, and pass the active App ID explicitly when rebinding so CLI sends use the newly selected application.
113
+ - Feishu: resolve ambiguous `private` message events through the chat API's `chat_mode` before routing, so private groups remain group sessions while true one-to-one chats and lookup failures retain direct-message safeguards.
112
114
  - Feishu/Gateway: stop prompt-segment tracing from looping past end-of-input when group mention metadata is the final prompt block, preventing one processed group message from starving the Gateway event loop.
113
115
  - Control UI/Models: accept nullable and string-valued optional metadata from the SeaSeek model catalog so production refreshes replace stale persisted model lists instead of failing Gateway validation.
114
116
  - Control UI/Skill Center: match installed store skills by stable skill id before name so renamed skills correctly show the available update action.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.7.29",
3
- "commit": "87b3b8d4f5a8c40bd43ef20cf889f849f39d9d7e",
4
- "builtAt": "2026-07-31T17:55:09.244Z"
2
+ "version": "2026.7.30",
3
+ "commit": "862aba9e5c7c38e926d3015af24e75aca36538d1",
4
+ "builtAt": "2026-08-01T13:13:37.379Z"
5
5
  }
@@ -1587,31 +1587,31 @@ const feishuPlugin = createChatChannelPlugin({
1587
1587
  gateway: {
1588
1588
  connector: {
1589
1589
  cancelLogin: async () => {
1590
- await (await import("./lark-cli-DSD2dZbN.js")).cancelLarkCliLogin();
1590
+ await (await import("./lark-cli-BfLpX7UJ.js")).cancelLarkCliLogin();
1591
1591
  },
1592
- getStatus: async () => await (await import("./lark-cli-DSD2dZbN.js")).getLarkCliStatus(),
1592
+ getStatus: async () => await (await import("./lark-cli-BfLpX7UJ.js")).getLarkCliStatus(),
1593
1593
  install: async () => {
1594
- (await import("./lark-cli-DSD2dZbN.js")).startLarkCliInstall();
1594
+ (await import("./lark-cli-BfLpX7UJ.js")).startLarkCliInstall();
1595
1595
  },
1596
1596
  uninstall: async () => {
1597
- await (await import("./lark-cli-DSD2dZbN.js")).uninstallLarkCli();
1597
+ await (await import("./lark-cli-BfLpX7UJ.js")).uninstallLarkCli();
1598
1598
  },
1599
1599
  enable: async () => {
1600
- await (await import("./lark-cli-DSD2dZbN.js")).enableLarkCli();
1600
+ await (await import("./lark-cli-BfLpX7UJ.js")).enableLarkCli();
1601
1601
  },
1602
1602
  disable: async () => {
1603
- await (await import("./lark-cli-DSD2dZbN.js")).disableLarkCli();
1603
+ await (await import("./lark-cli-BfLpX7UJ.js")).disableLarkCli();
1604
1604
  },
1605
1605
  bind: async ({ appId }) => {
1606
- await (await import("./lark-cli-DSD2dZbN.js")).bindLarkCliToOpenClaw(appId);
1606
+ await (await import("./lark-cli-BfLpX7UJ.js")).bindLarkCliToOpenClaw(appId);
1607
1607
  },
1608
- login: async () => await (await import("./lark-cli-DSD2dZbN.js")).startLarkCliLogin(),
1609
- logout: async () => await (await import("./lark-cli-DSD2dZbN.js")).logoutLarkCli()
1608
+ login: async () => await (await import("./lark-cli-BfLpX7UJ.js")).startLarkCliLogin(),
1609
+ logout: async () => await (await import("./lark-cli-BfLpX7UJ.js")).logoutLarkCli()
1610
1610
  },
1611
1611
  loginWithQrStart: async (params) => await (await import("./qr-login-xoeCYnaL.js")).startFeishuQrLogin(params),
1612
1612
  loginWithQrWait: async (params) => await (await import("./qr-login-xoeCYnaL.js")).waitForFeishuQrLogin(params),
1613
1613
  startAccount: async (ctx) => {
1614
- const { monitorFeishuProvider } = await import("./monitor-DBiRTDG7.js");
1614
+ const { monitorFeishuProvider } = await import("./monitor-SDF3Cq9V.js");
1615
1615
  const account = resolveFeishuRuntimeAccount({
1616
1616
  cfg: ctx.cfg,
1617
1617
  accountId: ctx.accountId
@@ -682,6 +682,25 @@ async function getPluginConnector(channel) {
682
682
  function shouldSyncFeishuQuickConnect(config) {
683
683
  return config.enabled === false || Object.prototype.hasOwnProperty.call(config, "app_id") || Object.prototype.hasOwnProperty.call(config, "app_secret");
684
684
  }
685
+ function resolveFeishuConnectorAppId(cfg) {
686
+ const feishu = cfg.channels?.feishu;
687
+ const rootAppId = typeof feishu?.appId === "string" ? feishu.appId.trim() : "";
688
+ if (rootAppId) return rootAppId;
689
+ const accountId = feishu?.defaultAccount?.trim() || "default";
690
+ const accountAppId = feishu?.accounts?.[accountId]?.appId;
691
+ return typeof accountAppId === "string" && accountAppId.trim() ? accountAppId.trim() : void 0;
692
+ }
693
+ function reconcileFeishuConnectorStatus(status, cfg) {
694
+ const expectedAppId = resolveFeishuConnectorAppId(cfg);
695
+ const rawAppId = status.appId;
696
+ const boundAppId = typeof rawAppId === "string" ? rawAppId.trim() : void 0;
697
+ if (!expectedAppId || !boundAppId || expectedAppId === boundAppId) return status;
698
+ return {
699
+ ...status,
700
+ configured: false,
701
+ authenticated: false
702
+ };
703
+ }
685
704
  const ILINK_BASE_URL = "https://ilinkai.weixin.qq.com";
686
705
  function makeilinkHeaders(botToken = "") {
687
706
  const uinVal = Math.floor(Math.random() * 4294967295);
@@ -1061,7 +1080,7 @@ const channelsCnHandlers = {
1061
1080
  respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(err)));
1062
1081
  }
1063
1082
  },
1064
- "channels.cn.connector.status": async ({ params, respond }) => {
1083
+ "channels.cn.connector.status": async ({ params, respond, context }) => {
1065
1084
  const channel = typeof params.channel === "string" ? params.channel : "";
1066
1085
  const connector = await getPluginConnector(channel);
1067
1086
  if (!connector) {
@@ -1069,7 +1088,8 @@ const channelsCnHandlers = {
1069
1088
  return;
1070
1089
  }
1071
1090
  try {
1072
- const status = await connector.getStatus();
1091
+ const rawStatus = await connector.getStatus();
1092
+ const status = channel === "feishu" ? reconcileFeishuConnectorStatus(rawStatus, context.getRuntimeConfig()) : rawStatus;
1073
1093
  syncConnectorAgentCapabilities(channel, status);
1074
1094
  respond(true, status, void 0);
1075
1095
  } catch (err) {
@@ -1090,7 +1110,7 @@ const channelsCnHandlers = {
1090
1110
  respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(err)));
1091
1111
  }
1092
1112
  },
1093
- "channels.cn.connector.bind": async ({ params, respond }) => {
1113
+ "channels.cn.connector.bind": async ({ params, respond, context }) => {
1094
1114
  const channel = typeof params.channel === "string" ? params.channel : "";
1095
1115
  const bind = (await getPluginConnector(channel))?.bind;
1096
1116
  if (!bind) {
@@ -1098,7 +1118,7 @@ const channelsCnHandlers = {
1098
1118
  return;
1099
1119
  }
1100
1120
  try {
1101
- await bind({ appId: typeof params.appId === "string" ? params.appId : void 0 });
1121
+ await bind({ appId: (typeof params.appId === "string" ? params.appId.trim() : "") || (channel === "feishu" ? resolveFeishuConnectorAppId(context.getRuntimeConfig()) : void 0) || void 0 });
1102
1122
  respond(true, { configured: true }, void 0);
1103
1123
  } catch (err) {
1104
1124
  respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(err)));
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "channelCatalogSignature": "8b05d554ebbdc12aba364c8b9e3e57964185f1aa",
19
19
  "rootHelpBundleSignature": "3aa6587c4af3fc358d2243b2cc8c0d184ba89a01",
20
- "rootHelpText": "\n🦞 SealClaw 2026.7.29 (87b3b8d) — I'm like tmux: confusing at first, then suddenly you can't live without me.\n\nUsage: openclaw [options] [command]\n\nOptions:\n --container <name> Run the CLI inside a running Podman/Docker container\n named <name> (default: env OPENCLAW_CONTAINER)\n --dev Dev profile: isolate state under ~/.openclaw-dev, default\n gateway port 19001, and shift derived ports\n (browser/canvas)\n -h, --help Display help for command\n --log-level <level> Global log level override for file + console\n (silent|fatal|error|warn|info|debug|trace)\n --no-color Disable ANSI colors\n --profile <name> Use a named profile (isolates\n OPENCLAW_STATE_DIR/OPENCLAW_CONFIG_PATH under\n ~/.openclaw-<name>)\n -V, --version output the version number\n\nCommands:\n Hint: commands suffixed with * have subcommands. Run <command> --help for details.\n acp * Agent Control Protocol tools\n agent Run one agent turn via the Gateway\n agents * Manage isolated agents (workspaces, auth, routing)\n approvals * Manage exec approvals (gateway or node host)\n backup * Create and verify local backup archives for OpenClaw\n state\n capability * Run provider-backed inference commands (fallback alias:\n infer)\n channels * Manage connected chat channels (Telegram, Discord, etc.)\n chat Open a local terminal UI (alias for tui --local)\n clawbot * Legacy clawbot command aliases\n commitments * List and manage inferred follow-up commitments\n completion Generate shell completion script\n config * Non-interactive config helpers\n (get/set/unset/file/validate). Default: starts guided\n setup.\n configure Interactive configuration for credentials, channels,\n gateway, and agent defaults\n crestodian Open the ring-zero setup and repair helper\n cron * Manage cron jobs via the Gateway scheduler\n daemon * Gateway service (legacy alias)\n dashboard Open the Control UI with your current token\n devices * Device pairing + token management\n directory * Lookup contact and group IDs (self, peers, groups) for\n supported chat channels\n dns * DNS helpers for wide-area discovery (Tailscale + CoreDNS)\n docs Search the live OpenClaw docs\n doctor Health checks + quick fixes for the gateway and channels\n exec-policy * Show or synchronize requested exec policy with host\n approvals\n gateway * Run, inspect, and query the WebSocket Gateway\n health Fetch health from the running gateway\n help Display help for command\n hooks * Manage internal agent hooks\n infer * Run provider-backed inference commands\n logs Tail gateway file logs via RPC\n mcp * Manage OpenClaw MCP config and channel bridge\n memory Search, inspect, and reindex memory files\n message * Send, read, and manage messages\n migrate * Import state from another agent system\n models * Discover, scan, and configure models\n node * Run and manage the headless node host service\n nodes * Manage gateway-owned node pairing and node commands\n onboard Interactive onboarding for gateway, workspace, and skills\n pairing * Secure DM pairing (approve inbound requests)\n plugins * Manage OpenClaw plugins\n proxy * Run the OpenClaw debug proxy and inspect captured traffic\n qr Generate mobile pairing QR/setup code\n reset Reset local config/state (keeps the CLI installed)\n sandbox * Manage sandbox containers for agent isolation\n secrets * Secrets runtime reload controls\n security * Security tools and local config audits\n sessions * List stored conversation sessions\n setup Initialize local config and agent workspace\n skills * List and inspect available skills\n status Show channel health and recent session recipients\n system * System events, heartbeat, and presence\n tasks * Inspect durable background task state\n terminal Open a local terminal UI (alias for tui --local)\n tui Open a terminal UI connected to the Gateway\n uninstall Uninstall the gateway service + local data (CLI remains)\n update * Update OpenClaw and inspect update channel status\n webhooks * Webhook helpers and integrations\n\nExamples:\n openclaw models --help\n Show detailed help for the models command.\n openclaw channels login --verbose\n Link personal WhatsApp Web and show QR + connection logs.\n openclaw message send --target +15555550123 --message \"Hi\" --json\n Send via your web session and print JSON result.\n openclaw gateway --port 18789\n Run the WebSocket Gateway locally.\n openclaw --dev gateway\n Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.\n openclaw gateway --force\n Kill anything bound to the default gateway port, then start it.\n openclaw gateway ...\n Gateway control via WebSocket.\n openclaw agent --to +15555550123 --message \"Run summary\" --deliver\n Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.\n openclaw message send --channel telegram --target @mychat --message \"Hi\"\n Send via your Telegram bot.\n\nDocs: https://docs.openclaw.ai/cli\n\n"
20
+ "rootHelpText": "\n🦞 SealClaw 2026.7.30 (862aba9) — I'm the middleware between your ambition and your attention span.\n\nUsage: openclaw [options] [command]\n\nOptions:\n --container <name> Run the CLI inside a running Podman/Docker container\n named <name> (default: env OPENCLAW_CONTAINER)\n --dev Dev profile: isolate state under ~/.openclaw-dev, default\n gateway port 19001, and shift derived ports\n (browser/canvas)\n -h, --help Display help for command\n --log-level <level> Global log level override for file + console\n (silent|fatal|error|warn|info|debug|trace)\n --no-color Disable ANSI colors\n --profile <name> Use a named profile (isolates\n OPENCLAW_STATE_DIR/OPENCLAW_CONFIG_PATH under\n ~/.openclaw-<name>)\n -V, --version output the version number\n\nCommands:\n Hint: commands suffixed with * have subcommands. Run <command> --help for details.\n acp * Agent Control Protocol tools\n agent Run one agent turn via the Gateway\n agents * Manage isolated agents (workspaces, auth, routing)\n approvals * Manage exec approvals (gateway or node host)\n backup * Create and verify local backup archives for OpenClaw\n state\n capability * Run provider-backed inference commands (fallback alias:\n infer)\n channels * Manage connected chat channels (Telegram, Discord, etc.)\n chat Open a local terminal UI (alias for tui --local)\n clawbot * Legacy clawbot command aliases\n commitments * List and manage inferred follow-up commitments\n completion Generate shell completion script\n config * Non-interactive config helpers\n (get/set/unset/file/validate). Default: starts guided\n setup.\n configure Interactive configuration for credentials, channels,\n gateway, and agent defaults\n crestodian Open the ring-zero setup and repair helper\n cron * Manage cron jobs via the Gateway scheduler\n daemon * Gateway service (legacy alias)\n dashboard Open the Control UI with your current token\n devices * Device pairing + token management\n directory * Lookup contact and group IDs (self, peers, groups) for\n supported chat channels\n dns * DNS helpers for wide-area discovery (Tailscale + CoreDNS)\n docs Search the live OpenClaw docs\n doctor Health checks + quick fixes for the gateway and channels\n exec-policy * Show or synchronize requested exec policy with host\n approvals\n gateway * Run, inspect, and query the WebSocket Gateway\n health Fetch health from the running gateway\n help Display help for command\n hooks * Manage internal agent hooks\n infer * Run provider-backed inference commands\n logs Tail gateway file logs via RPC\n mcp * Manage OpenClaw MCP config and channel bridge\n memory Search, inspect, and reindex memory files\n message * Send, read, and manage messages\n migrate * Import state from another agent system\n models * Discover, scan, and configure models\n node * Run and manage the headless node host service\n nodes * Manage gateway-owned node pairing and node commands\n onboard Interactive onboarding for gateway, workspace, and skills\n pairing * Secure DM pairing (approve inbound requests)\n plugins * Manage OpenClaw plugins\n proxy * Run the OpenClaw debug proxy and inspect captured traffic\n qr Generate mobile pairing QR/setup code\n reset Reset local config/state (keeps the CLI installed)\n sandbox * Manage sandbox containers for agent isolation\n secrets * Secrets runtime reload controls\n security * Security tools and local config audits\n sessions * List stored conversation sessions\n setup Initialize local config and agent workspace\n skills * List and inspect available skills\n status Show channel health and recent session recipients\n system * System events, heartbeat, and presence\n tasks * Inspect durable background task state\n terminal Open a local terminal UI (alias for tui --local)\n tui Open a terminal UI connected to the Gateway\n uninstall Uninstall the gateway service + local data (CLI remains)\n update * Update OpenClaw and inspect update channel status\n webhooks * Webhook helpers and integrations\n\nExamples:\n openclaw models --help\n Show detailed help for the models command.\n openclaw channels login --verbose\n Link personal WhatsApp Web and show QR + connection logs.\n openclaw message send --target +15555550123 --message \"Hi\" --json\n Send via your web session and print JSON result.\n openclaw gateway --port 18789\n Run the WebSocket Gateway locally.\n openclaw --dev gateway\n Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.\n openclaw gateway --force\n Kill anything bound to the default gateway port, then start it.\n openclaw gateway ...\n Gateway control via WebSocket.\n openclaw agent --to +15555550123 --message \"Run summary\" --deliver\n Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.\n openclaw message send --channel telegram --target @mychat --message \"Hi\"\n Send via your Telegram bot.\n\nDocs: https://docs.openclaw.ai/cli\n\n"
21
21
  }
@@ -8,12 +8,12 @@ import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as bu
8
8
  import { n as createFeishuThreadBindingManager, r as getFeishuThreadBindingManager, t as __testing } from "../../thread-bindings-BrZyYary.js";
9
9
  import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "../../subagent-hooks-CIJsmAE8.js";
10
10
  import { r as listEnabledFeishuAccounts } from "../../accounts-mmubi9Q_.js";
11
- import { n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "../../channel-BK9zHrYN.js";
11
+ import { n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "../../channel-BLm40qc7.js";
12
12
  import { r as setFeishuNamedAccountEnabled, t as feishuSetupAdapter } from "../../setup-core-DIh8Guzo.js";
13
13
  import { t as getFeishuRuntime } from "../../runtime-BFyqvmDG.js";
14
14
  import { M as createFeishuToolClient, N as resolveAnyEnabledFeishuToolsConfig, P as resolveFeishuToolAccount, c as registerFeishuChatTools, n as registerFeishuDriveTools } from "../../drive-rnAtPbcg.js";
15
15
  import { n as toolExecutionErrorResult, r as unknownToolActionResult, t as jsonToolResult } from "../../tool-result-CtEBdctx.js";
16
- import { h as registerFeishuCliIntegration } from "../../lark-cli-X9ksa9sV.js";
16
+ import { h as registerFeishuCliIntegration } from "../../lark-cli-CvYGYXO9.js";
17
17
  import { existsSync } from "node:fs";
18
18
  import { basename, isAbsolute, resolve } from "node:path";
19
19
  import { homedir } from "node:os";
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "../../channel-BK9zHrYN.js";
1
+ import { t as feishuPlugin } from "../../channel-BLm40qc7.js";
2
2
  export { feishuPlugin };
@@ -62,7 +62,7 @@ var feishu_default = defineBundledChannelEntry({
62
62
  },
63
63
  registerCliMetadata(api) {
64
64
  api.registerCli(async ({ program }) => {
65
- const { registerFeishuCli } = await import("../../lark-cli-DSD2dZbN.js");
65
+ const { registerFeishuCli } = await import("../../lark-cli-BfLpX7UJ.js");
66
66
  registerFeishuCli(program);
67
67
  }, { descriptors: [{
68
68
  name: "feishu-cli",
@@ -1,3 +1,3 @@
1
- import { n as feishuSetupWizard, t as feishuPlugin } from "../../channel-BK9zHrYN.js";
1
+ import { n as feishuSetupWizard, t as feishuPlugin } from "../../channel-BLm40qc7.js";
2
2
  import { t as feishuSetupAdapter } from "../../setup-core-DIh8Guzo.js";
3
3
  export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
@@ -9,7 +9,7 @@ async function loadServerImpl() {
9
9
  const startupStartedAt = performance.now();
10
10
  const before = performance.now();
11
11
  try {
12
- return await import("../server.impl-CS2qhNzH.js");
12
+ return await import("../server.impl-D--I0QBQ.js");
13
13
  } finally {
14
14
  const now = performance.now();
15
15
  emitStartupTrace("gateway.server-impl-import", now - before, now - startupStartedAt);
@@ -1,2 +1,2 @@
1
- import { _ as startLarkCliLogin, a as enableLarkCli, c as getLarkCliStatus, d as logoutLarkCli, g as startLarkCliInstall, i as disableLarkCli, m as registerFeishuCli, r as cancelLarkCliLogin, t as bindLarkCliToOpenClaw, v as uninstallLarkCli } from "./lark-cli-X9ksa9sV.js";
1
+ import { _ as startLarkCliLogin, a as enableLarkCli, c as getLarkCliStatus, d as logoutLarkCli, g as startLarkCliInstall, i as disableLarkCli, m as registerFeishuCli, r as cancelLarkCliLogin, t as bindLarkCliToOpenClaw, v as uninstallLarkCli } from "./lark-cli-CvYGYXO9.js";
2
2
  export { bindLarkCliToOpenClaw, cancelLarkCliLogin, disableLarkCli, enableLarkCli, getLarkCliStatus, logoutLarkCli, registerFeishuCli, startLarkCliInstall, startLarkCliLogin, uninstallLarkCli };
@@ -140,6 +140,7 @@ function collectIdentityRecords(status) {
140
140
  }
141
141
  function parseLarkCliStatus(params) {
142
142
  const config = parseFirstJsonObject(params.configOutput ?? "");
143
+ const appId = config ? readString(config, ["appId", "app_id"]) : void 0;
143
144
  const auth = parseFirstJsonObject(params.authOutput ?? "");
144
145
  const identities = auth && isRecord(auth.identities) ? auth.identities : void 0;
145
146
  const userIdentity = identities && isRecord(identities.user) ? identities.user : void 0;
@@ -165,8 +166,9 @@ function parseLarkCliStatus(params) {
165
166
  return {
166
167
  installed: params.installed,
167
168
  downloading: Boolean(installTask),
168
- configured: Boolean(config && readString(config, ["appId", "app_id"])),
169
+ configured: Boolean(appId),
169
170
  authenticated,
171
+ ...appId ? { appId } : {},
170
172
  ...userName ? { userName } : {},
171
173
  ...tenantName ? { tenantName } : {},
172
174
  ...installError ? { error: installError } : {},
@@ -1458,7 +1458,7 @@ function attachGatewayWsMessageHandler(params) {
1458
1458
  });
1459
1459
  };
1460
1460
  (async () => {
1461
- const { handleGatewayRequest } = await import("./server-methods-DhK_tx6O.js");
1461
+ const { handleGatewayRequest } = await import("./server-methods-D-2SBsLi.js");
1462
1462
  await handleGatewayRequest({
1463
1463
  req,
1464
1464
  respond,
@@ -3,7 +3,7 @@ import { l as fetchBotIdentityForMonitor } from "./monitor.state-BTOOUYq4.js";
3
3
  //#region extensions/feishu/src/monitor.ts
4
4
  let monitorAccountRuntimePromise;
5
5
  async function loadMonitorAccountRuntime() {
6
- monitorAccountRuntimePromise ??= import("./monitor.account-Buqn31nP.js");
6
+ monitorAccountRuntimePromise ??= import("./monitor.account-C9H4fNuT.js");
7
7
  return await monitorAccountRuntimePromise;
8
8
  }
9
9
  async function monitorFeishuProvider(opts = {}) {
@@ -181,6 +181,62 @@ async function resolveFeishuSenderName(params) {
181
181
  return permissionError ? { permissionError } : {};
182
182
  }
183
183
  //#endregion
184
+ //#region extensions/feishu/src/chat-type.ts
185
+ const resolvedChatTypeCache = /* @__PURE__ */ new Map();
186
+ const CHAT_TYPE_CACHE_TTL_MS = 30 * 6e4;
187
+ const CHAT_TYPE_CACHE_MAX_SIZE = 5e3;
188
+ function normalizeConversationType(value) {
189
+ if (value === "group" || value === "topic" || value === "topic_group" || value === "public") return "group";
190
+ if (value === "p2p") return "p2p";
191
+ }
192
+ function normalizeChatPrivacy(value) {
193
+ if (value === "public") return "group";
194
+ if (value === "private") return "p2p";
195
+ }
196
+ function pruneChatTypeCache(now) {
197
+ for (const [key, entry] of resolvedChatTypeCache.entries()) if (entry.expiresAt <= now) resolvedChatTypeCache.delete(key);
198
+ if (resolvedChatTypeCache.size > CHAT_TYPE_CACHE_MAX_SIZE) {
199
+ const excess = resolvedChatTypeCache.size - CHAT_TYPE_CACHE_MAX_SIZE;
200
+ const iterator = resolvedChatTypeCache.keys();
201
+ for (let index = 0; index < excess; index++) {
202
+ const key = iterator.next().value;
203
+ if (key !== void 0) resolvedChatTypeCache.delete(key);
204
+ }
205
+ }
206
+ }
207
+ function sanitizeLogValue(value) {
208
+ return value.replace(/[\r\n]/g, " ").slice(0, 500);
209
+ }
210
+ async function resolveFeishuConversationChatType(params) {
211
+ const explicitChatType = normalizeConversationType(params.chatType);
212
+ if (explicitChatType) return explicitChatType;
213
+ const chatId = params.chatId?.trim();
214
+ if (!chatId) return "p2p";
215
+ const cacheKey = `${params.account.accountId}:${chatId}`;
216
+ const now = Date.now();
217
+ pruneChatTypeCache(now);
218
+ const cached = resolvedChatTypeCache.get(cacheKey);
219
+ if (cached) return cached.value;
220
+ try {
221
+ const response = await createFeishuClient(params.account).im.chat.get({ path: { chat_id: chatId } });
222
+ if (response.code === 0) {
223
+ const resolvedChatType = normalizeConversationType(response.data?.chat_mode) ?? normalizeChatPrivacy(response.data?.chat_type);
224
+ if (resolvedChatType) {
225
+ resolvedChatTypeCache.set(cacheKey, {
226
+ value: resolvedChatType,
227
+ expiresAt: now + CHAT_TYPE_CACHE_TTL_MS
228
+ });
229
+ return resolvedChatType;
230
+ }
231
+ params.log(`feishu[${params.account.accountId}]: chat lookup missing conversation type; defaulting to p2p`);
232
+ } else params.log(`feishu[${params.account.accountId}]: failed to resolve chat type: ${sanitizeLogValue(response.msg ?? "unknown error")}; defaulting to p2p`);
233
+ } catch (error) {
234
+ const message = error instanceof Error ? error.message : "unknown";
235
+ params.log(`feishu[${params.account.accountId}]: failed to resolve chat type: ${sanitizeLogValue(message)}; defaulting to p2p`);
236
+ }
237
+ return "p2p";
238
+ }
239
+ //#endregion
184
240
  //#region extensions/feishu/src/processing-claims.ts
185
241
  const EVENT_DEDUP_TTL_MS = 300 * 1e3;
186
242
  const EVENT_MEMORY_MAX_SIZE = 2e3;
@@ -1571,6 +1627,15 @@ async function handleFeishuMessage(params) {
1571
1627
  return;
1572
1628
  }
1573
1629
  let ctx = parseFeishuMessageEvent(event, botOpenId, botName);
1630
+ if (ctx.chatType === "private") ctx = {
1631
+ ...ctx,
1632
+ chatType: await resolveFeishuConversationChatType({
1633
+ account,
1634
+ chatId: ctx.chatId,
1635
+ chatType: ctx.chatType,
1636
+ log
1637
+ })
1638
+ };
1574
1639
  const isGroup = isFeishuGroupChatType(ctx.chatType);
1575
1640
  const isDirect = !isGroup;
1576
1641
  const senderUserId = normalizeOptionalString(event.sender.sender_id.user_id);
@@ -2502,55 +2567,13 @@ async function dispatchSyntheticCommand(params) {
2502
2567
  accountId: params.accountId
2503
2568
  });
2504
2569
  }
2505
- function normalizeResolvedCardActionChatType(value) {
2506
- if (value === "group" || value === "topic" || value === "public") return "group";
2507
- if (value === "p2p" || value === "private") return "p2p";
2508
- }
2509
- const resolvedChatTypeCache = /* @__PURE__ */ new Map();
2510
- const CHAT_TYPE_CACHE_TTL_MS = 30 * 6e4;
2511
- const CHAT_TYPE_CACHE_MAX_SIZE = 5e3;
2512
- function pruneChatTypeCache(now) {
2513
- for (const [key, entry] of resolvedChatTypeCache.entries()) if (entry.expiresAt <= now) resolvedChatTypeCache.delete(key);
2514
- if (resolvedChatTypeCache.size > CHAT_TYPE_CACHE_MAX_SIZE) {
2515
- const excess = resolvedChatTypeCache.size - CHAT_TYPE_CACHE_MAX_SIZE;
2516
- const iter = resolvedChatTypeCache.keys();
2517
- for (let i = 0; i < excess; i++) {
2518
- const key = iter.next().value;
2519
- if (key !== void 0) resolvedChatTypeCache.delete(key);
2520
- }
2521
- }
2522
- }
2523
- function sanitizeLogValue(v) {
2524
- return v.replace(/[\r\n]/g, " ").slice(0, 500);
2525
- }
2526
2570
  async function resolveCardActionChatType(params) {
2527
- const explicitChatType = normalizeResolvedCardActionChatType(params.chatType);
2528
- if (explicitChatType) return explicitChatType;
2529
- const chatId = params.event.context.chat_id?.trim();
2530
- if (!chatId) return "p2p";
2531
- const cacheKey = `${params.account.accountId}:${chatId}`;
2532
- const now = Date.now();
2533
- pruneChatTypeCache(now);
2534
- const cached = resolvedChatTypeCache.get(cacheKey);
2535
- if (cached) return cached.value;
2536
- try {
2537
- const response = await createFeishuClient(params.account).im.chat.get({ path: { chat_id: chatId } });
2538
- if (response.code === 0) {
2539
- const resolvedChatType = normalizeResolvedCardActionChatType(response.data?.chat_mode) ?? normalizeResolvedCardActionChatType(response.data?.chat_type);
2540
- if (resolvedChatType) {
2541
- resolvedChatTypeCache.set(cacheKey, {
2542
- value: resolvedChatType,
2543
- expiresAt: now + CHAT_TYPE_CACHE_TTL_MS
2544
- });
2545
- return resolvedChatType;
2546
- }
2547
- params.log(`feishu[${params.account.accountId}]: card action missing chat type for chat; defaulting to p2p`);
2548
- } else params.log(`feishu[${params.account.accountId}]: failed to resolve chat type: ${sanitizeLogValue(response.msg ?? "unknown error")}; defaulting to p2p`);
2549
- } catch (err) {
2550
- const message = err instanceof Error ? err.message : "unknown";
2551
- params.log(`feishu[${params.account.accountId}]: failed to resolve chat type: ${sanitizeLogValue(message)}; defaulting to p2p`);
2552
- }
2553
- return "p2p";
2571
+ return resolveFeishuConversationChatType({
2572
+ account: params.account,
2573
+ chatId: params.event.context.chat_id,
2574
+ chatType: params.chatType,
2575
+ log: params.log
2576
+ });
2554
2577
  }
2555
2578
  async function sendInvalidInteractionNotice(params) {
2556
2579
  const reasonText = params.reason === "stale" ? "This card action has expired. Open a fresh launcher card and try again." : params.reason === "wrong_user" ? "This card action belongs to a different user." : params.reason === "wrong_conversation" ? "This card action belongs to a different conversation." : "This card action payload is invalid.";
@@ -1 +1 @@
1
- 2026-07-31T17:55:06.726Z
1
+ 2026-08-01T13:13:34.852Z
@@ -290,7 +290,7 @@
290
290
  "dist/channel-account-context-BF9DXgvi.js",
291
291
  "dist/channel-actions-1S8yUzVu.js",
292
292
  "dist/channel-activity-BBbF5NRm.js",
293
- "dist/channel-BK9zHrYN.js",
293
+ "dist/channel-BLm40qc7.js",
294
294
  "dist/channel-bootstrap.runtime-0Ci9Qzod.js",
295
295
  "dist/channel-bootstrap.runtime-BFurpGdb.js",
296
296
  "dist/channel-bootstrap.runtime.js",
@@ -354,7 +354,7 @@
354
354
  "dist/channels-CU_-XuzU.js",
355
355
  "dist/channels-status-issues-Cd0GNuyn.js",
356
356
  "dist/channels-table-CJyi9lis.js",
357
- "dist/channels.cn-Buix7ae-.js",
357
+ "dist/channels.cn-DAG4fol_.js",
358
358
  "dist/chat-abort-DlUpGCxe.js",
359
359
  "dist/chat-attachments-DlpXbeG9.js",
360
360
  "dist/chat-BGd2bTpY.js",
@@ -1442,8 +1442,8 @@
1442
1442
  "dist/lancedb-runtime-D_seGvWG.js",
1443
1443
  "dist/lanes-D8DvGtWb.js",
1444
1444
  "dist/lanes-DmxlLTSz.js",
1445
- "dist/lark-cli-DSD2dZbN.js",
1446
- "dist/lark-cli-X9ksa9sV.js",
1445
+ "dist/lark-cli-BfLpX7UJ.js",
1446
+ "dist/lark-cli-CvYGYXO9.js",
1447
1447
  "dist/launchd-9E1Cm_78.js",
1448
1448
  "dist/lazy-promise-AiZRy56y.js",
1449
1449
  "dist/lazy-runtime-C1AaRBNl.js",
@@ -1609,7 +1609,7 @@
1609
1609
  "dist/message-channel-core-D9KOV-bk.js",
1610
1610
  "dist/message-DYItDxpm.js",
1611
1611
  "dist/message-format-DvtCnX8W.js",
1612
- "dist/message-handler-DCUtahkd.js",
1612
+ "dist/message-handler-C0wuchVM.js",
1613
1613
  "dist/message-hook-mappers-DJX8gLZj.js",
1614
1614
  "dist/message-secret-scope-BMZx4rg6.js",
1615
1615
  "dist/message.config.runtime-Cm-YA664.js",
@@ -1683,8 +1683,8 @@
1683
1683
  "dist/models-config-Ckly7ITB.js",
1684
1684
  "dist/models-http-DV08w6mt.js",
1685
1685
  "dist/module-loader-CUMWhfAf.js",
1686
- "dist/monitor-DBiRTDG7.js",
1687
- "dist/monitor.account-Buqn31nP.js",
1686
+ "dist/monitor-SDF3Cq9V.js",
1687
+ "dist/monitor.account-C9H4fNuT.js",
1688
1688
  "dist/monitor.state-BTOOUYq4.js",
1689
1689
  "dist/multimodal-Ct3lNJiA.js",
1690
1690
  "dist/mutate-DQJs_QJs.js",
@@ -6408,15 +6408,15 @@
6408
6408
  "dist/server-discovery-runtime-otVbssbU.js",
6409
6409
  "dist/server-json-DuoKAVYg.js",
6410
6410
  "dist/server-maintenance-DOsbvq0d.js",
6411
- "dist/server-methods-DhK_tx6O.js",
6411
+ "dist/server-methods-D-2SBsLi.js",
6412
6412
  "dist/server-methods-list-TLrNLcWZ.js",
6413
6413
  "dist/server-model-catalog-CDYTyS9b.js",
6414
6414
  "dist/server-model-catalog-CsBt5ik5.js",
6415
6415
  "dist/server-network-runtime-C7LSltd1.js",
6416
6416
  "dist/server-node-events-D3UXcR75.js",
6417
6417
  "dist/server-node-session-runtime-PWEcawUw.js",
6418
- "dist/server-plugin-bootstrap-B9AZTmfO.js",
6419
- "dist/server-plugins-D1lwAViQ.js",
6418
+ "dist/server-plugin-bootstrap-CmtBet1G.js",
6419
+ "dist/server-plugins-CXmbhH3C.js",
6420
6420
  "dist/server-reload-handlers-CYT4jDdk.js",
6421
6421
  "dist/server-request-context-DehcvbxF.js",
6422
6422
  "dist/server-restart-sentinel-CUJOW9ph.js",
@@ -6434,15 +6434,15 @@
6434
6434
  "dist/server-startup-legacy-workspaces-migration-bOvHeUwX.js",
6435
6435
  "dist/server-startup-log-D1EdklEA.js",
6436
6436
  "dist/server-startup-memory-Cp8tf3gH.js",
6437
- "dist/server-startup-plugins-0E76wiXn.js",
6437
+ "dist/server-startup-plugins-CD669zFA.js",
6438
6438
  "dist/server-startup-post-attach-B6S2tGFO.js",
6439
6439
  "dist/server-startup-sealseek-models-DRDwh3Mg.js",
6440
6440
  "dist/server-startup-session-migration-6yVl_xtK.js",
6441
6441
  "dist/server-startup-unavailable-methods-ehe0vFfx.js",
6442
6442
  "dist/server-tailscale-ybcDD6X8.js",
6443
6443
  "dist/server-utils-C0TwxD5V.js",
6444
- "dist/server-ws-runtime-CVpsmRTi.js",
6445
- "dist/server.impl-CS2qhNzH.js",
6444
+ "dist/server-ws-runtime-D-Rc5DAy.js",
6445
+ "dist/server.impl-D--I0QBQ.js",
6446
6446
  "dist/service-6ce5J6lU.js",
6447
6447
  "dist/service-audit-Cg483YEh.js",
6448
6448
  "dist/service-audit-o3BzGl94.js",
@@ -210,7 +210,7 @@ import { n as updateSystemPresence, t as listSystemPresence } from "./system-pre
210
210
  import { t as getLastUpdateCheckedAt } from "./update-startup-DiS9G0NB.js";
211
211
  import { a as validateVoiceWakeRoutingConfigInput, i as setVoiceWakeRoutingConfig, n as normalizeVoiceWakeRoutingConfig, o as isRoleAuthorizedForMethod, r as resolveVoiceWakeRouteByTrigger, s as parseGatewayRole, t as loadVoiceWakeRoutingConfig } from "./voicewake-routing-iz_kqPpZ.js";
212
212
  import { n as resolveSessionKeyForRun } from "./server-session-key-DQ76HcvR.js";
213
- import { n as channelsCnHandlers } from "./channels.cn-Buix7ae-.js";
213
+ import { n as channelsCnHandlers } from "./channels.cn-DAG4fol_.js";
214
214
  import { n as buildCanvasScopedHostUrl, r as mintCanvasCapabilityToken, t as CANVAS_CAPABILITY_TTL_MS } from "./canvas-capability-BGC-Pgg9.js";
215
215
  import { a as nodeWakeById, n as NODE_WAKE_RECONNECT_RETRY_WAIT_MS, o as nodeWakeNudgeById, r as NODE_WAKE_RECONNECT_WAIT_MS, t as broadcastPresenceSnapshot } from "./presence-events-Dv6_Hz3q.js";
216
216
  import { t as invokeGatewayTool } from "./tools-invoke-shared-ESMmMn6-.js";
@@ -3,7 +3,7 @@ import { t as applyPluginAutoEnable } from "./plugin-auto-enable-CqZoOzt_.js";
3
3
  import { i as setGatewaySubagentRuntime, r as setGatewayNodesRuntime } from "./gateway-bindings-B6m7pPqS.js";
4
4
  import { t as primeConfiguredBindingRegistry } from "./binding-registry-D-_SB4ui.js";
5
5
  import { t as mergeActivationSectionsIntoRuntimeConfig } from "./plugin-activation-runtime-config-C8jdG1Pj.js";
6
- import { a as setPluginSubagentOverridePolicies, n as createGatewaySubagentRuntime, r as loadGatewayPlugins, t as createGatewayNodesRuntime } from "./server-plugins-D1lwAViQ.js";
6
+ import { a as setPluginSubagentOverridePolicies, n as createGatewaySubagentRuntime, r as loadGatewayPlugins, t as createGatewayNodesRuntime } from "./server-plugins-CXmbhH3C.js";
7
7
  //#region src/gateway/server-plugin-bootstrap.ts
8
8
  function installGatewayPluginRuntimeEnvironment(cfg) {
9
9
  setPluginSubagentOverridePolicies(cfg);
@@ -163,7 +163,7 @@ async function dispatchGatewayMethod(method, params, options) {
163
163
  const isWebchatConnect = scope?.isWebchatConnect ?? (() => false);
164
164
  if (!context) throw new Error(`Plugin subagent dispatch requires a gateway request scope (method: ${method}). No scope set and no fallback context available.`);
165
165
  let result;
166
- const { handleGatewayRequest } = await import("./server-methods-DhK_tx6O.js");
166
+ const { handleGatewayRequest } = await import("./server-methods-D-2SBsLi.js");
167
167
  const pluginRuntimeOwnerId = typeof options?.pluginRuntimeOwnerId === "string" && options.pluginRuntimeOwnerId.trim() ? options.pluginRuntimeOwnerId.trim() : void 0;
168
168
  const syntheticClient = createSyntheticOperatorClient({
169
169
  allowModelOverride: options?.allowSyntheticModelOverride === true,
@@ -97,7 +97,7 @@ async function prepareGatewayPluginBootstrap(params) {
97
97
  };
98
98
  }
99
99
  async function loadGatewayStartupPluginRuntime(params) {
100
- const { loadGatewayStartupPlugins } = await import("./server-plugin-bootstrap-B9AZTmfO.js");
100
+ const { loadGatewayStartupPlugins } = await import("./server-plugin-bootstrap-CmtBet1G.js");
101
101
  return loadGatewayStartupPlugins({
102
102
  cfg: params.cfg,
103
103
  activationSourceConfig: params.activationSourceConfig,
@@ -120,7 +120,7 @@ function attachGatewayWsMessageHandlerOnDemand(params) {
120
120
  queued.push(data);
121
121
  };
122
122
  params.socket.on("message", queueMessage);
123
- import("./message-handler-DCUtahkd.js").then(({ attachGatewayWsMessageHandler }) => {
123
+ import("./message-handler-C0wuchVM.js").then(({ attachGatewayWsMessageHandler }) => {
124
124
  params.socket.off("message", queueMessage);
125
125
  if (params.isClosed()) return;
126
126
  attachGatewayWsMessageHandler(params);
@@ -48,9 +48,9 @@ import { n as resolveAssistantIdentity } from "./assistant-identity-D9sWu6XN.js"
48
48
  import { i as getRequiredSharedGatewaySessionGeneration, r as enforceSharedGatewaySessionGenerationForConfigWrite } from "./server-shared-auth-generation-BPhO1xpA.js";
49
49
  import { a as createToolEventRecipientRegistry, n as createChatRunState } from "./server-chat-state-Fs_ZNEYv.js";
50
50
  import { a as incrementPresenceVersion, i as getPresenceVersion, n as getHealthCache, o as refreshGatewayHealthSnapshot, r as getHealthVersion } from "./health-state-DBjPrOZU.js";
51
- import { t as autoStartEnabledCnChannels } from "./channels.cn-Buix7ae-.js";
51
+ import { t as autoStartEnabledCnChannels } from "./channels.cn-DAG4fol_.js";
52
52
  import { i as normalizeCanvasScopedUrl } from "./canvas-capability-BGC-Pgg9.js";
53
- import { i as setFallbackGatewayContextResolver } from "./server-plugins-D1lwAViQ.js";
53
+ import { i as setFallbackGatewayContextResolver } from "./server-plugins-CXmbhH3C.js";
54
54
  import { n as applyGatewayLaneConcurrency, t as resolveHookClientIpConfig } from "./hook-client-ip-config-DK56Uzz9.js";
55
55
  import { t as GATEWAY_EVENTS } from "./server-methods-list-TLrNLcWZ.js";
56
56
  import { t as STARTUP_UNAVAILABLE_GATEWAY_METHODS } from "./server-startup-unavailable-methods-ehe0vFfx.js";
@@ -1673,7 +1673,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
1673
1673
  const startupConfigModulePromise = import("./server-startup-config-1xqVZH8P.js");
1674
1674
  let startupPluginsModulePromise = null;
1675
1675
  const loadStartupPluginsModule = () => {
1676
- startupPluginsModulePromise ??= import("./server-startup-plugins-0E76wiXn.js");
1676
+ startupPluginsModulePromise ??= import("./server-startup-plugins-CD669zFA.js");
1677
1677
  return startupPluginsModulePromise;
1678
1678
  };
1679
1679
  const { loadGatewayStartupConfigSnapshot } = await startupConfigModulePromise;
@@ -2100,7 +2100,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
2100
2100
  const beforeChannelIds = new Set(beforeChannelTargets.keys());
2101
2101
  const [{ loadPluginLookUpTable }, { prepareGatewayPluginLoad }, { startPluginServices }] = await Promise.all([
2102
2102
  import("./plugin-lookup-table-dXbdudwd.js"),
2103
- import("./server-plugin-bootstrap-B9AZTmfO.js"),
2103
+ import("./server-plugin-bootstrap-CmtBet1G.js"),
2104
2104
  import("./services-DbtJf7cT.js")
2105
2105
  ]);
2106
2106
  const nextPluginLookUpTable = loadPluginLookUpTable({
@@ -2237,7 +2237,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
2237
2237
  } : () => {};
2238
2238
  if (!minimalTestGateway) {
2239
2239
  if (runtimePluginsLoaded && deferredConfiguredChannelPluginIds.length > 0) {
2240
- const { reloadDeferredGatewayPlugins } = await import("./server-plugin-bootstrap-B9AZTmfO.js");
2240
+ const { reloadDeferredGatewayPlugins } = await import("./server-plugin-bootstrap-CmtBet1G.js");
2241
2241
  const loaded = reloadDeferredGatewayPlugins({
2242
2242
  cfg: gatewayPluginConfigAtStart,
2243
2243
  activationSourceConfig: startupActivationSourceConfig,
@@ -2253,7 +2253,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
2253
2253
  await refreshAttachedGatewayDiscovery(loaded.pluginRegistry);
2254
2254
  }
2255
2255
  }
2256
- const { attachGatewayWsHandlers } = await import("./server-ws-runtime-CVpsmRTi.js");
2256
+ const { attachGatewayWsHandlers } = await import("./server-ws-runtime-D-Rc5DAy.js");
2257
2257
  const canvasHostScheme = gatewayTls.enabled ? "https" : "http";
2258
2258
  attachGatewayWsHandlers({
2259
2259
  wss,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sealclaw",
3
- "version": "2026.7.29",
3
+ "version": "2026.7.30",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",