@lawpath-tech/openclaw 2026.2.21-28 → 2026.2.21-29

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 (78) hide show
  1. package/dist/{audio-preflight-Da7vejCH.js → audio-preflight-CODznzqu.js} +4 -4
  2. package/dist/build-info.json +3 -3
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/{chrome-CZuniMYN.js → chrome-lRUqqgSD.js} +7 -7
  5. package/dist/{deliver-0ThKlzQo.js → deliver-B2d2N8OJ.js} +1 -1
  6. package/dist/extensionAPI.js +6 -6
  7. package/dist/{image-88q3KE-C.js → image--DDZnw-F.js} +1 -1
  8. package/dist/{pi-embedded-ZvazjIyF.js → pi-embedded-C_B8_quB.js} +16 -16
  9. package/dist/{pi-embedded-helpers-B0Kht0I2.js → pi-embedded-helpers-Cd0S0WfR.js} +4 -4
  10. package/dist/plugin-sdk/{accounts-DUBJHEgi.js → accounts-BcQo4OUu.js} +1 -1
  11. package/dist/plugin-sdk/{accounts-wSu5JyDM.js → accounts-DEsAwvaZ.js} +1 -1
  12. package/dist/plugin-sdk/{accounts-Ciwy7Yxd.js → accounts-fnLsjAOi.js} +3 -3
  13. package/dist/plugin-sdk/{active-listener-Bnau4oiu.js → active-listener-CeaKSm29.js} +1 -1
  14. package/dist/plugin-sdk/{agent-scope-cT7IxdHY.js → agent-scope-D5PlT0Z0.js} +2 -2
  15. package/dist/plugin-sdk/{api-key-rotation-ElOMCP9r.js → api-key-rotation-B3O1qn0m.js} +1 -1
  16. package/dist/plugin-sdk/{audio-preflight-DtozH3sJ.js → audio-preflight-CYSy3uuZ.js} +24 -24
  17. package/dist/plugin-sdk/{bindings-CKqdifyU.js → bindings-C0XEX0yK.js} +2 -2
  18. package/dist/plugin-sdk/{channel-activity-CCnr-9bS.js → channel-activity-WgE8Z4Bb.js} +1 -1
  19. package/dist/plugin-sdk/{channel-web-BHNS_E7F.js → channel-web-Nw-bUgtV.js} +22 -22
  20. package/dist/plugin-sdk/{chrome-BO7SUTgY.js → chrome-C1xnOQsc.js} +3 -3
  21. package/dist/plugin-sdk/{chunk-DyzO7IVo.js → chunk-CQk9vawA.js} +1 -1
  22. package/dist/plugin-sdk/{command-format-DcBXOX9Z.js → command-format-DHXa0Clc.js} +1 -1
  23. package/dist/plugin-sdk/{commands-registry-BsSKPwgj.js → commands-registry-yTZdwtLj.js} +4 -4
  24. package/dist/plugin-sdk/{config-9OZuRn0C.js → config--kW4R0el.js} +9 -9
  25. package/dist/plugin-sdk/{deliver-BO_wt0wd.js → deliver-C2gjA_UH.js} +10 -10
  26. package/dist/plugin-sdk/{diagnostic-DKyVS3IK.js → diagnostic-Up1aMyxZ.js} +1 -1
  27. package/dist/plugin-sdk/{image-C31B_R8P.js → image-Bcc99tVA.js} +4 -4
  28. package/dist/plugin-sdk/{image-ops-B8aJIly2.js → image-ops-C6RLbtSJ.js} +1 -1
  29. package/dist/plugin-sdk/index.js +53 -53
  30. package/dist/plugin-sdk/{ir-CD5VqKGg.js → ir-Cwi1KVG5.js} +4 -4
  31. package/dist/plugin-sdk/{local-roots-D4PCK2jj.js → local-roots-6BSl8AoA.js} +3 -3
  32. package/dist/plugin-sdk/{login-CW17h3xU.js → login-Cau5eVVj.js} +7 -7
  33. package/dist/plugin-sdk/{login-qr-CMdk06CS.js → login-qr-CLWtfA9m.js} +9 -9
  34. package/dist/plugin-sdk/{manager-CZPPxI6R.js → manager-C3Eb_8Hz.js} +8 -8
  35. package/dist/plugin-sdk/{manifest-registry-sgHvjA6E.js → manifest-registry-DvEm2HHf.js} +1 -1
  36. package/dist/plugin-sdk/{markdown-tables-Bo-r4msS.js → markdown-tables-cJqvQe9j.js} +1 -1
  37. package/dist/plugin-sdk/{message-channel-DmB4bGFh.js → message-channel-DY9wVB2A.js} +1 -1
  38. package/dist/plugin-sdk/{model-selection-CXooYLb2.js → model-selection-BjVTBZiY.js} +4 -4
  39. package/dist/plugin-sdk/{outbound-dAcQHyyr.js → outbound-Co1QSkdS.js} +7 -7
  40. package/dist/plugin-sdk/{outbound-attachment-CCxMtk8m.js → outbound-attachment-CsmRyZPI.js} +2 -2
  41. package/dist/plugin-sdk/{pi-auth-json-C-euHc3x.js → pi-auth-json-DfEOhoTK.js} +5 -5
  42. package/dist/plugin-sdk/{pi-embedded-helpers-DU0nLxRU.js → pi-embedded-helpers-D3EACnFn.js} +17 -17
  43. package/dist/plugin-sdk/{plugins-DIzw7Ncy.js → plugins-Dyz98ZJX.js} +4 -4
  44. package/dist/plugin-sdk/{pw-ai-CYmDAwXD.js → pw-ai-smoXiGqZ.js} +8 -8
  45. package/dist/plugin-sdk/{qmd-manager-DQiT4WTr.js → qmd-manager-CUhJ7WG2.js} +4 -4
  46. package/dist/plugin-sdk/{registry-O1yza0Vh.js → registry-DL-33c9X.js} +2 -2
  47. package/dist/plugin-sdk/{replies-Bnu7HnvW.js → replies-Bkaifx0j.js} +3 -3
  48. package/dist/plugin-sdk/{reply-DEepmBkT.js → reply-Cb54ddUA.js} +78 -78
  49. package/dist/plugin-sdk/{reply-prefix-BF0omhZE.js → reply-prefix-5vdbga0R.js} +1 -1
  50. package/dist/plugin-sdk/{resolve-outbound-target-DzZIT1V1.js → resolve-outbound-target-CP7QDN14.js} +2 -2
  51. package/dist/plugin-sdk/{resolve-route-B63ztF-V.js → resolve-route-eopifBrM.js} +3 -3
  52. package/dist/plugin-sdk/{retry-JFNwfUew.js → retry-5P3d0rYw.js} +1 -1
  53. package/dist/plugin-sdk/{runner-DztRiWhh.js → runner-DqwPn56n.js} +9 -9
  54. package/dist/plugin-sdk/{send-DEV4iiFj.js → send-C2NQjVF9.js} +10 -10
  55. package/dist/plugin-sdk/{send-D-spKwjf.js → send-D_X6p9H0.js} +10 -10
  56. package/dist/plugin-sdk/{send-CK3DCPv-.js → send-DnFB-v5n.js} +6 -6
  57. package/dist/plugin-sdk/{send-D1C2sJG1.js → send-PPtjKj-0.js} +7 -7
  58. package/dist/plugin-sdk/{send-DrYvH25B.js → send-_uj_NuFI.js} +6 -6
  59. package/dist/plugin-sdk/{session-DRJl5tKC.js → session-CZngPTYk.js} +4 -4
  60. package/dist/plugin-sdk/{skill-commands-Dv5AeOZQ.js → skill-commands-Cr54qPdy.js} +5 -5
  61. package/dist/plugin-sdk/{skills-5hEda4_Y.js → skills-Dcu4o-9l.js} +7 -7
  62. package/dist/plugin-sdk/{sqlite-DUu0dwic.js → sqlite-ulpcowfN.js} +1 -1
  63. package/dist/plugin-sdk/{store-DoRXD0QB.js → store-EUYCRBvs.js} +2 -2
  64. package/dist/plugin-sdk/{subsystem-C4Rh0kdL.js → subsystem-C9WnrKN8.js} +1 -1
  65. package/dist/plugin-sdk/{tables-C_81Ve2l.js → tables-CMdQECje.js} +1 -1
  66. package/dist/plugin-sdk/{target-errors-C638yp2-.js → target-errors-CrR2lAF7.js} +2 -2
  67. package/dist/plugin-sdk/{thinking-DexKPSsI.js → thinking-C7zYA2s9.js} +5 -5
  68. package/dist/plugin-sdk/{tokens-K9ITCatc.js → tokens-2475WU2Z.js} +1 -1
  69. package/dist/plugin-sdk/{tool-images-BvjD_HnR.js → tool-images-DCvC8yL7.js} +2 -2
  70. package/dist/plugin-sdk/{tool-loop-detection-BBRtoox8.js → tool-loop-detection-D0ADW0h2.js} +2 -2
  71. package/dist/plugin-sdk/web-BVkjyY4A.js +65 -0
  72. package/dist/plugin-sdk/{whatsapp-actions-D8i2vCxS.js → whatsapp-actions-DC4RRNqv.js} +21 -21
  73. package/dist/{pw-ai-S3cpSYOy.js → pw-ai-C-kqYO4L.js} +1 -1
  74. package/dist/{runner-a43IsYad.js → runner-Dq-qfrq7.js} +1 -1
  75. package/dist/{web-CVSol55V.js → web-DiYh3u92.js} +6 -6
  76. package/extensions/voice-call/src/providers/realtime-session.ts +46 -107
  77. package/package.json +1 -1
  78. package/dist/plugin-sdk/web-DBo-6RyH.js +0 -65
@@ -1,12 +1,12 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { n as fetchWithTimeout } from "./fetch-timeout-ChYuW7LE.js";
3
3
  import { t as resolveFetch } from "./fetch-b2Zm8y7X.js";
4
- import { n as loadConfig } from "./config-9OZuRn0C.js";
5
- import { v as mediaKindFromMime } from "./image-ops-B8aJIly2.js";
6
- import { n as markdownToIR, t as chunkMarkdownIR } from "./ir-CD5VqKGg.js";
7
- import { n as resolveMarkdownTableMode } from "./markdown-tables-Bo-r4msS.js";
8
- import { i as resolveSignalAccount } from "./accounts-DUBJHEgi.js";
9
- import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-CCxMtk8m.js";
4
+ import { n as loadConfig } from "./config--kW4R0el.js";
5
+ import { v as mediaKindFromMime } from "./image-ops-C6RLbtSJ.js";
6
+ import { n as markdownToIR, t as chunkMarkdownIR } from "./ir-Cwi1KVG5.js";
7
+ import { n as resolveMarkdownTableMode } from "./markdown-tables-cJqvQe9j.js";
8
+ import { i as resolveSignalAccount } from "./accounts-BcQo4OUu.js";
9
+ import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-CsmRyZPI.js";
10
10
  import { randomUUID } from "node:crypto";
11
11
 
12
12
  //#region src/signal/client.ts
@@ -1,7 +1,7 @@
1
- import { d as readCredsJsonRaw, h as resolveWebCredsPath, l as maybeRestoreCredsFromBackup, m as resolveWebCredsBackupPath, p as resolveDefaultWebAuthDir } from "./accounts-Ciwy7Yxd.js";
2
- import { P as resolveUserPath, U as danger, X as success, at as toPinoLikeLogger, tt as getChildLogger, w as ensureDir } from "./registry-O1yza0Vh.js";
3
- import { Z as VERSION } from "./config-9OZuRn0C.js";
4
- import { t as formatCliCommand } from "./command-format-DcBXOX9Z.js";
1
+ import { d as readCredsJsonRaw, h as resolveWebCredsPath, l as maybeRestoreCredsFromBackup, m as resolveWebCredsBackupPath, p as resolveDefaultWebAuthDir } from "./accounts-fnLsjAOi.js";
2
+ import { P as resolveUserPath, U as danger, X as success, at as toPinoLikeLogger, tt as getChildLogger, w as ensureDir } from "./registry-DL-33c9X.js";
3
+ import { Z as VERSION } from "./config--kW4R0el.js";
4
+ import { t as formatCliCommand } from "./command-format-DHXa0Clc.js";
5
5
  import fs from "node:fs";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, makeWASocket, useMultiFileAuthState } from "@whiskeysockets/baileys";
@@ -1,10 +1,10 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { s as resolveStateDir } from "./paths-DVWx7USN.js";
3
- import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-O1yza0Vh.js";
4
- import { t as createSubsystemLogger } from "./subsystem-C4Rh0kdL.js";
5
- import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-cT7IxdHY.js";
6
- import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-5hEda4_Y.js";
7
- import { i as listChatCommands } from "./commands-registry-BsSKPwgj.js";
3
+ import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-DL-33c9X.js";
4
+ import { t as createSubsystemLogger } from "./subsystem-C9WnrKN8.js";
5
+ import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-D5PlT0Z0.js";
6
+ import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-Dcu4o-9l.js";
7
+ import { i as listChatCommands } from "./commands-registry-yTZdwtLj.js";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -1,12 +1,12 @@
1
- import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-O1yza0Vh.js";
2
- import { t as createSubsystemLogger } from "./subsystem-C4Rh0kdL.js";
3
- import { i as parseBooleanValue } from "./command-format-DcBXOX9Z.js";
4
- import { M as normalizeSkillFilter, w as resolveOpenClawPackageRootSync } from "./agent-scope-cT7IxdHY.js";
5
- import { a as LEGACY_MANIFEST_KEYS, c as normalizePluginsConfig, l as resolveEnableState, o as MANIFEST_KEY, p as isDangerousHostEnvVarName, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-sgHvjA6E.js";
1
+ import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-DL-33c9X.js";
2
+ import { t as createSubsystemLogger } from "./subsystem-C9WnrKN8.js";
3
+ import { i as parseBooleanValue } from "./command-format-DHXa0Clc.js";
4
+ import { M as normalizeSkillFilter, w as resolveOpenClawPackageRootSync } from "./agent-scope-D5PlT0Z0.js";
5
+ import { a as LEGACY_MANIFEST_KEYS, c as normalizePluginsConfig, l as resolveEnableState, o as MANIFEST_KEY, p as isDangerousHostEnvVarName, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-DvEm2HHf.js";
6
6
  import fs from "node:fs";
7
7
  import path from "node:path";
8
8
  import os from "node:os";
9
- import JSON5 from "json5";
9
+ import json5 from "json5";
10
10
  import { createHash, timingSafeEqual } from "node:crypto";
11
11
  import fs$1 from "node:fs/promises";
12
12
  import { fileURLToPath } from "node:url";
@@ -226,7 +226,7 @@ function resolveOpenClawManifestBlock(params) {
226
226
  const raw = getFrontmatterString(params.frontmatter, params.key ?? "metadata");
227
227
  if (!raw) return;
228
228
  try {
229
- const parsed = JSON5.parse(raw);
229
+ const parsed = json5.parse(raw);
230
230
  if (!parsed || typeof parsed !== "object") return;
231
231
  const manifestKeys = [MANIFEST_KEY, ...LEGACY_MANIFEST_KEYS];
232
232
  for (const key of manifestKeys) {
@@ -1,4 +1,4 @@
1
- import { t as createSubsystemLogger } from "./subsystem-C4Rh0kdL.js";
1
+ import { t as createSubsystemLogger } from "./subsystem-C9WnrKN8.js";
2
2
  import { t as redactSensitiveText } from "./redact-DPnDWsnT.js";
3
3
  import { o as resolveSessionTranscriptsDirForAgent } from "./paths-BNQjLbn7.js";
4
4
  import { createRequire } from "node:module";
@@ -1,5 +1,5 @@
1
- import { M as resolveConfigDir } from "./registry-O1yza0Vh.js";
2
- import { c as detectMime, l as extensionForMime } from "./image-ops-B8aJIly2.js";
1
+ import { M as resolveConfigDir } from "./registry-DL-33c9X.js";
2
+ import { c as detectMime, l as extensionForMime } from "./image-ops-C6RLbtSJ.js";
3
3
  import { createWriteStream } from "node:fs";
4
4
  import path from "node:path";
5
5
  import crypto from "node:crypto";
@@ -1,4 +1,4 @@
1
- import { G as isVerbose, ct as normalizeLogLevel, lt as readLoggingConfig, n as CHAT_CHANNEL_ORDER, ot as loggingState, rt as isFileLogLevelEnabled, st as levelToMinLevel, tt as getChildLogger } from "./registry-O1yza0Vh.js";
1
+ import { G as isVerbose, ct as normalizeLogLevel, lt as readLoggingConfig, n as CHAT_CHANNEL_ORDER, ot as loggingState, rt as isFileLogLevelEnabled, st as levelToMinLevel, tt as getChildLogger } from "./registry-DL-33c9X.js";
2
2
  import { Chalk } from "chalk";
3
3
 
4
4
  //#region src/terminal/progress-line.ts
@@ -1,4 +1,4 @@
1
- import { r as markdownToIRWithMeta } from "./ir-CD5VqKGg.js";
1
+ import { r as markdownToIRWithMeta } from "./ir-Cwi1KVG5.js";
2
2
  import { t as renderMarkdownWithMarkers } from "./render-BiJZ5W4Z.js";
3
3
 
4
4
  //#region src/markdown/tables.ts
@@ -1,5 +1,5 @@
1
- import { c as detectMime } from "./image-ops-B8aJIly2.js";
2
- import { r as sanitizeToolResultImages } from "./tool-images-BvjD_HnR.js";
1
+ import { c as detectMime } from "./image-ops-C6RLbtSJ.js";
2
+ import { r as sanitizeToolResultImages } from "./tool-images-DCvC8yL7.js";
3
3
  import fs from "node:fs/promises";
4
4
 
5
5
  //#region src/agents/tools/common.ts
@@ -1,9 +1,9 @@
1
1
  import { p as normalizeAccountId } from "./session-key-C_0eELjb.js";
2
- import { r as resolveWhatsAppAccount } from "./accounts-Ciwy7Yxd.js";
3
- import { D as resolveSlackAccount, F as resolveDiscordAccount, O as resolveSlackReplyToMode, S as resolveTelegramAccount, _ as normalizeWhatsAppTarget } from "./plugins-DIzw7Ncy.js";
4
- import { A as normalizeE164, T as escapeRegExp, i as getChatChannelMeta, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry-O1yza0Vh.js";
5
- import { r as resolveIMessageAccount } from "./accounts-wSu5JyDM.js";
6
- import { i as resolveSignalAccount } from "./accounts-DUBJHEgi.js";
2
+ import { r as resolveWhatsAppAccount } from "./accounts-fnLsjAOi.js";
3
+ import { D as resolveSlackAccount, F as resolveDiscordAccount, O as resolveSlackReplyToMode, S as resolveTelegramAccount, _ as normalizeWhatsAppTarget } from "./plugins-Dyz98ZJX.js";
4
+ import { A as normalizeE164, T as escapeRegExp, i as getChatChannelMeta, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry-DL-33c9X.js";
5
+ import { r as resolveIMessageAccount } from "./accounts-DEsAwvaZ.js";
6
+ import { i as resolveSignalAccount } from "./accounts-BcQo4OUu.js";
7
7
 
8
8
  //#region src/config/group-policy.ts
9
9
  function resolveChannelGroupConfig(groups, groupId, caseInsensitive = false) {
@@ -1,4 +1,4 @@
1
- import { T as escapeRegExp } from "./registry-O1yza0Vh.js";
1
+ import { T as escapeRegExp } from "./registry-DL-33c9X.js";
2
2
 
3
3
  //#region src/auto-reply/tokens.ts
4
4
  const HEARTBEAT_TOKEN = "HEARTBEAT_OK";
@@ -1,5 +1,5 @@
1
- import { t as createSubsystemLogger } from "./subsystem-C4Rh0kdL.js";
2
- import { i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-B8aJIly2.js";
1
+ import { t as createSubsystemLogger } from "./subsystem-C9WnrKN8.js";
2
+ import { i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-C6RLbtSJ.js";
3
3
 
4
4
  //#region src/agents/image-sanitization.ts
5
5
  const DEFAULT_IMAGE_MAX_DIMENSION_PX = 1200;
@@ -1,6 +1,6 @@
1
1
  import "./paths-DVWx7USN.js";
2
- import { H as isPlainObject } from "./registry-O1yza0Vh.js";
3
- import { t as createSubsystemLogger } from "./subsystem-C4Rh0kdL.js";
2
+ import { H as isPlainObject } from "./registry-DL-33c9X.js";
3
+ import { t as createSubsystemLogger } from "./subsystem-C9WnrKN8.js";
4
4
  import { createHash } from "node:crypto";
5
5
 
6
6
  //#region src/agents/tool-loop-detection.ts
@@ -0,0 +1,65 @@
1
+ import { a as WA_WEB_AUTH_DIR, g as webAuthExists, s as logWebSelfId, u as pickWebChannel } from "./accounts-fnLsjAOi.js";
2
+ import "./reply-Cb54ddUA.js";
3
+ import "./paths-DVWx7USN.js";
4
+ import "./github-copilot-token-Cg0YPPSu.js";
5
+ import "./plugins-Dyz98ZJX.js";
6
+ import "./fetch-b2Zm8y7X.js";
7
+ import "./registry-DL-33c9X.js";
8
+ import "./retry-5P3d0rYw.js";
9
+ import "./send-C2NQjVF9.js";
10
+ import "./config--kW4R0el.js";
11
+ import "./subsystem-C9WnrKN8.js";
12
+ import "./command-format-DHXa0Clc.js";
13
+ import "./model-selection-BjVTBZiY.js";
14
+ import "./agent-scope-D5PlT0Z0.js";
15
+ import "./manifest-registry-DvEm2HHf.js";
16
+ import "./redact-DPnDWsnT.js";
17
+ import "./errors-Bv8oZiTO.js";
18
+ import "./channel-activity-WgE8Z4Bb.js";
19
+ import "./image-ops-C6RLbtSJ.js";
20
+ import "./ssrf-DKZ8eBrk.js";
21
+ import "./local-roots-6BSl8AoA.js";
22
+ import "./ir-Cwi1KVG5.js";
23
+ import "./chunk-CQk9vawA.js";
24
+ import "./message-channel-DY9wVB2A.js";
25
+ import "./bindings-C0XEX0yK.js";
26
+ import "./markdown-tables-cJqvQe9j.js";
27
+ import "./render-BiJZ5W4Z.js";
28
+ import "./tables-CMdQECje.js";
29
+ import "./send-PPtjKj-0.js";
30
+ import "./tool-images-DCvC8yL7.js";
31
+ import "./target-errors-CrR2lAF7.js";
32
+ import "./send-DnFB-v5n.js";
33
+ import "./send-D_X6p9H0.js";
34
+ import "./runner-DqwPn56n.js";
35
+ import "./reply-prefix-5vdbga0R.js";
36
+ import "./tokens-2475WU2Z.js";
37
+ import "./skill-commands-Cr54qPdy.js";
38
+ import "./skills-Dcu4o-9l.js";
39
+ import "./chrome-C1xnOQsc.js";
40
+ import "./thinking-C7zYA2s9.js";
41
+ import "./accounts-DEsAwvaZ.js";
42
+ import "./accounts-BcQo4OUu.js";
43
+ import "./deliver-C2gjA_UH.js";
44
+ import "./pi-embedded-helpers-D3EACnFn.js";
45
+ import "./paths-BNQjLbn7.js";
46
+ import "./diagnostic-Up1aMyxZ.js";
47
+ import "./store-EUYCRBvs.js";
48
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-Nw-bUgtV.js";
49
+ import "./image-Bcc99tVA.js";
50
+ import "./pi-model-discovery-LbcEa65a.js";
51
+ import "./api-key-rotation-B3O1qn0m.js";
52
+ import "./sqlite-ulpcowfN.js";
53
+ import "./diagnostic-session-state-Wd5tNeQG.js";
54
+ import "./manager-C3Eb_8Hz.js";
55
+ import "./commands-registry-yTZdwtLj.js";
56
+ import "./send-_uj_NuFI.js";
57
+ import "./proxy-MquBDehr.js";
58
+ import "./resolve-route-eopifBrM.js";
59
+ import "./replies-Bkaifx0j.js";
60
+ import "./outbound-attachment-CsmRyZPI.js";
61
+ import { n as sendMessageWhatsApp } from "./outbound-Co1QSkdS.js";
62
+ import { i as waitForWaConnection, t as createWaSocket } from "./session-CZngPTYk.js";
63
+ import { t as loginWeb } from "./login-Cau5eVVj.js";
64
+
65
+ export { WA_WEB_AUTH_DIR, createWaSocket, logWebSelfId, loginWeb, monitorWebChannel, monitorWebInbox, pickWebChannel, sendMessageWhatsApp, waitForWaConnection, webAuthExists };
@@ -1,28 +1,28 @@
1
- import { r as resolveWhatsAppAccount } from "./accounts-Ciwy7Yxd.js";
1
+ import { r as resolveWhatsAppAccount } from "./accounts-fnLsjAOi.js";
2
2
  import "./paths-DVWx7USN.js";
3
3
  import "./github-copilot-token-Cg0YPPSu.js";
4
- import "./plugins-DIzw7Ncy.js";
5
- import "./registry-O1yza0Vh.js";
6
- import "./config-9OZuRn0C.js";
7
- import "./subsystem-C4Rh0kdL.js";
8
- import "./command-format-DcBXOX9Z.js";
9
- import "./model-selection-CXooYLb2.js";
10
- import "./agent-scope-cT7IxdHY.js";
11
- import "./manifest-registry-sgHvjA6E.js";
12
- import "./image-ops-B8aJIly2.js";
4
+ import "./plugins-Dyz98ZJX.js";
5
+ import "./registry-DL-33c9X.js";
6
+ import "./config--kW4R0el.js";
7
+ import "./subsystem-C9WnrKN8.js";
8
+ import "./command-format-DHXa0Clc.js";
9
+ import "./model-selection-BjVTBZiY.js";
10
+ import "./agent-scope-D5PlT0Z0.js";
11
+ import "./manifest-registry-DvEm2HHf.js";
12
+ import "./image-ops-C6RLbtSJ.js";
13
13
  import "./ssrf-DKZ8eBrk.js";
14
- import "./local-roots-D4PCK2jj.js";
15
- import "./ir-CD5VqKGg.js";
16
- import "./chunk-DyzO7IVo.js";
17
- import "./message-channel-DmB4bGFh.js";
18
- import "./bindings-CKqdifyU.js";
19
- import "./markdown-tables-Bo-r4msS.js";
14
+ import "./local-roots-6BSl8AoA.js";
15
+ import "./ir-Cwi1KVG5.js";
16
+ import "./chunk-CQk9vawA.js";
17
+ import "./message-channel-DY9wVB2A.js";
18
+ import "./bindings-C0XEX0yK.js";
19
+ import "./markdown-tables-cJqvQe9j.js";
20
20
  import "./render-BiJZ5W4Z.js";
21
- import "./tables-C_81Ve2l.js";
22
- import "./tool-images-BvjD_HnR.js";
23
- import { a as createActionGate, c as jsonResult, d as readReactionParams, i as ToolAuthorizationError, m as readStringParam } from "./target-errors-C638yp2-.js";
24
- import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-DzZIT1V1.js";
25
- import { r as sendReactionWhatsApp } from "./outbound-dAcQHyyr.js";
21
+ import "./tables-CMdQECje.js";
22
+ import "./tool-images-DCvC8yL7.js";
23
+ import { a as createActionGate, c as jsonResult, d as readReactionParams, i as ToolAuthorizationError, m as readStringParam } from "./target-errors-CrR2lAF7.js";
24
+ import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-CP7QDN14.js";
25
+ import { r as sendReactionWhatsApp } from "./outbound-Co1QSkdS.js";
26
26
 
27
27
  //#region src/agents/tools/whatsapp-target-auth.ts
28
28
  function resolveAuthorizedWhatsAppOutboundTarget(params) {
@@ -7,7 +7,7 @@ import "./github-copilot-token-ttqQRqMA.js";
7
7
  import { r as formatCliCommand } from "./env-DulyEJtM.js";
8
8
  import "./config-KL7847B1.js";
9
9
  import "./manifest-registry-sze5OW-s.js";
10
- import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-CZuniMYN.js";
10
+ import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-lRUqqgSD.js";
11
11
  import "./redact-1NGYV_8p.js";
12
12
  import { n as formatErrorMessage } from "./errors-CPfngF0S.js";
13
13
  import "./ssrf-CxfFyMRZ.js";
@@ -4,7 +4,7 @@ import { G as resolveOpenClawAgentDir, T as resolveApiKeyForProvider, c as norma
4
4
  import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
5
5
  import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-BfqdVNxh.js";
6
6
  import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-KL7847B1.js";
7
- import { S as ensureOpenClawModelsJson, t as describeImageWithModel } from "./image-88q3KE-C.js";
7
+ import { S as ensureOpenClawModelsJson, t as describeImageWithModel } from "./image--DDZnw-F.js";
8
8
  import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-BF6ZCNOV.js";
9
9
  import { n as fetchWithTimeout } from "./fetch-timeout-BheTNyes.js";
10
10
  import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-C4BHj9W8.js";
@@ -8,13 +8,13 @@ import { c as resolveIdentityNamePrefix, l as resolveMessagePrefix, t as createR
8
8
  import "./github-copilot-token-ttqQRqMA.js";
9
9
  import { r as formatCliCommand } from "./env-DulyEJtM.js";
10
10
  import "./tokens-DnMmat9I.js";
11
- import { C as shouldComputeCommandAuthorized, S as hasControlCommand, T as normalizeMentionText, _ as enqueueSystemEvent, a as resolveMentionGating, b as formatInboundEnvelope, c as recordPendingHistoryEntryIfEnabled, f as createDedupeCache, g as formatDurationPrecise, h as parseActivationCommand, i as buildPairingReply, l as shouldAckReactionForWhatsApp, m as normalizeGroupActivation, n as computeBackoff, o as DEFAULT_GROUP_HISTORY_LIMIT, p as getReplyFromConfig, r as sleepWithAbort, s as buildHistoryContextFromEntries, u as dispatchReplyWithBufferedBlockDispatcher, v as createInboundDebouncer, w as buildMentionRegexes, x as resolveEnvelopeFormatOptions, y as resolveInboundDebounceMs } from "./pi-embedded-ZvazjIyF.js";
11
+ import { C as shouldComputeCommandAuthorized, S as hasControlCommand, T as normalizeMentionText, _ as enqueueSystemEvent, a as resolveMentionGating, b as formatInboundEnvelope, c as recordPendingHistoryEntryIfEnabled, f as createDedupeCache, g as formatDurationPrecise, h as parseActivationCommand, i as buildPairingReply, l as shouldAckReactionForWhatsApp, m as normalizeGroupActivation, n as computeBackoff, o as DEFAULT_GROUP_HISTORY_LIMIT, p as getReplyFromConfig, r as sleepWithAbort, s as buildHistoryContextFromEntries, u as dispatchReplyWithBufferedBlockDispatcher, v as createInboundDebouncer, w as buildMentionRegexes, x as resolveEnvelopeFormatOptions, y as resolveInboundDebounceMs } from "./pi-embedded-C_B8_quB.js";
12
12
  import "./plugins-B90TBXkV.js";
13
13
  import { i as logWebSelfId, l as readWebSelfId, n as WA_WEB_AUTH_DIR, p as webAuthExists, r as getWebAuthAgeMs, s as pickWebChannel, t as resolveWhatsAppAccount } from "./accounts-Cxza2UXO.js";
14
14
  import "./bindings-q3EHMdG1.js";
15
15
  import "./send-Chks8Sx_.js";
16
16
  import "./send-D4cCHXzJ.js";
17
- import "./deliver-0ThKlzQo.js";
17
+ import "./deliver-B2d2N8OJ.js";
18
18
  import "./diagnostic-DzmNBZt3.js";
19
19
  import "./diagnostic-session-state-C1vRJs5w.js";
20
20
  import "./accounts-sr0G5UOe.js";
@@ -22,10 +22,10 @@ import { G as formatLocationText, J as readChannelAllowFromStore, K as toLocatio
22
22
  import "./image-ops-BfqdVNxh.js";
23
23
  import "./pi-model-discovery-j5tVLINv.js";
24
24
  import "./message-channel-DNOtJsL1.js";
25
- import { Ct as resolveGroupSessionKey, H as loadSessionStore, K as updateLastRoute, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-B0Kht0I2.js";
25
+ import { Ct as resolveGroupSessionKey, H as loadSessionStore, K as updateLastRoute, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-Cd0S0WfR.js";
26
26
  import { n as loadConfig } from "./config-KL7847B1.js";
27
27
  import "./manifest-registry-sze5OW-s.js";
28
- import "./chrome-CZuniMYN.js";
28
+ import "./chrome-lRUqqgSD.js";
29
29
  import "./skills-DGNBryo1.js";
30
30
  import "./redact-1NGYV_8p.js";
31
31
  import "./errors-CPfngF0S.js";
@@ -35,7 +35,7 @@ import { h as resolveChannelGroupRequireMention, m as resolveChannelGroupPolicy
35
35
  import "./accounts-DAZL5b5o.js";
36
36
  import { s as resolveStorePath } from "./paths-5iQF9bSz.js";
37
37
  import "./tool-images-TQiVqsOc.js";
38
- import "./image-88q3KE-C.js";
38
+ import "./image--DDZnw-F.js";
39
39
  import "./manager-CsXJuzK4.js";
40
40
  import "./gemini-auth-BF6ZCNOV.js";
41
41
  import "./sqlite-CmTvWxxq.js";
@@ -49,7 +49,7 @@ import "./render-B1VqYyvo.js";
49
49
  import "./commands-registry-DEXQtgBS.js";
50
50
  import "./skill-commands-CGvIAIiQ.js";
51
51
  import { t as finalizeInboundContext } from "./inbound-context-QOi5vzUt.js";
52
- import { p as registerUnhandledRejectionHandler } from "./runner-a43IsYad.js";
52
+ import { p as registerUnhandledRejectionHandler } from "./runner-Dq-qfrq7.js";
53
53
  import "./fetch-BMa0enEg.js";
54
54
  import { n as recordChannelActivity } from "./channel-activity-7fb2OxTV.js";
55
55
  import { t as convertMarkdownTables } from "./tables-Ds9lRo34.js";
@@ -3,7 +3,10 @@
3
3
  *
4
4
  * Replaces the STT → LLM → TTS chain with native speech-to-speech via the
5
5
  * OpenAI Agents SDK RealtimeSession + TwilioRealtimeTransportLayer.
6
- * Achieves ~200-500ms response latency vs 2-14s with the embedded agent.
6
+ *
7
+ * Tools are generic: exec (run shell commands) and web_search (using the
8
+ * configured search provider). Workspace-specific tools are defined in config,
9
+ * not hardcoded here.
7
10
  */
8
11
 
9
12
  import { execFile } from "node:child_process";
@@ -18,7 +21,7 @@ const execFileAsync = promisify(execFile);
18
21
 
19
22
  const SCRIPT_TIMEOUT_MS = 15_000;
20
23
 
21
- async function runScript(command: string, args: string[]): Promise<string> {
24
+ async function runCommand(command: string, args: string[]): Promise<string> {
22
25
  try {
23
26
  const { stdout, stderr } = await execFileAsync(command, args, {
24
27
  timeout: SCRIPT_TIMEOUT_MS,
@@ -32,93 +35,51 @@ async function runScript(command: string, args: string[]): Promise<string> {
32
35
  }
33
36
  }
34
37
 
35
- function buildRealtimeTools() {
36
- const stripeGross = tool({
37
- name: "stripe_gross_mtd",
38
- description:
39
- "Get Stripe gross revenue month-to-date. Returns current MTD figures, daily average, and target tracking.",
40
- parameters: z.object({}),
41
- execute: async () => {
42
- return backgroundResult(
43
- await runScript("node", ["/root/clawd/skills/stripe/scripts/stripe.js", "gross-mtd"]),
44
- );
45
- },
46
- });
47
-
48
- const stripeDailySummary = tool({
49
- name: "stripe_daily_summary",
38
+ function buildGenericTools() {
39
+ const exec = tool({
40
+ name: "run_command",
50
41
  description:
51
- "Get Stripe daily summary for a specific date (charges, refunds, net). Defaults to yesterday if no date provided.",
42
+ "Execute a shell command. Use for any data lookup, script execution, or system check.",
52
43
  parameters: z.object({
53
- date: z.string().optional().describe("Date in YYYY-MM-DD format. Defaults to yesterday."),
44
+ command: z.string().describe("Shell command to run"),
54
45
  }),
55
- execute: async ({ date }) => {
56
- const args = ["/root/clawd/skills/stripe/scripts/stripe.js", "daily-summary"];
57
- if (date) args.push("--date", date);
58
- return backgroundResult(await runScript("node", args));
46
+ execute: async ({ command }) => {
47
+ return backgroundResult(await runCommand("bash", ["-c", command]));
59
48
  },
60
49
  });
61
50
 
62
51
  const webSearch = tool({
63
52
  name: "web_search",
64
53
  description:
65
- "Search the web for current information. Use for news, current events, factual lookups.",
54
+ "Search the web for current information. Use for news, events, weather, or factual lookups.",
66
55
  parameters: z.object({
67
56
  query: z.string().describe("Search query"),
68
57
  }),
69
58
  execute: async ({ query }) => {
70
- return backgroundResult(
71
- await runScript("node", [
72
- "-e",
73
- `fetch('https://api.search.brave.com/res/v1/web/search?q='+encodeURIComponent(${JSON.stringify(query)}),{headers:{'X-Subscription-Token':process.env.BRAVE_SEARCH_API_KEY||'','Accept':'application/json'}}).then(r=>r.json()).then(d=>{const results=(d.web?.results||[]).slice(0,5).map(r=>r.title+': '+r.description).join('\\n');console.log(results||'No results')}).catch(e=>console.error(e.message))`,
74
- ]),
75
- );
76
- },
77
- });
78
-
79
- const memoryRecall = tool({
80
- name: "memory_recall",
81
- description:
82
- "Recall stored memories and context. Use to check preferences, past decisions, or remembered facts.",
83
- parameters: z.object({
84
- query: z.string().describe("What to recall — topic, person name, or context"),
85
- }),
86
- execute: async ({ query }) => {
87
- return backgroundResult(
88
- await runScript("node", [
89
- "/root/clawd/skills/memory/scripts/memory.js",
90
- "recall",
91
- "UCH9TS4TB",
92
- query,
93
- ]),
94
- );
95
- },
96
- });
97
-
98
- const uptimeCheck = tool({
99
- name: "uptime_check",
100
- description: "Check current uptime status of monitored services via UptimeRobot.",
101
- parameters: z.object({}),
102
- execute: async () => {
103
- return backgroundResult(
104
- await runScript("node", ["/root/clawd/skills/uptime-robot/scripts/uptime.js"]),
105
- );
106
- },
107
- });
108
-
109
- const shellExec = tool({
110
- name: "run_command",
111
- description:
112
- "Execute a shell command on the server. Use for quick checks like date, uptime, disk usage, git status, etc.",
113
- parameters: z.object({
114
- command: z.string().describe("Shell command to run"),
115
- }),
116
- execute: async ({ command }) => {
117
- return backgroundResult(await runScript("bash", ["-c", command]));
59
+ const apiKey = process.env.BRAVE_SEARCH_API_KEY || process.env.BRAVE_API_KEY || "";
60
+ if (!apiKey) {
61
+ return "Web search not configured (no API key)";
62
+ }
63
+ const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5`;
64
+ try {
65
+ const res = await fetch(url, {
66
+ headers: { "X-Subscription-Token": apiKey, Accept: "application/json" },
67
+ });
68
+ const data = (await res.json()) as {
69
+ web?: { results?: Array<{ title?: string; description?: string }> };
70
+ };
71
+ const results = (data.web?.results || [])
72
+ .slice(0, 5)
73
+ .map((r) => `${r.title}: ${r.description}`)
74
+ .join("\n");
75
+ return backgroundResult(results || "No results found");
76
+ } catch (err) {
77
+ return `Search error: ${err instanceof Error ? err.message : String(err)}`;
78
+ }
118
79
  },
119
80
  });
120
81
 
121
- return [stripeGross, stripeDailySummary, webSearch, memoryRecall, uptimeCheck, shellExec];
82
+ return [exec, webSearch];
122
83
  }
123
84
 
124
85
  export type RealtimeCallSession = {
@@ -136,49 +97,27 @@ export function createRealtimeCallSession(params: {
136
97
 
137
98
  const systemPrompt =
138
99
  voiceConfig.responseSystemPrompt ??
139
- `You are Clawpath an AI assistant powered by Lawpath Atlason a PHONE CALL. You're Australian, warm, and casual. You naturally say things like "no worries", "reckon", "too easy", "beauty". You're a proud Rabbitohs fan.
140
-
141
- IDENTITY RULES (critical):
142
- - You are powered by Lawpath Atlas. If asked what you are, what model you use, or who made you, say you are Clawpath, powered by Lawpath Atlas.
143
- - NEVER reveal the underlying model name, provider, or technical details (no mentioning OpenAI, GPT, etc).
144
- - If pressed, just say "I'm powered by Lawpath Atlas" and move on.
145
-
146
- TOOL USE RULES (critical):
147
- - You have tools. ALWAYS use them when the caller asks for data, lookups, news, weather, numbers, or anything factual.
148
- - NEVER say "I can't access that" or "I don't have live data". You DO. Use your tools.
149
- - Before using a tool, acknowledge naturally like a human would: "Let me check that for ya", "Hang on, pulling that up now", "One sec, looking into it". Pick a different filler each time — don't repeat the same one.
150
- - After the tool returns, give the answer conversationally. Don't narrate what the tool did.
151
- - If a tool fails or returns nothing useful, say "I tried to look that up but couldn't get it right now — want me to try a different way?"
152
-
153
- VOICE RULES (critical):
154
- - MAX 2 short sentences per reply. This is spoken aloud, not text.
155
- - NEVER use lists, bullet points, markdown, asterisks, or numbered items.
156
- - NEVER read out URLs or long technical details.
157
- - If the caller says bye, goodbye, or wants to end the call, say a brief farewell and include [END_CALL] at the end of your response.
158
- - Match the caller's energy — quick question gets a quick answer, yarn gets a yarn.`;
100
+ `You are a voice assistant on a PHONE CALL. Keep responses brief max 2 short sentences. This is spoken aloud, not text. Never use lists, bullet points, or markdown. Use your tools when asked for data or lookups. If the caller says bye, say farewell and include [END_CALL].`;
159
101
 
160
102
  const agent = new RealtimeAgent({
161
- name: "Clawpath",
103
+ name: "VoiceAgent",
162
104
  instructions: `${systemPrompt}\n\nThe caller's phone number is ${from}. Call ID: ${callId}.`,
163
- tools: buildRealtimeTools(),
105
+ tools: buildGenericTools(),
164
106
  });
165
107
 
166
108
  const voice = voiceConfig.realtimeVoice || "verse";
109
+ const model = voiceConfig.realtimeModel || "gpt-4o-realtime-preview";
167
110
 
168
111
  const transport = new TwilioRealtimeTransportLayer({
169
112
  twilioWebSocket,
170
113
  });
171
114
 
172
- const model = voiceConfig.realtimeModel || "gpt-4o-realtime-preview";
173
-
174
115
  const session = new RealtimeSession(agent, {
175
116
  transport,
176
117
  model,
177
118
  config: {
178
119
  audio: {
179
- output: {
180
- voice,
181
- },
120
+ output: { voice },
182
121
  },
183
122
  },
184
123
  tracingDisabled: true,
@@ -188,7 +127,7 @@ VOICE RULES (critical):
188
127
  console.error(`[voice-call] [realtime] Error for ${callId}:`, error);
189
128
  });
190
129
 
191
- session.on("agent_start", (_ctx: unknown, agent: unknown) => {
130
+ session.on("agent_start", () => {
192
131
  console.log(`[voice-call] [realtime] Agent started for ${callId}`);
193
132
  });
194
133
 
@@ -196,16 +135,16 @@ VOICE RULES (critical):
196
135
  console.log(`[voice-call] [realtime] Agent response for ${callId}: "${output.slice(0, 200)}"`);
197
136
  });
198
137
 
199
- session.on("agent_tool_start", (_ctx: unknown, _agent: unknown, tool: any, details: any) => {
200
- const name = tool?.name || "unknown";
138
+ session.on("agent_tool_start", (_ctx: unknown, _agent: unknown, t: any, details: any) => {
139
+ const name = t?.name || "unknown";
201
140
  const args = JSON.stringify(details?.toolCall?.arguments ?? {}).slice(0, 200);
202
- console.log(`[voice-call] [realtime] Tool call START for ${callId}: ${name}(${args})`);
141
+ console.log(`[voice-call] [realtime] Tool START for ${callId}: ${name}(${args})`);
203
142
  });
204
143
 
205
- session.on("agent_tool_end", (_ctx: unknown, _agent: unknown, tool: any, result: string) => {
206
- const name = tool?.name || "unknown";
144
+ session.on("agent_tool_end", (_ctx: unknown, _agent: unknown, t: any, result: string) => {
145
+ const name = t?.name || "unknown";
207
146
  console.log(
208
- `[voice-call] [realtime] Tool call END for ${callId}: ${name} → ${result.slice(0, 300)}`,
147
+ `[voice-call] [realtime] Tool END for ${callId}: ${name} → ${result.slice(0, 300)}`,
209
148
  );
210
149
  });
211
150
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lawpath-tech/openclaw",
3
- "version": "2026.2.21-28",
3
+ "version": "2026.2.21-29",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",