openclaw 2026.4.9-beta.1 → 2026.4.9

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 (51) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/.buildstamp +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{channel-DQ-1yfjU.js → channel-Bk51B5Cb.js} +4 -4
  6. package/dist/{channel.runtime-DB5-zVzp.js → channel.runtime-BHZxP2WZ.js} +1 -1
  7. package/dist/cli-startup-metadata.json +1 -1
  8. package/dist/{command-registry-BeDlThjt.js → command-registry-D85s1_eu.js} +6 -6
  9. package/dist/{command-registry-C8pbWQb8.js → command-registry-DWOyfJhm.js} +1 -1
  10. package/dist/{completion-cli-DNUbbtNb.js → completion-cli-1z1xZCDl.js} +1 -1
  11. package/dist/{completion-cli-B47O1GLh.js → completion-cli-klMIRvmG.js} +2 -2
  12. package/dist/{config-cli-BO7tgnNS.js → config-cli-J5ilTjk5.js} +2 -2
  13. package/dist/{configure-CH8LoJfS.js → configure-DcN3PXWe.js} +1 -1
  14. package/dist/{configure-p1MZA-SO.js → configure-l_6ztbJd.js} +2 -2
  15. package/dist/{doctor-completion-Cl6B78v1.js → doctor-completion-C_CFc87W.js} +1 -1
  16. package/dist/entry.js +1 -1
  17. package/dist/extensions/amazon-bedrock/.openclaw-runtime-deps-stamp.json +1 -1
  18. package/dist/extensions/amazon-bedrock-mantle/.openclaw-runtime-deps-stamp.json +1 -1
  19. package/dist/extensions/diffs/.openclaw-runtime-deps-stamp.json +1 -1
  20. package/dist/extensions/discord/.openclaw-runtime-deps-stamp.json +1 -1
  21. package/dist/extensions/feishu/.openclaw-runtime-deps-stamp.json +1 -1
  22. package/dist/extensions/msteams/api.js +1 -1
  23. package/dist/extensions/msteams/test-api.js +1 -1
  24. package/dist/extensions/nostr/.openclaw-runtime-deps-stamp.json +1 -1
  25. package/dist/extensions/qqbot/.openclaw-runtime-deps-stamp.json +1 -1
  26. package/dist/extensions/slack/.openclaw-runtime-deps-stamp.json +1 -1
  27. package/dist/extensions/telegram/.openclaw-runtime-deps-stamp.json +1 -1
  28. package/dist/extensions/webhooks/.openclaw-runtime-deps-stamp.json +1 -1
  29. package/dist/{gateway-cli-WPdEgaaR.js → gateway-cli-BB4zg2Pu.js} +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/{onboard-CHJlQ2pO.js → onboard-BdDpvGgj.js} +1 -1
  32. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  33. package/dist/{probe-Y_CEzcAI.js → probe-CjLA1BfT.js} +18 -14
  34. package/dist/{program-CWyRO-qJ.js → program-D3LRs06L.js} +1 -1
  35. package/dist/{prompt-select-styled-BmSssQ0t.js → prompt-select-styled-BfACiVO5.js} +1 -1
  36. package/dist/{register.configure-CD5fjy14.js → register.configure-UBP1QgdC.js} +1 -1
  37. package/dist/{register.maintenance-BQMc-7eW.js → register.maintenance-Cqny15ML.js} +1 -1
  38. package/dist/{register.onboard-DLKTH93T.js → register.onboard-BqQKWiUY.js} +1 -1
  39. package/dist/{register.setup-Bi2saEcG.js → register.setup-C5BAVGp3.js} +1 -1
  40. package/dist/{register.subclis-DsjM0woD.js → register.subclis-Btu1bO0l.js} +1 -1
  41. package/dist/{register.subclis-BSZ4Ogu4.js → register.subclis-D7AxmRi1.js} +3 -3
  42. package/dist/{run-main-Bmyo63r-.js → run-main-DC1dNPE7.js} +5 -5
  43. package/dist/{runtime-schema-Dn6Hpv5z.js → runtime-schema-IZwxDrJI.js} +1 -1
  44. package/dist/{server-COgrIGA4.js → server-pYxwJSF9.js} +1 -1
  45. package/dist/{server.impl-Ddsg2W_l.js → server.impl-BxLfE9ri.js} +2 -2
  46. package/dist/{setup-BGObu4W2.js → setup-BsIdb5Ko.js} +2 -2
  47. package/dist/{setup.finalize-65M2c8wB.js → setup.finalize-L1m4gLYy.js} +2 -2
  48. package/dist/{setup.plugin-config-CoWe0qTX.js → setup.plugin-config-B24OprEh.js} +7 -3
  49. package/dist/{src-CLbI32gd.js → src-BObDb6jN.js} +22 -5
  50. package/dist/{update-cli-BtCbVXTO.js → update-cli-C96vBpAJ.js} +3 -3
  51. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -8,7 +8,7 @@ Docs: https://docs.openclaw.ai
8
8
 
9
9
  ### Fixes
10
10
 
11
- ## 2026.4.9-beta.1
11
+ ## 2026.4.9
12
12
 
13
13
  ### Changes
14
14
 
package/dist/.buildstamp CHANGED
@@ -1 +1 @@
1
- {"builtAt":1775699125992,"head":"e6797bcd084a6767823a68d55942083fb2d983bb"}
1
+ {"builtAt":1775701738302,"head":"0512059dd4e6d2e582393828b837c376ddc4719c"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.4.9-beta.1",
3
- "commit": "e6797bcd084a6767823a68d55942083fb2d983bb",
4
- "builtAt": "2026-04-09T01:45:53.379Z"
2
+ "version": "2026.4.9",
3
+ "commit": "0512059dd4e6d2e582393828b837c376ddc4719c",
4
+ "builtAt": "2026-04-09T02:29:27.057Z"
5
5
  }
@@ -1 +1 @@
1
- 4655b2e89379ce6b9ba99593594dec4199d8fb1f9949c4530cca29b9a637b51e
1
+ c75034a6009fb5a7e4e8dd522eb50a18726ccec0b062330254220584827f5fdb
@@ -29,7 +29,7 @@ import { c as parseMSTeamsConversationId, d as resolveMSTeamsChannelAllowlist, f
29
29
  import { t as MSTeamsChannelConfigSchema } from "./config-schema-BPHQgwSR.js";
30
30
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-B2rGd4Y4.js";
31
31
  //#region extensions/msteams/src/actions.ts
32
- const loadMSTeamsChannelRuntime$2 = createLazyRuntimeNamedExport(() => import("./channel.runtime-DB5-zVzp.js"), "msTeamsChannelRuntime");
32
+ const loadMSTeamsChannelRuntime$2 = createLazyRuntimeNamedExport(() => import("./channel.runtime-BHZxP2WZ.js"), "msTeamsChannelRuntime");
33
33
  function jsonActionResult(data) {
34
34
  return {
35
35
  content: [{
@@ -499,7 +499,7 @@ const msteamsDirectoryAdapter = createChannelDirectoryAdapter({
499
499
  normalizeId: (raw) => `conversation:${raw.replace(/^conversation:/i, "").trim()}`
500
500
  }),
501
501
  ...createRuntimeDirectoryLiveAdapter({
502
- getRuntime: createLazyRuntimeNamedExport(() => import("./channel.runtime-DB5-zVzp.js"), "msTeamsChannelRuntime"),
502
+ getRuntime: createLazyRuntimeNamedExport(() => import("./channel.runtime-BHZxP2WZ.js"), "msTeamsChannelRuntime"),
503
503
  listPeersLive: (runtime) => runtime.listMSTeamsDirectoryPeersLive,
504
504
  listGroupsLive: (runtime) => runtime.listMSTeamsDirectoryGroupsLive
505
505
  })
@@ -832,7 +832,7 @@ const collectMSTeamsSecurityWarnings = createAllowlistProviderGroupPolicyWarning
832
832
  resolveGroupPolicy: ({ cfg }) => cfg.channels?.msteams?.groupPolicy,
833
833
  collect: ({ groupPolicy }) => groupPolicy === "open" ? ["- MS Teams groups: groupPolicy=\"open\" allows any member to trigger (mention-gated). Set channels.msteams.groupPolicy=\"allowlist\" + channels.msteams.groupAllowFrom to restrict senders."] : []
834
834
  });
835
- const loadMSTeamsChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-DB5-zVzp.js"), "msTeamsChannelRuntime");
835
+ const loadMSTeamsChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-BHZxP2WZ.js"), "msTeamsChannelRuntime");
836
836
  const resolveMSTeamsChannelConfig = (cfg) => ({
837
837
  allowFrom: cfg.channels?.msteams?.allowFrom,
838
838
  defaultTo: cfg.channels?.msteams?.defaultTo
@@ -1058,7 +1058,7 @@ const msteamsPlugin = createChatChannelPlugin({
1058
1058
  })
1059
1059
  }),
1060
1060
  gateway: { startAccount: async (ctx) => {
1061
- const { monitorMSTeamsProvider } = await import("./src-CLbI32gd.js");
1061
+ const { monitorMSTeamsProvider } = await import("./src-BObDb6jN.js");
1062
1062
  const port = ctx.cfg.channels?.msteams?.webhook?.port ?? 3978;
1063
1063
  ctx.setStatus({
1064
1064
  accountId: ctx.accountId,
@@ -6,7 +6,7 @@ import { t as chunkTextForOutbound } from "./text-chunking-D_B5j6zQ.js";
6
6
  import { i as createAttachedChannelResultAdapter } from "./channel-send-result-COHJCNM4.js";
7
7
  import { a as listChannelsForTeam, c as postGraphBetaJson, i as fetchGraphJson, l as postGraphJson, n as deleteGraphRequest, o as listTeamsByName, r as escapeOData, s as normalizeQuery, t as searchGraphUsers, u as resolveGraphToken } from "./graph-users-BEuPEsk1.js";
8
8
  import "./runtime-api-BkG9fr64.js";
9
- import { _ as createMSTeamsPollStoreFs, a as sendMessageMSTeams, i as sendAdaptiveCardMSTeams, n as deleteMessageMSTeams, o as sendPollMSTeams, r as editMessageMSTeams, t as probeMSTeams, y as createMSTeamsConversationStoreFs } from "./probe-Y_CEzcAI.js";
9
+ import { _ as createMSTeamsPollStoreFs, a as sendMessageMSTeams, i as sendAdaptiveCardMSTeams, n as deleteMessageMSTeams, o as sendPollMSTeams, r as editMessageMSTeams, t as probeMSTeams, y as createMSTeamsConversationStoreFs } from "./probe-CjLA1BfT.js";
10
10
  //#region extensions/msteams/src/directory-live.ts
11
11
  async function listMSTeamsDirectoryPeersLive(params) {
12
12
  const query = normalizeQuery(params.query);
@@ -27,5 +27,5 @@
27
27
  ],
28
28
  "channelCatalogSignature": "31d3a07cce78f9bf861c45980c3bb115d4bad402",
29
29
  "rootHelpBundleSignature": "9b8c9d53b780c4dda3e29214d7f0f9dc519eef2f",
30
- "rootHelpText": "\n🦞 OpenClaw 2026.4.9-beta.1 (e6797bc) — Self-hosted, self-updating, self-aware (just kidding... unless?).\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 clawbot * Legacy clawbot command aliases\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 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 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 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 and extensions\n qa * Run QA scenarios and launch the private QA debugger UI\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 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"
30
+ "rootHelpText": "\n🦞 OpenClaw 2026.4.9 (0512059) — More integrations than your therapist's intake form.\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 clawbot * Legacy clawbot command aliases\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 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 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 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 and extensions\n qa * Run QA scenarios and launch the private QA debugger UI\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 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"
31
31
  }
@@ -1,6 +1,6 @@
1
1
  import { t as resolveCliArgvInvocation } from "./argv-invocation-BeolA8Ck.js";
2
2
  import { n as shouldRegisterPrimaryCommandOnly } from "./command-registration-policy-CFKz5i6L.js";
3
- import { a as defineImportedCommandGroupSpec, i as buildCommandGroupEntries, o as defineImportedProgramCommandGroupSpecs, r as registerSubCliCommands } from "./register.subclis-BSZ4Ogu4.js";
3
+ import { a as defineImportedCommandGroupSpec, i as buildCommandGroupEntries, o as defineImportedProgramCommandGroupSpecs, r as registerSubCliCommands } from "./register.subclis-D7AxmRi1.js";
4
4
  import { i as registerCommandGroups, r as registerCommandGroupByName } from "./register-command-groups-pnI4KWXM.js";
5
5
  import { n as getCoreCliCommandNames$1, t as getCoreCliCommandDescriptors } from "./core-command-descriptors-CmWQSYPA.js";
6
6
  //#region src/cli/program/command-registry.ts
@@ -16,22 +16,22 @@ const coreEntrySpecs = [
16
16
  ...withProgramOnlySpecs(defineImportedProgramCommandGroupSpecs([
17
17
  {
18
18
  commandNames: ["setup"],
19
- loadModule: () => import("./register.setup-Bi2saEcG.js"),
19
+ loadModule: () => import("./register.setup-C5BAVGp3.js"),
20
20
  exportName: "registerSetupCommand"
21
21
  },
22
22
  {
23
23
  commandNames: ["onboard"],
24
- loadModule: () => import("./register.onboard-DLKTH93T.js"),
24
+ loadModule: () => import("./register.onboard-BqQKWiUY.js"),
25
25
  exportName: "registerOnboardCommand"
26
26
  },
27
27
  {
28
28
  commandNames: ["configure"],
29
- loadModule: () => import("./register.configure-CD5fjy14.js"),
29
+ loadModule: () => import("./register.configure-UBP1QgdC.js"),
30
30
  exportName: "registerConfigureCommand"
31
31
  },
32
32
  {
33
33
  commandNames: ["config"],
34
- loadModule: () => import("./config-cli-BO7tgnNS.js"),
34
+ loadModule: () => import("./config-cli-J5ilTjk5.js"),
35
35
  exportName: "registerConfigCli"
36
36
  },
37
37
  {
@@ -46,7 +46,7 @@ const coreEntrySpecs = [
46
46
  "reset",
47
47
  "uninstall"
48
48
  ],
49
- loadModule: () => import("./register.maintenance-BQMc-7eW.js"),
49
+ loadModule: () => import("./register.maintenance-Cqny15ML.js"),
50
50
  exportName: "registerMaintenanceCommands"
51
51
  }
52
52
  ])),
@@ -1,3 +1,3 @@
1
1
  import "./core-command-descriptors-CmWQSYPA.js";
2
- import { n as registerCoreCliByName } from "./command-registry-BeDlThjt.js";
2
+ import { n as registerCoreCliByName } from "./command-registry-D85s1_eu.js";
3
3
  export { registerCoreCliByName };
@@ -1,2 +1,2 @@
1
- import { a as registerCompletionCli, c as usesSlowDynamicCompletion, i as isCompletionInstalled, n as getCompletionScript, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-B47O1GLh.js";
1
+ import { a as registerCompletionCli, c as usesSlowDynamicCompletion, i as isCompletionInstalled, n as getCompletionScript, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-klMIRvmG.js";
2
2
  export { completionCacheExists, getCompletionScript, installCompletion, isCompletionInstalled, registerCompletionCli, resolveCompletionCachePath, resolveShellFromEnv, usesSlowDynamicCompletion };
@@ -4,8 +4,8 @@ import { c as routeLogsToStderr } from "./subsystem-C1arrdPy.js";
4
4
  import { t as formatDocsLink } from "./links-_W1ZnMwp.js";
5
5
  import { r as theme } from "./theme-DZuqFJmv.js";
6
6
  import { _ as resolveStateDir } from "./paths-nQmEmngS.js";
7
- import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-BSZ4Ogu4.js";
8
- import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-BeDlThjt.js";
7
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-D7AxmRi1.js";
8
+ import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-D85s1_eu.js";
9
9
  import { t as getProgramContext } from "./program-context-CT69PVIU.js";
10
10
  import path from "node:path";
11
11
  import os from "node:os";
@@ -14,7 +14,7 @@ import { a as resolveSecretRefValue } from "./resolve-CkjIVlAQ.js";
14
14
  import { t as formatCliCommand } from "./command-format-QzcL7Uge.js";
15
15
  import { a as normalizeConfigIssues, n as formatConfigIssueLines } from "./issue-format-CfcXGzWv.js";
16
16
  import { c as resolveConfigSecretTargetByPath, n as discoverConfigSecretTargets } from "./target-registry-mIDpZ45A.js";
17
- import { i as redactConfigObject, n as readBestEffortRuntimeConfigSchema } from "./runtime-schema-Dn6Hpv5z.js";
17
+ import { i as redactConfigObject, n as readBestEffortRuntimeConfigSchema } from "./runtime-schema-IZwxDrJI.js";
18
18
  import { n as setCommandJsonMode } from "./json-mode-CAjPvZL9.js";
19
19
  import fs from "node:fs";
20
20
  import JSON5 from "json5";
@@ -913,7 +913,7 @@ async function runConfigValidate(opts = {}) {
913
913
  }
914
914
  function registerConfigCli(program) {
915
915
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset/file/schema/validate). Run without subcommand for guided setup.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.openclaw.ai/cli/config")}\n`).option("--section <section>", "Configuration sections for guided setup (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
916
- const { configureCommandFromSectionsArg } = await import("./configure-CH8LoJfS.js");
916
+ const { configureCommandFromSectionsArg } = await import("./configure-DcN3PXWe.js");
917
917
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
918
918
  });
919
919
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -1,2 +1,2 @@
1
- import { n as configureCommandFromSectionsArg } from "./configure-p1MZA-SO.js";
1
+ import { n as configureCommandFromSectionsArg } from "./configure-l_6ztbJd.js";
2
2
  export { configureCommandFromSectionsArg };
@@ -989,7 +989,7 @@ async function runConfigureWizard(opts, runtime = defaultRuntime) {
989
989
  }
990
990
  if (selected.includes("channels")) await configureChannelsSection();
991
991
  if (selected.includes("plugins")) {
992
- const { configurePluginConfig } = await import("./setup.plugin-config-CoWe0qTX.js");
992
+ const { configurePluginConfig } = await import("./setup.plugin-config-B24OprEh.js");
993
993
  nextConfig = await configurePluginConfig({
994
994
  config: nextConfig,
995
995
  prompter,
@@ -1044,7 +1044,7 @@ async function runConfigureWizard(opts, runtime = defaultRuntime) {
1044
1044
  await persistConfig();
1045
1045
  }
1046
1046
  if (choice === "plugins") {
1047
- const { configurePluginConfig } = await import("./setup.plugin-config-CoWe0qTX.js");
1047
+ const { configurePluginConfig } = await import("./setup.plugin-config-B24OprEh.js");
1048
1048
  nextConfig = await configurePluginConfig({
1049
1049
  config: nextConfig,
1050
1050
  prompter,
@@ -1,7 +1,7 @@
1
1
  import { t as resolveOpenClawPackageRoot } from "./openclaw-root-aQp7vffj.js";
2
2
  import { n as resolveCliName } from "./cli-name-C3YKCm0e.js";
3
3
  import { t as note } from "./note--Kd3X8eg.js";
4
- import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-B47O1GLh.js";
4
+ import { c as usesSlowDynamicCompletion, i as isCompletionInstalled, o as resolveCompletionCachePath, r as installCompletion, s as resolveShellFromEnv, t as completionCacheExists } from "./completion-cli-klMIRvmG.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
  //#region src/commands/doctor-completion.ts
package/dist/entry.js CHANGED
@@ -203,7 +203,7 @@ function tryHandleRootHelpFastPath(argv, deps = {}) {
203
203
  }
204
204
  function runMainOrRootHelp(argv) {
205
205
  if (tryHandleRootHelpFastPath(argv)) return;
206
- import("./run-main-Bmyo63r-.js").then(({ runCli }) => runCli(argv)).catch((error) => {
206
+ import("./run-main-DC1dNPE7.js").then(({ runCli }) => runCli(argv)).catch((error) => {
207
207
  console.error("[openclaw] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
208
208
  process$1.exitCode = 1;
209
209
  });
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "9e135935b4ef2921efe7ce5ccfeaecdd3ff62836f74fbfe5d85bec1465fc125f",
3
- "generatedAt": "2026-04-09T01:45:11.410Z"
3
+ "generatedAt": "2026-04-09T02:28:41.958Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "3879b12c7896fc4a90cec9dbca7a7d0922599c234f1e33b7ff32183a0adae0cb",
3
- "generatedAt": "2026-04-09T01:45:13.062Z"
3
+ "generatedAt": "2026-04-09T02:28:43.785Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "f90ee18d7a85488c74a9a6b6fc682f38850e04c9ae4b91a2163d5d6d479e8dc5",
3
- "generatedAt": "2026-04-09T01:45:16.004Z"
3
+ "generatedAt": "2026-04-09T02:28:47.331Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "5592ad7b94a44042c5a8cd684f224a2f5be55ba7fab075b94c667743159dccf7",
3
- "generatedAt": "2026-04-09T01:45:20.161Z"
3
+ "generatedAt": "2026-04-09T02:28:51.794Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "3ab953ee852177ae252afebcfe67433ddeb5701cec2c96ec6a25924b8276db92",
3
- "generatedAt": "2026-04-09T01:45:22.235Z"
3
+ "generatedAt": "2026-04-09T02:28:54.165Z"
4
4
  }
@@ -1,2 +1,2 @@
1
- import { i as msteamsSetupAdapter, n as msteamsSetupWizard, r as createMSTeamsSetupWizardBase, t as msteamsPlugin } from "../../channel-DQ-1yfjU.js";
1
+ import { i as msteamsSetupAdapter, n as msteamsSetupWizard, r as createMSTeamsSetupWizardBase, t as msteamsPlugin } from "../../channel-Bk51B5Cb.js";
2
2
  export { createMSTeamsSetupWizardBase, msteamsPlugin, msteamsSetupAdapter, msteamsSetupWizard };
@@ -1,2 +1,2 @@
1
- import { t as msteamsPlugin } from "../../channel-DQ-1yfjU.js";
1
+ import { t as msteamsPlugin } from "../../channel-Bk51B5Cb.js";
2
2
  export { msteamsPlugin };
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "f8108faa1c70e314e1d7dd676e72c891a52e1fbec569b95a01757d6f6cd7937b",
3
- "generatedAt": "2026-04-09T01:45:22.267Z"
3
+ "generatedAt": "2026-04-09T02:28:54.198Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "79ec160052d101f3d35427bdee617f57ba17415be3c8b6db5eade070a85f94ea",
3
- "generatedAt": "2026-04-09T01:45:22.273Z"
3
+ "generatedAt": "2026-04-09T02:28:54.204Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "65d307dd7d0fc883b48ceb855ce41e1f67a4ceef247dcb85ca7aa376b56d5cf4",
3
- "generatedAt": "2026-04-09T01:45:25.108Z"
3
+ "generatedAt": "2026-04-09T02:28:57.390Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "a546b8995d078429570119fcb061fc37e067ca4bc9e79d183bb5e45986d12e26",
3
- "generatedAt": "2026-04-09T01:45:25.848Z"
3
+ "generatedAt": "2026-04-09T02:28:58.150Z"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "fingerprint": "3e5f9510a8820a3399f0553c64e74634a0f400c200d71c817a16cc9955ea9c6f",
3
- "generatedAt": "2026-04-09T01:45:25.880Z"
3
+ "generatedAt": "2026-04-09T02:28:58.182Z"
4
4
  }
@@ -1165,7 +1165,7 @@ async function runGatewayCommand$1(opts) {
1165
1165
  const { startGatewayServer } = await withProgress({
1166
1166
  label: "Loading gateway modules…",
1167
1167
  indeterminate: true
1168
- }, async () => import("./server-COgrIGA4.js"));
1168
+ }, async () => import("./server-pYxwJSF9.js"));
1169
1169
  setConsoleTimestampPrefix(true);
1170
1170
  if (devMode) await ensureDevGatewayConfig({ reset: Boolean(opts.reset) });
1171
1171
  gatewayLog.info("loading configuration…");
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ let runExec;
26
26
  let saveSessionStore;
27
27
  let waitForever;
28
28
  async function loadLegacyCliDeps() {
29
- const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-Bmzrm-q1.js"), import("./run-main-Bmyo63r-.js")]);
29
+ const [{ installGaxiosFetchCompat }, { runCli }] = await Promise.all([import("./gaxios-fetch-compat-Bmzrm-q1.js"), import("./run-main-DC1dNPE7.js")]);
30
30
  return {
31
31
  installGaxiosFetchCompat,
32
32
  runCli
@@ -15,7 +15,7 @@ import { t as WizardCancelledError } from "./prompts-4IH_gy1z.js";
15
15
  import { n as logConfigUpdated } from "./logging-DHnBXHWa.js";
16
16
  import { t as createClackPrompter } from "./clack-prompter-_sjOHG0m.js";
17
17
  import { c as resolveManifestProviderOnboardAuthFlags, i as resolveDeprecatedAuthChoiceReplacement, n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice, t as formatDeprecatedNonInteractiveAuthChoiceError } from "./auth-choice-legacy-JypF_SN4.js";
18
- import { t as runSetupWizard } from "./setup-BGObu4W2.js";
18
+ import { t as runSetupWizard } from "./setup-BsIdb5Ko.js";
19
19
  import { r as applyLocalSetupWorkspaceConfig } from "./onboard-config-DuUirxej.js";
20
20
  //#region src/commands/onboard-core-auth-flags.ts
21
21
  const CORE_ONBOARD_AUTH_FLAGS = [];
@@ -1 +1 @@
1
- 2026-04-09T01:45:52.679Z
1
+ 2026-04-09T02:29:26.363Z
@@ -46,18 +46,18 @@ function mergeStoredConversationReference(existing, incoming, nowIso) {
46
46
  function findPreferredDmConversationByUserId(entries, id) {
47
47
  const target = id.trim();
48
48
  if (!target) return null;
49
- const matches = [];
50
- for (const entry of entries) if (entry.reference.user?.aadObjectId === target || entry.reference.user?.id === target) matches.push(entry);
51
- if (matches.length === 0) return null;
52
- matches.sort((a, b) => {
53
- const aType = normalizeLowercaseStringOrEmpty(a.reference.conversation?.conversationType ?? "");
54
- const bType = normalizeLowercaseStringOrEmpty(b.reference.conversation?.conversationType ?? "");
55
- const aPersonal = aType === "personal" ? 1 : 0;
56
- const bPersonal = bType === "personal" ? 1 : 0;
57
- if (aPersonal !== bPersonal) return bPersonal - aPersonal;
58
- return (parseStoredConversationTimestamp(b.reference.lastSeenAt) ?? 0) - (parseStoredConversationTimestamp(a.reference.lastSeenAt) ?? 0);
59
- });
60
- return matches[0] ?? null;
49
+ const personalMatches = [];
50
+ const unknownTypeMatches = [];
51
+ for (const entry of entries) {
52
+ if (entry.reference.user?.aadObjectId !== target && entry.reference.user?.id !== target) continue;
53
+ const convType = normalizeLowercaseStringOrEmpty(entry.reference.conversation?.conversationType ?? "");
54
+ if (convType === "personal") personalMatches.push(entry);
55
+ else if (convType === "channel" || convType === "groupchat") {} else unknownTypeMatches.push(entry);
56
+ }
57
+ const candidates = personalMatches.length > 0 ? personalMatches : unknownTypeMatches;
58
+ if (candidates.length === 0) return null;
59
+ if (candidates.length > 1) candidates.sort((a, b) => (parseStoredConversationTimestamp(b.reference.lastSeenAt) ?? 0) - (parseStoredConversationTimestamp(a.reference.lastSeenAt) ?? 0));
60
+ return candidates[0] ?? null;
61
61
  }
62
62
  //#endregion
63
63
  //#region extensions/msteams/src/storage.ts
@@ -1336,10 +1336,10 @@ async function sendMSTeamsMessages(params) {
1336
1336
  });
1337
1337
  return messageIds;
1338
1338
  };
1339
+ const resolvedThreadId = params.conversationRef.threadId ?? params.conversationRef.activityId;
1339
1340
  if (params.replyStyle === "thread") {
1340
1341
  const ctx = params.context;
1341
1342
  if (!ctx) throw new Error("Missing context for replyStyle=thread");
1342
- const threadActivityId = params.conversationRef.activityId;
1343
1343
  const messageIds = [];
1344
1344
  for (const [idx, message] of messages.entries()) {
1345
1345
  const result = await withRevokedProxyFallback({
@@ -1350,7 +1350,7 @@ async function sendMSTeamsMessages(params) {
1350
1350
  onRevoked: async () => {
1351
1351
  const remaining = messages.slice(idx);
1352
1352
  return {
1353
- ids: remaining.length > 0 ? await sendProactively(remaining, idx, threadActivityId) : [],
1353
+ ids: remaining.length > 0 ? await sendProactively(remaining, idx, resolvedThreadId) : [],
1354
1354
  fellBack: true
1355
1355
  };
1356
1356
  }
@@ -1418,6 +1418,10 @@ async function resolveMSTeamsSendContext(params) {
1418
1418
  });
1419
1419
  if (!found) throw new Error(`No conversation reference found for ${recipient.type}:${recipient.id}. The bot must receive a message from this conversation before it can send proactively.`);
1420
1420
  const { conversationId, ref } = found;
1421
+ if (recipient.type === "user") {
1422
+ const resolvedType = normalizeLowercaseStringOrEmpty(ref.conversation?.conversationType ?? "");
1423
+ if (resolvedType && resolvedType !== "personal") throw new Error(`Conversation reference for user:${recipient.id} resolved to a ${resolvedType} conversation (${conversationId}) instead of a personal DM. The bot must receive a DM from this user before it can send proactively.`);
1424
+ }
1421
1425
  const log = getMSTeamsRuntime().logging.getChildLogger({ name: "msteams:send" });
1422
1426
  const { sdk, app } = await loadMSTeamsSdkWithAuth(creds);
1423
1427
  const adapter = createMSTeamsAdapter(app, sdk);
@@ -5,7 +5,7 @@ import { n as VERSION } from "./version-BnlvIG4z.js";
5
5
  import "./globals-B2UyK3pD.js";
6
6
  import { n as resolveCliName } from "./cli-name-C3YKCm0e.js";
7
7
  import { n as resolveCliChannelOptions } from "./channel-options-CN-Ctqpg.js";
8
- import { i as registerProgramCommands } from "./command-registry-BeDlThjt.js";
8
+ import { i as registerProgramCommands } from "./command-registry-D85s1_eu.js";
9
9
  import { n as setProgramContext } from "./program-context-CT69PVIU.js";
10
10
  import { t as isCommandJsonOutputMode } from "./json-mode-CAjPvZL9.js";
11
11
  import { t as forceFreePort } from "./ports-NZA2_I6X.js";
@@ -108,7 +108,7 @@ import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-_yMKjl
108
108
  import { t as formatHealthCheckFailure } from "./health-format-BXxGuUk1.js";
109
109
  import { a as stripUnknownConfigKeys, i as resolveConfigPathTarget, n as formatConfigPath, r as noteOpencodeProviderOverrides, t as runDoctorConfigPreflight } from "./doctor-config-preflight-nphoTqqi.js";
110
110
  import { a as runChannelPluginStartupMaintenance, i as normalizeCronJobIdentityFields, o as runGatewayUpdate, t as coerceFiniteScheduleNumber } from "./schedule-SK1QQumZ.js";
111
- import { n as doctorShellCompletion } from "./doctor-completion-Cl6B78v1.js";
111
+ import { n as doctorShellCompletion } from "./doctor-completion-C_CFc87W.js";
112
112
  import { t as collectChannelStatusIssues } from "./channels-status-issues-DGxyg82D.js";
113
113
  import { t as resolveDefaultChannelAccountContext } from "./channel-account-context-CnoxCGF5.js";
114
114
  import { a as runLegacyStateMigrations, n as detectLegacyStateMigrations } from "./state-migrations-CwgIXsXQ.js";
@@ -2,7 +2,7 @@ import { n as defaultRuntime } from "./runtime-BXaxArxm.js";
2
2
  import { t as formatDocsLink } from "./links-_W1ZnMwp.js";
3
3
  import { r as theme } from "./theme-DZuqFJmv.js";
4
4
  import { n as runCommandWithRuntime } from "./cli-utils-8I4_zU0Y.js";
5
- import { n as configureCommandFromSectionsArg, o as CONFIGURE_WIZARD_SECTIONS } from "./configure-p1MZA-SO.js";
5
+ import { n as configureCommandFromSectionsArg, o as CONFIGURE_WIZARD_SECTIONS } from "./configure-l_6ztbJd.js";
6
6
  //#region src/cli/program/register.configure.ts
7
7
  function registerConfigureCommand(program) {
8
8
  program.command("configure").description("Interactive configuration for credentials, channels, gateway, and agent defaults").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/configure", "docs.openclaw.ai/cli/configure")}\n`).option("--section <section>", `Configuration sections (repeatable). Options: ${CONFIGURE_WIZARD_SECTIONS.join(", ")}`, (value, previous) => [...previous, value], []).action(async (opts) => {
@@ -14,7 +14,7 @@ import { i as formatControlUiSshHint } from "./onboard-helpers-BjBs8qWy.js";
14
14
  import { r as resolveGatewayService } from "./service-C1z10Tmx.js";
15
15
  import { n as runCommandWithRuntime } from "./cli-utils-8I4_zU0Y.js";
16
16
  import { a as removePath, i as listAgentSessionDirs, o as removeStateAndLinkedPaths, r as buildCleanupPlan, s as removeWorkspaceDirs } from "./backup-create-CCoVpqMU.js";
17
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BmSssQ0t.js";
17
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BfACiVO5.js";
18
18
  import path from "node:path";
19
19
  import { cancel, confirm, isCancel, multiselect } from "@clack/prompts";
20
20
  //#region src/infra/clipboard.ts
@@ -4,7 +4,7 @@ import { r as theme } from "./theme-DZuqFJmv.js";
4
4
  import { n as runCommandWithRuntime } from "./cli-utils-8I4_zU0Y.js";
5
5
  import { c as resolveManifestProviderOnboardAuthFlags } from "./auth-choice-legacy-JypF_SN4.js";
6
6
  import { n as formatAuthChoiceChoicesForCli } from "./auth-choice-options-CE1IL5Ut.js";
7
- import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-CHJlQ2pO.js";
7
+ import { n as CORE_ONBOARD_AUTH_FLAGS, t as setupWizardCommand } from "./onboard-BdDpvGgj.js";
8
8
  //#region src/cli/program/register.onboard.ts
9
9
  function resolveInstallDaemonFlag(command, opts) {
10
10
  if (!command || typeof command !== "object") return;
@@ -10,7 +10,7 @@ import { s as resolveSessionTranscriptsDir } from "./paths-zYrymkDo.js";
10
10
  import { n as safeParseWithSchema } from "./zod-parse-DrvB8WE0.js";
11
11
  import { n as runCommandWithRuntime } from "./cli-utils-8I4_zU0Y.js";
12
12
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-DHnBXHWa.js";
13
- import { t as setupWizardCommand } from "./onboard-CHJlQ2pO.js";
13
+ import { t as setupWizardCommand } from "./onboard-BdDpvGgj.js";
14
14
  import fs from "node:fs/promises";
15
15
  import JSON5 from "json5";
16
16
  import { z } from "zod";
@@ -1,3 +1,3 @@
1
- import { n as registerSubCliByName } from "./register.subclis-BSZ4Ogu4.js";
1
+ import { n as registerSubCliByName } from "./register.subclis-D7AxmRi1.js";
2
2
  import "./subcli-descriptors-Cl-rbRxH.js";
3
3
  export { registerSubCliByName };
@@ -58,7 +58,7 @@ const entrySpecs = [
58
58
  },
59
59
  {
60
60
  commandNames: ["gateway"],
61
- loadModule: () => import("./gateway-cli-WPdEgaaR.js"),
61
+ loadModule: () => import("./gateway-cli-BB4zg2Pu.js"),
62
62
  exportName: "registerGatewayCli"
63
63
  },
64
64
  {
@@ -201,12 +201,12 @@ const entrySpecs = [
201
201
  },
202
202
  {
203
203
  commandNames: ["update"],
204
- loadModule: () => import("./update-cli-BtCbVXTO.js"),
204
+ loadModule: () => import("./update-cli-C96vBpAJ.js"),
205
205
  exportName: "registerUpdateCli"
206
206
  },
207
207
  {
208
208
  commandNames: ["completion"],
209
- loadModule: () => import("./completion-cli-DNUbbtNb.js"),
209
+ loadModule: () => import("./completion-cli-1z1xZCDl.js"),
210
210
  exportName: "registerCompletionCli"
211
211
  }
212
212
  ])
@@ -231,14 +231,14 @@ const routedCommandDefinitions = {
231
231
  "config-get": defineRoutedCommand({
232
232
  parseArgs: parseConfigGetRouteArgs,
233
233
  runParsedArgs: async (args) => {
234
- const { runConfigGet } = await import("./config-cli-BO7tgnNS.js");
234
+ const { runConfigGet } = await import("./config-cli-J5ilTjk5.js");
235
235
  await runConfigGet(args);
236
236
  }
237
237
  }),
238
238
  "config-unset": defineRoutedCommand({
239
239
  parseArgs: parseConfigUnsetRouteArgs,
240
240
  runParsedArgs: async (args) => {
241
- const { runConfigUnset } = await import("./config-cli-BO7tgnNS.js");
241
+ const { runConfigUnset } = await import("./config-cli-J5ilTjk5.js");
242
242
  await runConfigUnset(args);
243
243
  }
244
244
  }),
@@ -395,7 +395,7 @@ async function runCli(argv = process$1.argv) {
395
395
  if (await tryRouteCli(normalizedArgv)) return;
396
396
  enableConsoleCapture();
397
397
  const [{ buildProgram }, { installUnhandledRejectionHandler }, { restoreTerminalState }] = await Promise.all([
398
- import("./program-CWyRO-qJ.js"),
398
+ import("./program-D3LRs06L.js"),
399
399
  import("./unhandled-rejections-ujRfWFpR.js"),
400
400
  import("./restore-ADlpnb-M.js")
401
401
  ]);
@@ -412,10 +412,10 @@ async function runCli(argv = process$1.argv) {
412
412
  const { getProgramContext } = await import("./program-context-BDqaudjJ.js");
413
413
  const ctx = getProgramContext(program);
414
414
  if (ctx) {
415
- const { registerCoreCliByName } = await import("./command-registry-C8pbWQb8.js");
415
+ const { registerCoreCliByName } = await import("./command-registry-DWOyfJhm.js");
416
416
  await registerCoreCliByName(program, ctx, primary, parseArgv);
417
417
  }
418
- const { registerSubCliByName } = await import("./register.subclis-DsjM0woD.js");
418
+ const { registerSubCliByName } = await import("./register.subclis-Btu1bO0l.js");
419
419
  await registerSubCliByName(program, primary);
420
420
  }
421
421
  if (!shouldSkipPluginCommandRegistration({
@@ -25755,7 +25755,7 @@ const GENERATED_BASE_CONFIG_SCHEMA = {
25755
25755
  ] },
25756
25756
  "mcp.servers.*.url": { tags: ["advanced", "url-secret"] }
25757
25757
  },
25758
- version: "2026.4.9-beta.1",
25758
+ version: "2026.4.9",
25759
25759
  generatedAt: "2026-03-22T21:17:33.302Z"
25760
25760
  };
25761
25761
  //#endregion
@@ -1,7 +1,7 @@
1
1
  import { t as truncateCloseReason } from "./close-reason-DbI6xLvl.js";
2
2
  //#region src/gateway/server.ts
3
3
  async function loadServerImpl() {
4
- return await import("./server.impl-Ddsg2W_l.js");
4
+ return await import("./server.impl-BxLfE9ri.js");
5
5
  }
6
6
  async function startGatewayServer(...args) {
7
7
  return await (await loadServerImpl()).startGatewayServer(...args);
@@ -215,7 +215,7 @@ import { a as performGatewaySessionReset } from "./session-reset-service-DHBiNrj
215
215
  import { t as ensureOpenClawCliOnPath } from "./path-env-Bdv42_30.js";
216
216
  import { m as normalizeUpdateChannel, n as compareSemverStrings, o as resolveNpmChannelTag, t as checkUpdateStatus } from "./update-check-BEBf8xUe.js";
217
217
  import { t as buildChannelUiCatalog } from "./catalog-Bjwu2GwC.js";
218
- import { a as redactConfigSnapshot, i as redactConfigObject, o as restoreRedactedValues, r as lookupConfigSchema, t as loadGatewayRuntimeConfigSchema } from "./runtime-schema-Dn6Hpv5z.js";
218
+ import { a as redactConfigSnapshot, i as redactConfigObject, o as restoreRedactedValues, r as lookupConfigSchema, t as loadGatewayRuntimeConfigSchema } from "./runtime-schema-IZwxDrJI.js";
219
219
  import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-CGrBWGjE.js";
220
220
  import { n as getHealthSnapshot } from "./health-ozfYRSKh.js";
221
221
  import { a as resolveControlUiRootOverrideSync, n as isPackageProvenControlUiRootSync, o as resolveControlUiRootSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-g3xdnck9.js";
@@ -227,7 +227,7 @@ import { i as loadAgentIdentity, o as pruneAgentConfig, r as findAgentEntryIndex
227
227
  import { t as installSkill } from "./skills-install-BGJhpUEO.js";
228
228
  import { a as runChannelPluginStartupMaintenance, i as normalizeCronJobIdentityFields, n as computeNextRunAtMs, o as runGatewayUpdate, r as computePreviousRunAtMs, t as coerceFiniteScheduleNumber } from "./schedule-SK1QQumZ.js";
229
229
  import { i as migrateOrphanedSessionKeys } from "./state-migrations-CwgIXsXQ.js";
230
- import { t as runSetupWizard } from "./setup-BGObu4W2.js";
230
+ import { t as runSetupWizard } from "./setup-BsIdb5Ko.js";
231
231
  import "./status-BIazBGNL.js";
232
232
  import { t as getStatusSummary } from "./status.summary-B_YheLCO.js";
233
233
  import { _ as clearCronJobActive, i as getInspectableTaskRegistrySummary, m as stopTaskRegistryMaintenance, p as startTaskRegistryMaintenance, v as markCronJobActive } from "./task-registry.audit-DUWc1kTA.js";
@@ -403,7 +403,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
403
403
  nextConfig = await setupSkills(nextConfig, workspaceDir, runtime, prompter);
404
404
  }
405
405
  if (flow !== "quickstart") {
406
- const { setupPluginConfig } = await import("./setup.plugin-config-CoWe0qTX.js");
406
+ const { setupPluginConfig } = await import("./setup.plugin-config-B24OprEh.js");
407
407
  nextConfig = await setupPluginConfig({
408
408
  config: nextConfig,
409
409
  prompter,
@@ -417,7 +417,7 @@ async function runSetupWizard(opts, runtime = defaultRuntime, prompter) {
417
417
  mode
418
418
  });
419
419
  await writeConfigFile(nextConfig);
420
- const { finalizeSetupWizard } = await import("./setup.finalize-65M2c8wB.js");
420
+ const { finalizeSetupWizard } = await import("./setup.finalize-L1m4gLYy.js");
421
421
  const { launchedTui } = await finalizeSetupWizard({
422
422
  flow,
423
423
  opts,
@@ -12,12 +12,12 @@ import { h as waitForGatewayReachable, i as formatControlUiSshHint, u as probeGa
12
12
  import { i as isSystemdUserServiceAvailable } from "./systemd-CV_dj-oM.js";
13
13
  import { r as resolveGatewayService, t as describeGatewayServiceRestart } from "./service-C1z10Tmx.js";
14
14
  import { n as listConfiguredWebSearchProviders } from "./runtime-Cz50qJef.js";
15
- import { r as installCompletion } from "./completion-cli-B47O1GLh.js";
15
+ import { r as installCompletion } from "./completion-cli-klMIRvmG.js";
16
16
  import { r as healthCommand } from "./health-ozfYRSKh.js";
17
17
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-g3xdnck9.js";
18
18
  import { t as resolveSetupSecretInputString } from "./setup.secret-input-CBNVAHGH.js";
19
19
  import { t as formatHealthCheckFailure } from "./health-format-BXxGuUk1.js";
20
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Cl6B78v1.js";
20
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-C_CFc87W.js";
21
21
  import { t as runTui } from "./tui-Dl-T6b_3.js";
22
22
  import path from "node:path";
23
23
  import os from "node:os";
@@ -178,14 +178,18 @@ async function setupPluginConfig(params) {
178
178
  if (unconfigured.length === 0) return params.config;
179
179
  const selected = await params.prompter.multiselect({
180
180
  message: "Configure plugins (select to set up now, or skip)",
181
- options: unconfigured.map((p) => ({
181
+ options: [{
182
+ value: "__skip__",
183
+ label: "Skip for now",
184
+ hint: "Continue without configuring plugins"
185
+ }, ...unconfigured.map((p) => ({
182
186
  value: p.id,
183
187
  label: p.name,
184
188
  hint: `${Object.keys(p.uiHints).length} field${Object.keys(p.uiHints).length === 1 ? "" : "s"}`
185
- }))
189
+ }))]
186
190
  });
187
191
  let config = params.config;
188
- for (const pluginId of selected) {
192
+ for (const pluginId of selected.filter((value) => value !== "__skip__")) {
189
193
  const plugin = unconfigured.find((p) => p.id === pluginId);
190
194
  if (!plugin) continue;
191
195
  await params.prompter.note(`Configure ${plugin.name}`, "Plugin setup");
@@ -1,5 +1,6 @@
1
1
  import { d as readStringValue, i as normalizeLowercaseStringOrEmpty, o as normalizeOptionalLowercaseString, s as normalizeOptionalString } from "./string-coerce-CIT1-v_a.js";
2
2
  import { l as isRecord } from "./utils-Supr9KvU.js";
3
+ import { d as resolveThreadSessionKeys } from "./session-key-BMb3Kc4r.js";
3
4
  import { t as DEFAULT_ACCOUNT_ID } from "./account-id-BfovDWrj.js";
4
5
  import { n as formatAllowlistMatchMeta } from "./allowlist-match-HRlAUlGe.js";
5
6
  import { n as estimateBase64DecodedBytes } from "./base64-CmMl2H_S.js";
@@ -7,6 +8,7 @@ import { x as buildMediaPayload } from "./reply-payload-CcbNO0Ax.js";
7
8
  import { n as fetchWithSsrFGuard } from "./fetch-guard-Conjfhmz.js";
8
9
  import "./text-runtime-BngW26kR.js";
9
10
  import { n as isDangerousNameMatchingEnabled } from "./dangerous-name-matching-BbTrjLRR.js";
11
+ import "./routing-CC84LXmn.js";
10
12
  import { r as resolveDualTextControlCommandGate } from "./command-gating-mecLfesJ.js";
11
13
  import { n as resolveInboundMentionDecision } from "./mention-gating-C_fH86hV.js";
12
14
  import { n as keepHttpServerTaskAlive } from "./channel-lifecycle.core-ks58oyKs.js";
@@ -29,7 +31,7 @@ import { c as createDraftStreamLoop } from "./channel-lifecycle-BdUpWVZ-.js";
29
31
  import { A as isLikelyImageAttachment, B as resolveMSTeamsCredentials, C as GRAPH_ROOT, D as extractInlineImageCandidates, E as extractHtmlFromAttachment, F as resolveMediaSsrfPolicy, I as resolveRequestUrl, L as safeFetchWithPolicy, M as normalizeContentType, N as readNestedString, O as inferPlaceholder, P as resolveAttachmentFetchPolicy, R as safeHostForUrl, S as ATTACHMENT_TAG_RE, T as applyAuthorizationHeaderForUrl, _ as ensureUserAgentHeader, b as formatUnknownError, f as createBotFrameworkJwtValidator, h as loadMSTeamsSdkWithAuth, i as fetchGraphJson, j as isUrlAllowed, k as isDownloadableAttachment, m as createMSTeamsTokenProvider, p as createMSTeamsAdapter, v as classifyMSTeamsSendError, w as IMG_SRC_RE, y as formatMSTeamsSendErrorHint } from "./graph-users-BEuPEsk1.js";
30
32
  import { t as getMSTeamsRuntime } from "./runtime-api-BkG9fr64.js";
31
33
  import { a as resolveMSTeamsRouteConfig, d as resolveMSTeamsChannelAllowlist, f as resolveMSTeamsUserAllowlist, i as resolveMSTeamsReplyPolicy, n as resolveMSTeamsAllowlistMatch, t as isMSTeamsGroupAllowed } from "./policy-Dir5qnAZ.js";
32
- import { _ as createMSTeamsPollStoreFs, c as renderReplyPayloadsToMessages, d as withRevokedProxyFallback, f as getPendingUpload, g as uploadToConsentUrl, h as parseFileConsentInvoke, l as sendMSTeamsMessages, m as buildFileInfoCard, p as removePendingUpload, s as buildConversationReference, u as AI_GENERATED_ENTITY, v as extractMSTeamsPollVote, y as createMSTeamsConversationStoreFs } from "./probe-Y_CEzcAI.js";
34
+ import { _ as createMSTeamsPollStoreFs, c as renderReplyPayloadsToMessages, d as withRevokedProxyFallback, f as getPendingUpload, g as uploadToConsentUrl, h as parseFileConsentInvoke, l as sendMSTeamsMessages, m as buildFileInfoCard, p as removePendingUpload, s as buildConversationReference, u as AI_GENERATED_ENTITY, v as extractMSTeamsPollVote, y as createMSTeamsConversationStoreFs } from "./probe-CjLA1BfT.js";
33
35
  //#region extensions/msteams/src/feedback-reflection-prompt.ts
34
36
  /** Max chars of the thumbed-down response to include in the reflection prompt. */
35
37
  const MAX_RESPONSE_CHARS = 500;
@@ -1595,7 +1597,7 @@ function extractTextFromHtmlAttachments(attachments) {
1595
1597
  return "";
1596
1598
  }
1597
1599
  function buildStoredConversationReference(params) {
1598
- const { activity, conversationId, conversationType, teamId } = params;
1600
+ const { activity, conversationId, conversationType, teamId, threadId } = params;
1599
1601
  const from = activity.from;
1600
1602
  const conversation = activity.conversation;
1601
1603
  const agent = activity.recipient;
@@ -1621,7 +1623,8 @@ function buildStoredConversationReference(params) {
1621
1623
  channelId: activity.channelId,
1622
1624
  serviceUrl: activity.serviceUrl,
1623
1625
  locale: activity.locale,
1624
- ...clientInfo?.timezone ? { timezone: clientInfo.timezone } : {}
1626
+ ...clientInfo?.timezone ? { timezone: clientInfo.timezone } : {},
1627
+ ...threadId ? { threadId } : {}
1625
1628
  };
1626
1629
  }
1627
1630
  function createMSTeamsMessageHandler(deps) {
@@ -1681,7 +1684,8 @@ function createMSTeamsMessageHandler(deps) {
1681
1684
  activity,
1682
1685
  conversationId,
1683
1686
  conversationType,
1684
- teamId
1687
+ teamId,
1688
+ threadId: conversationType === "channel" ? conversationMessageId ?? activity.replyToId ?? void 0 : void 0
1685
1689
  });
1686
1690
  const { dmPolicy, senderId, senderName, pairing, isDirectMessage, channelGate, access, configuredDmAllowFrom, effectiveDmAllowFrom, effectiveGroupAllowFrom, allowNameMatching, groupPolicy } = await resolveMSTeamsSenderAccess({
1687
1691
  cfg,
@@ -1860,6 +1864,12 @@ function createMSTeamsMessageHandler(deps) {
1860
1864
  id: isDirectMessage ? senderId : conversationId
1861
1865
  }
1862
1866
  });
1867
+ const channelThreadId = isChannel ? conversationMessageId ?? activity.replyToId ?? void 0 : void 0;
1868
+ route.sessionKey = resolveThreadSessionKeys({
1869
+ baseSessionKey: route.sessionKey,
1870
+ threadId: channelThreadId,
1871
+ parentSessionKey: channelThreadId ? route.sessionKey : void 0
1872
+ }).sessionKey;
1863
1873
  const preview = rawBody.replace(/\s+/g, " ").slice(0, 160);
1864
1874
  const inboundLabel = isDirectMessage ? `Teams DM from ${senderName}` : `Teams message in ${conversationType} from ${senderName}`;
1865
1875
  core.system.enqueueSystemEvent(`${inboundLabel}: ${preview}`, {
@@ -2355,7 +2365,8 @@ async function handleFeedbackInvoke(context, deps) {
2355
2365
  if (value.actionValue?.feedback) try {
2356
2366
  userComment = JSON.parse(value.actionValue.feedback).feedbackText || void 0;
2357
2367
  } catch {}
2358
- const conversationId = normalizeMSTeamsConversationId(activity.conversation?.id ?? "unknown");
2368
+ const rawConversationId = activity.conversation?.id ?? "unknown";
2369
+ const conversationId = normalizeMSTeamsConversationId(rawConversationId);
2359
2370
  const senderId = activity.from?.aadObjectId ?? activity.from?.id ?? "unknown";
2360
2371
  const messageId = value.replyToId ?? activity.replyToId ?? "unknown";
2361
2372
  const isNegative = reaction === "dislike";
@@ -2371,6 +2382,12 @@ async function handleFeedbackInvoke(context, deps) {
2371
2382
  id: isDirectMessage ? senderId : conversationId
2372
2383
  }
2373
2384
  });
2385
+ const feedbackThreadId = isChannel ? extractMSTeamsConversationMessageId(rawConversationId) ?? activity.replyToId ?? void 0 : void 0;
2386
+ if (feedbackThreadId) route.sessionKey = resolveThreadSessionKeys({
2387
+ baseSessionKey: route.sessionKey,
2388
+ threadId: feedbackThreadId,
2389
+ parentSessionKey: route.sessionKey
2390
+ }).sessionKey;
2374
2391
  const feedbackEvent = buildFeedbackEvent({
2375
2392
  messageId,
2376
2393
  value: isNegative ? "negative" : "positive",
@@ -24,11 +24,11 @@ import { t as formatHelpExamples } from "./help-format-wJNYco7E.js";
24
24
  import { n as renderTable, t as getTerminalTableWidth } from "./table-hG746WbE.js";
25
25
  import { d as formatUpdateChannelLabel, g as resolveUpdateChannelDisplay, h as resolveEffectiveUpdateChannel, i as fetchNpmTagVersion, m as normalizeUpdateChannel, n as compareSemverStrings, o as resolveNpmChannelTag, r as fetchNpmPackageTargetStatus, t as checkUpdateStatus, u as channelToNpmTag } from "./update-check-BEBf8xUe.js";
26
26
  import { i as resolveUpdateAvailability, n as formatUpdateOneLiner, t as formatUpdateAvailableHint } from "./status.update-DAaDcuFD.js";
27
- import { r as installCompletion } from "./completion-cli-B47O1GLh.js";
27
+ import { r as installCompletion } from "./completion-cli-klMIRvmG.js";
28
28
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-I8GmTV-T.js";
29
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BmSssQ0t.js";
29
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BfACiVO5.js";
30
30
  import { _ as normalizePackageTagInput, c as cleanupGlobalRenameDirs, d as detectGlobalInstallManagerByPresence, f as detectGlobalInstallManagerForRoot, g as resolveGlobalInstallTarget, h as resolveGlobalInstallSpec, l as collectInstalledGlobalPackageErrors, m as resolveExpectedInstalledVersionFromSpec, o as runGatewayUpdate, p as globalInstallArgs, s as canResolveRegistryVersionForPackageTarget, u as createGlobalInstallEnv, v as readPackageName, y as readPackageVersion } from "./schedule-SK1QQumZ.js";
31
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Cl6B78v1.js";
31
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-C_CFc87W.js";
32
32
  import path from "node:path";
33
33
  import { spawn, spawnSync } from "node:child_process";
34
34
  import os from "node:os";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw",
3
- "version": "2026.4.9-beta.1",
3
+ "version": "2026.4.9",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",