@poolzin/pool-bot 2026.2.11 → 2026.2.18

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 (535) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/agents/agent-scope.js +4 -0
  3. package/dist/agents/announce-idempotency.js +14 -0
  4. package/dist/agents/auth-profiles/usage.js +22 -0
  5. package/dist/agents/auth-profiles.js +1 -1
  6. package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +23 -0
  7. package/dist/agents/bash-tools.exec-runtime.js +438 -0
  8. package/dist/agents/bash-tools.shared.js +6 -0
  9. package/dist/agents/cli-runner/reliability.js +61 -0
  10. package/dist/agents/cli-watchdog-defaults.js +11 -0
  11. package/dist/agents/command-poll-backoff.js +63 -0
  12. package/dist/agents/current-time.js +16 -0
  13. package/dist/agents/glob-pattern.js +42 -0
  14. package/dist/agents/memory-search.js +33 -0
  15. package/dist/agents/model-alias-lines.js +18 -0
  16. package/dist/agents/model-auth-label.js +61 -0
  17. package/dist/agents/model-fallback.js +59 -8
  18. package/dist/agents/models-config.e2e-harness.js +115 -0
  19. package/dist/agents/ollama-stream.js +11 -3
  20. package/dist/agents/openclaw-tools.js +135 -0
  21. package/dist/agents/pi-auth-json.js +118 -0
  22. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +147 -0
  23. package/dist/agents/pi-embedded-subscribe.e2e-harness.js +90 -0
  24. package/dist/agents/pi-embedded-subscribe.handlers.compaction.js +63 -0
  25. package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +30 -0
  26. package/dist/agents/pi-extensions/session-manager-runtime-registry.js +23 -0
  27. package/dist/agents/pi-tools.before-tool-call.js +145 -4
  28. package/dist/agents/pi-tools.js +29 -9
  29. package/dist/agents/pi-tools.policy.js +85 -92
  30. package/dist/agents/pi-tools.schema.js +54 -27
  31. package/dist/agents/queued-file-writer.js +22 -0
  32. package/dist/agents/sandbox/docker.js +133 -40
  33. package/dist/agents/sandbox/fs-bridge.js +146 -0
  34. package/dist/agents/sandbox/fs-paths.js +205 -0
  35. package/dist/agents/sandbox/hash.js +4 -0
  36. package/dist/agents/sandbox/validate-sandbox-security.js +157 -0
  37. package/dist/agents/sandbox-paths.js +3 -0
  38. package/dist/agents/sandbox-tool-policy.js +26 -0
  39. package/dist/agents/sanitize-for-prompt.js +18 -0
  40. package/dist/agents/session-dirs.js +20 -0
  41. package/dist/agents/session-write-lock.js +203 -39
  42. package/dist/agents/skills/filter.js +24 -0
  43. package/dist/agents/skills/tools-dir.js +9 -0
  44. package/dist/agents/skills-install-download.js +290 -0
  45. package/dist/agents/skills-install-output.js +30 -0
  46. package/dist/agents/skills-install.download-test-utils.js +36 -0
  47. package/dist/agents/skills.e2e-test-helpers.js +13 -0
  48. package/dist/agents/subagent-announce-queue.js +59 -15
  49. package/dist/agents/subagent-depth.js +137 -0
  50. package/dist/agents/subagent-registry.js +448 -96
  51. package/dist/agents/subagent-spawn.js +262 -0
  52. package/dist/agents/system-prompt.js +52 -10
  53. package/dist/agents/test-helpers/fast-tool-stubs.js +18 -0
  54. package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +74 -0
  55. package/dist/agents/tool-display-common.js +782 -0
  56. package/dist/agents/tool-loop-detection.js +466 -0
  57. package/dist/agents/tool-policy.js +6 -0
  58. package/dist/agents/tools/image-tool.js +1 -1
  59. package/dist/agents/tools/sessions-access.js +178 -0
  60. package/dist/agents/tools/sessions-resolution.js +206 -0
  61. package/dist/agents/tools/subagents-tool.js +616 -0
  62. package/dist/agents/workspace-dir.js +18 -0
  63. package/dist/agents/workspace-dirs.js +14 -0
  64. package/dist/agents/workspace.js +70 -0
  65. package/dist/auto-reply/heartbeat-reply-payload.js +18 -0
  66. package/dist/auto-reply/reply/commands-export-session.js +163 -0
  67. package/dist/auto-reply/reply/commands-mesh.js +245 -0
  68. package/dist/auto-reply/reply/commands-setunset.js +28 -0
  69. package/dist/auto-reply/reply/commands-slash-parse.js +31 -0
  70. package/dist/auto-reply/reply/commands-system-prompt.js +117 -0
  71. package/dist/auto-reply/reply/directive-handling.levels.js +17 -0
  72. package/dist/auto-reply/reply/directive-handling.params.js +1 -0
  73. package/dist/auto-reply/reply/directive-parsing.js +36 -0
  74. package/dist/auto-reply/reply/dispatcher-registry.js +43 -0
  75. package/dist/auto-reply/reply/elevated-unavailable.js +20 -0
  76. package/dist/auto-reply/reply/post-compaction-audit.js +96 -0
  77. package/dist/auto-reply/reply/post-compaction-context.js +98 -0
  78. package/dist/auto-reply/reply/reply-delivery.js +92 -0
  79. package/dist/auto-reply/reply/session-reset-prompt.js +1 -0
  80. package/dist/auto-reply/reply/session-run-accounting.js +33 -0
  81. package/dist/auto-reply/reply.directive.directive-behavior.e2e-harness.js +115 -0
  82. package/dist/auto-reply/reply.directive.directive-behavior.e2e-mocks.js +12 -0
  83. package/dist/browser/bridge-auth-registry.js +26 -0
  84. package/dist/browser/client-actions-url.js +10 -0
  85. package/dist/browser/control-auth.js +73 -0
  86. package/dist/browser/csrf.js +64 -0
  87. package/dist/browser/http-auth.js +52 -0
  88. package/dist/browser/paths.js +37 -0
  89. package/dist/browser/proxy-files.js +32 -0
  90. package/dist/browser/pw-ai-state.js +7 -0
  91. package/dist/browser/resolved-config-refresh.js +42 -0
  92. package/dist/browser/routes/path-output.js +1 -0
  93. package/dist/browser/server-context.chrome-test-harness.js +20 -0
  94. package/dist/browser/server-middleware.js +31 -0
  95. package/dist/browser/test-port.js +16 -0
  96. package/dist/build-info.json +3 -3
  97. package/dist/canvas-host/file-resolver.js +43 -0
  98. package/dist/channels/account-summary.js +19 -0
  99. package/dist/channels/draft-stream-loop.js +77 -0
  100. package/dist/channels/plugins/account-helpers.js +26 -0
  101. package/dist/channels/telegram/allow-from.js +10 -0
  102. package/dist/cli/browser-cli-resize.js +22 -0
  103. package/dist/cli/browser-cli-shared.js +8 -0
  104. package/dist/cli/clawbot-cli.js +5 -0
  105. package/dist/cli/completion-cli.js +566 -0
  106. package/dist/cli/config-cli.js +63 -5
  107. package/dist/cli/daemon-cli/lifecycle-core.js +256 -0
  108. package/dist/cli/daemon-cli/register-service-commands.js +60 -0
  109. package/dist/cli/daemon-cli-compat.js +80 -0
  110. package/dist/cli/nodes-cli/pairing-render.js +26 -0
  111. package/dist/cli/program/action-reparse.js +17 -0
  112. package/dist/cli/program/command-registry.js +17 -0
  113. package/dist/cli/program/program-context.js +8 -0
  114. package/dist/cli/program/register.subclis.js +7 -0
  115. package/dist/cli/program/routes.js +233 -0
  116. package/dist/cli/qr-cli.js +132 -0
  117. package/dist/cli/requirements-test-fixtures.js +17 -0
  118. package/dist/cli/respawn-policy.js +4 -0
  119. package/dist/cli/shared/parse-port.js +18 -0
  120. package/dist/cli/skills-cli.format.js +241 -0
  121. package/dist/cli/update-cli/progress.js +121 -0
  122. package/dist/cli/update-cli/restart-helper.js +108 -0
  123. package/dist/cli/update-cli/shared.js +196 -0
  124. package/dist/cli/update-cli/status.js +97 -0
  125. package/dist/cli/update-cli/suppress-deprecations.js +17 -0
  126. package/dist/cli/update-cli/update-command.js +506 -0
  127. package/dist/cli/update-cli/wizard.js +130 -0
  128. package/dist/cli/update-cli.js +3 -9
  129. package/dist/cli/windows-argv.js +69 -0
  130. package/dist/commands/auth-choice-legacy.js +20 -0
  131. package/dist/commands/auth-choice.apply-helpers.js +8 -0
  132. package/dist/commands/channel-test-helpers.js +19 -0
  133. package/dist/commands/cleanup-plan.js +10 -0
  134. package/dist/commands/cleanup-utils.js +7 -0
  135. package/dist/commands/config-validation.js +15 -0
  136. package/dist/commands/doctor-completion.js +112 -0
  137. package/dist/commands/doctor-memory-search.js +119 -0
  138. package/dist/commands/doctor-session-locks.js +73 -0
  139. package/dist/commands/doctor.e2e-harness.js +364 -0
  140. package/dist/commands/gateway-presence.js +19 -0
  141. package/dist/commands/model-default.js +35 -0
  142. package/dist/commands/models/fallbacks-shared.js +102 -0
  143. package/dist/commands/models/shared.js +24 -0
  144. package/dist/commands/onboard-auth.config-gateways.js +64 -0
  145. package/dist/commands/onboard-auth.config-litellm.js +45 -0
  146. package/dist/commands/onboard-auth.config-shared.js +116 -0
  147. package/dist/commands/onboard-config.js +16 -0
  148. package/dist/commands/onboard-non-interactive.test-helpers.js +31 -0
  149. package/dist/commands/onboard-provider-auth-flags.js +136 -0
  150. package/dist/commands/openai-codex-oauth.js +40 -0
  151. package/dist/commands/test-runtime-config-helpers.js +21 -0
  152. package/dist/commands/test-wizard-helpers.js +68 -0
  153. package/dist/commands/vllm-setup.js +66 -0
  154. package/dist/compat/legacy-names.js +2 -0
  155. package/dist/config/backup-rotation.js +19 -0
  156. package/dist/config/env-preserve.js +122 -0
  157. package/dist/config/includes-scan.js +78 -0
  158. package/dist/config/plugins-allowlist.js +13 -0
  159. package/dist/config/schema.help.js +256 -0
  160. package/dist/config/schema.hints.js +189 -0
  161. package/dist/config/schema.irc.js +20 -0
  162. package/dist/config/schema.labels.js +317 -0
  163. package/dist/config/sessions/delivery-info.js +40 -0
  164. package/dist/config/types.irc.js +1 -0
  165. package/dist/config/zod-schema.agent-defaults.js +14 -0
  166. package/dist/config/zod-schema.agent-model.js +10 -0
  167. package/dist/config/zod-schema.agent-runtime.js +14 -0
  168. package/dist/config/zod-schema.allowdeny.js +35 -0
  169. package/dist/config/zod-schema.sensitive.js +4 -0
  170. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  171. package/dist/cron/isolated-agent/skills-snapshot.js +26 -0
  172. package/dist/cron/isolated-agent/subagent-followup.js +127 -0
  173. package/dist/cron/isolated-agent.mocks.js +12 -0
  174. package/dist/cron/isolated-agent.test-setup.js +22 -0
  175. package/dist/cron/legacy-delivery.js +43 -0
  176. package/dist/cron/webhook-url.js +22 -0
  177. package/dist/daemon/arg-split.js +40 -0
  178. package/dist/daemon/exec-file.js +23 -0
  179. package/dist/daemon/output.js +6 -0
  180. package/dist/daemon/runtime-format.js +31 -0
  181. package/dist/daemon/schtasks-exec.js +4 -0
  182. package/dist/daemon/service-audit.js +22 -0
  183. package/dist/discord/client.js +41 -0
  184. package/dist/discord/components-registry.js +57 -0
  185. package/dist/discord/components.js +816 -0
  186. package/dist/discord/guilds.js +12 -0
  187. package/dist/discord/monitor/gateway-plugin.js +48 -0
  188. package/dist/discord/monitor/presence.js +30 -0
  189. package/dist/discord/send.components.js +115 -0
  190. package/dist/discord/send.shared.js +4 -0
  191. package/dist/discord/ui.js +26 -0
  192. package/dist/discord/voice-message.js +254 -0
  193. package/dist/gateway/agent-event-assistant-text.js +5 -0
  194. package/dist/gateway/agent-prompt.js +33 -0
  195. package/dist/gateway/auth-rate-limit.js +136 -0
  196. package/dist/gateway/channel-health-monitor.js +114 -0
  197. package/dist/gateway/control-ui-contract.js +1 -0
  198. package/dist/gateway/control-ui-csp.js +15 -0
  199. package/dist/gateway/gateway-config-prompts.shared.js +25 -0
  200. package/dist/gateway/http-auth-helpers.js +18 -0
  201. package/dist/gateway/http-common.js +18 -0
  202. package/dist/gateway/http-endpoint-helpers.js +27 -0
  203. package/dist/gateway/node-invoke-sanitize.js +11 -0
  204. package/dist/gateway/node-invoke-system-run-approval.js +205 -0
  205. package/dist/gateway/probe-auth.js +21 -0
  206. package/dist/gateway/protocol/index.js +7 -2
  207. package/dist/gateway/protocol/schema/mesh.js +54 -0
  208. package/dist/gateway/protocol/schema/protocol-schemas.js +7 -0
  209. package/dist/gateway/protocol/schema.js +1 -0
  210. package/dist/gateway/server/ws-connection/auth-messages.js +54 -0
  211. package/dist/gateway/server-channels.js +11 -0
  212. package/dist/gateway/server-methods/attachment-normalize.js +16 -0
  213. package/dist/gateway/server-methods/base-hash.js +8 -0
  214. package/dist/gateway/server-methods/mesh.js +700 -0
  215. package/dist/gateway/server-methods/nodes.handlers.invoke-result.js +55 -0
  216. package/dist/gateway/server-methods/restart-request.js +13 -0
  217. package/dist/gateway/server-methods/validation.js +8 -0
  218. package/dist/gateway/server.agent.gateway-server-agent.mocks.js +35 -0
  219. package/dist/gateway/server.e2e-registry-helpers.js +1 -0
  220. package/dist/gateway/server.e2e-ws-harness.js +20 -0
  221. package/dist/gateway/test-helpers.js +2 -0
  222. package/dist/gateway/test-helpers.server.js +3 -1
  223. package/dist/gateway/test-http-response.js +12 -0
  224. package/dist/gateway/test-openai-responses-model.js +20 -0
  225. package/dist/gateway/test-temp-config.js +30 -0
  226. package/dist/gateway/test-with-server.js +32 -0
  227. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +46 -0
  228. package/dist/imessage/monitor/abort-handler.js +23 -0
  229. package/dist/imessage/monitor/inbound-processing.js +346 -0
  230. package/dist/imessage/monitor/parse-notification.js +64 -0
  231. package/dist/imessage/target-parsing-helpers.js +92 -0
  232. package/dist/infra/archive.js +244 -20
  233. package/dist/infra/detect-package-manager.js +26 -0
  234. package/dist/infra/exec-approvals-allowlist.js +257 -0
  235. package/dist/infra/exec-approvals-analysis.js +770 -0
  236. package/dist/infra/exec-approvals.js +13 -0
  237. package/dist/infra/file-lock.js +1 -0
  238. package/dist/infra/gemini-auth.js +39 -0
  239. package/dist/infra/heartbeat-active-hours.js +85 -0
  240. package/dist/infra/heartbeat-events-filter.js +50 -0
  241. package/dist/infra/heartbeat-runner.test-utils.js +39 -0
  242. package/dist/infra/http-body.js +265 -0
  243. package/dist/infra/install-package-dir.js +50 -0
  244. package/dist/infra/install-safe-path.js +49 -0
  245. package/dist/infra/json-files.js +49 -0
  246. package/dist/infra/jsonl-socket.js +52 -0
  247. package/dist/infra/map-size.js +14 -0
  248. package/dist/infra/net/hostname.js +7 -0
  249. package/dist/infra/npm-registry-spec.js +39 -0
  250. package/dist/infra/openclaw-root.js +109 -0
  251. package/dist/infra/outbound/delivery-queue.js +214 -0
  252. package/dist/infra/outbound/identity.js +23 -0
  253. package/dist/infra/outbound/message-action-params.js +307 -0
  254. package/dist/infra/outbound/tool-payload.js +21 -0
  255. package/dist/infra/package-json.js +23 -0
  256. package/dist/infra/pairing-files.js +19 -0
  257. package/dist/infra/pairing-token.js +9 -0
  258. package/dist/infra/path-prepend.js +51 -0
  259. package/dist/infra/path-safety.js +16 -0
  260. package/dist/infra/process-respawn.js +49 -0
  261. package/dist/infra/runtime-status.js +16 -0
  262. package/dist/infra/session-cost-usage.types.js +1 -0
  263. package/dist/infra/session-maintenance-warning.js +89 -0
  264. package/dist/infra/system-run-command.js +78 -0
  265. package/dist/infra/tmp-openclaw-dir.js +81 -0
  266. package/dist/infra/tmp-poolbot-dir.js +2 -0
  267. package/dist/infra/update-channels.js +19 -0
  268. package/dist/line/actions.js +45 -0
  269. package/dist/line/channel-access-token.js +9 -0
  270. package/dist/line/flex-templates/basic-cards.js +332 -0
  271. package/dist/line/flex-templates/common.js +18 -0
  272. package/dist/line/flex-templates/media-control-cards.js +453 -0
  273. package/dist/line/flex-templates/message.js +10 -0
  274. package/dist/line/flex-templates/schedule-cards.js +399 -0
  275. package/dist/line/flex-templates/types.js +1 -0
  276. package/dist/line/webhook-node.js +100 -0
  277. package/dist/line/webhook-utils.js +11 -0
  278. package/dist/logging/diagnostic-session-state.js +73 -0
  279. package/dist/logging/diagnostic.js +22 -0
  280. package/dist/logging/timestamps.js +14 -0
  281. package/dist/markdown/whatsapp.js +62 -0
  282. package/dist/media/base64.js +34 -0
  283. package/dist/media/local-roots.js +32 -0
  284. package/dist/media/outbound-attachment.js +10 -0
  285. package/dist/media/read-response-with-limit.js +41 -0
  286. package/dist/media/sniff-mime-from-base64.js +19 -0
  287. package/dist/media-understanding/audio-preflight.js +67 -0
  288. package/dist/media-understanding/fs.js +13 -0
  289. package/dist/media-understanding/output-extract.js +26 -0
  290. package/dist/media-understanding/providers/audio.test-helpers.js +34 -0
  291. package/dist/media-understanding/providers/google/inline-data.js +64 -0
  292. package/dist/media-understanding/providers/shared.js +7 -0
  293. package/dist/media-understanding/runner.entries.js +459 -0
  294. package/dist/memory/batch-error-utils.js +11 -0
  295. package/dist/memory/batch-http.js +27 -0
  296. package/dist/memory/batch-output.js +29 -0
  297. package/dist/memory/batch-runner.js +22 -0
  298. package/dist/memory/batch-upload.js +23 -0
  299. package/dist/memory/batch-utils.js +26 -0
  300. package/dist/memory/embeddings-debug.js +11 -0
  301. package/dist/memory/embeddings-remote-client.js +22 -0
  302. package/dist/memory/embeddings-remote-fetch.js +14 -0
  303. package/dist/memory/embeddings.js +36 -9
  304. package/dist/memory/hybrid.js +24 -5
  305. package/dist/memory/manager-embedding-ops.js +616 -0
  306. package/dist/memory/manager-sync-ops.js +953 -0
  307. package/dist/memory/manager.js +76 -28
  308. package/dist/memory/mmr.js +164 -0
  309. package/dist/memory/qmd-manager.js +1061 -0
  310. package/dist/memory/qmd-query-parser.js +107 -0
  311. package/dist/memory/qmd-scope.js +93 -0
  312. package/dist/memory/query-expansion.js +331 -0
  313. package/dist/memory/search-manager.js +0 -1
  314. package/dist/memory/sync-index.js +21 -0
  315. package/dist/memory/sync-progress.js +22 -0
  316. package/dist/memory/sync-stale.js +30 -0
  317. package/dist/memory/temporal-decay.js +119 -0
  318. package/dist/memory/test-embeddings-mock.js +16 -0
  319. package/dist/memory/test-manager-helpers.js +14 -0
  320. package/dist/memory/test-runtime-mocks.js +11 -0
  321. package/dist/node-host/invoke-browser.js +177 -0
  322. package/dist/node-host/invoke.js +685 -0
  323. package/dist/pairing/setup-code.js +285 -0
  324. package/dist/plugin-sdk/account-id.js +1 -0
  325. package/dist/plugin-sdk/agent-media-payload.js +13 -0
  326. package/dist/plugin-sdk/allow-from.js +47 -0
  327. package/dist/plugin-sdk/command-auth.js +23 -0
  328. package/dist/plugin-sdk/config-paths.js +9 -0
  329. package/dist/plugin-sdk/file-lock.js +116 -0
  330. package/dist/plugin-sdk/json-store.js +31 -0
  331. package/dist/plugin-sdk/onboarding.js +28 -0
  332. package/dist/plugin-sdk/provider-auth-result.js +29 -0
  333. package/dist/plugin-sdk/slack-message-actions.js +133 -0
  334. package/dist/plugin-sdk/status-helpers.js +35 -0
  335. package/dist/plugin-sdk/text-chunking.js +31 -0
  336. package/dist/plugin-sdk/tool-send.js +12 -0
  337. package/dist/plugin-sdk/webhook-path.js +27 -0
  338. package/dist/plugin-sdk/webhook-targets.js +34 -0
  339. package/dist/plugins/hooks.test-helpers.js +21 -0
  340. package/dist/plugins/uninstall.js +171 -0
  341. package/dist/process/kill-tree.js +98 -0
  342. package/dist/process/supervisor/adapters/child.js +143 -0
  343. package/dist/process/supervisor/adapters/env.js +13 -0
  344. package/dist/process/supervisor/adapters/pty.js +148 -0
  345. package/dist/process/supervisor/index.js +10 -0
  346. package/dist/process/supervisor/registry.js +117 -0
  347. package/dist/process/supervisor/supervisor.js +244 -0
  348. package/dist/process/supervisor/types.js +1 -0
  349. package/dist/providers/google-shared.test-helpers.js +75 -0
  350. package/dist/security/audit-channel.js +419 -0
  351. package/dist/security/audit-tool-policy.js +1 -0
  352. package/dist/security/scan-paths.js +12 -0
  353. package/dist/sessions/input-provenance.js +55 -0
  354. package/dist/sessions/session-key-utils.js +7 -0
  355. package/dist/shared/chat-content.js +31 -0
  356. package/dist/shared/chat-envelope.js +45 -0
  357. package/dist/shared/config-eval.js +117 -0
  358. package/dist/shared/device-auth.js +16 -0
  359. package/dist/shared/entry-metadata.js +9 -0
  360. package/dist/shared/entry-status.js +25 -0
  361. package/dist/shared/frontmatter.js +98 -0
  362. package/dist/shared/model-param-b.js +19 -0
  363. package/dist/shared/net/ipv4.js +17 -0
  364. package/dist/shared/node-match.js +53 -0
  365. package/dist/shared/pid-alive.js +12 -0
  366. package/dist/shared/process-scoped-map.js +10 -0
  367. package/dist/shared/requirements.js +128 -0
  368. package/dist/shared/subagents-format.js +84 -0
  369. package/dist/shared/usage-aggregates.js +28 -0
  370. package/dist/signal/monitor/mentions.js +45 -0
  371. package/dist/signal/rpc-context.js +19 -0
  372. package/dist/slack/blocks-fallback.js +76 -0
  373. package/dist/slack/blocks-input.js +40 -0
  374. package/dist/slack/draft-stream.js +106 -0
  375. package/dist/slack/message-actions.js +51 -0
  376. package/dist/slack/modal-metadata.js +32 -0
  377. package/dist/slack/monitor/events/interactions.js +462 -0
  378. package/dist/slack/monitor/room-context.js +17 -0
  379. package/dist/slack/stream-mode.js +41 -0
  380. package/dist/telegram/bot-native-command-menu.js +64 -0
  381. package/dist/telegram/bot.media.e2e-harness.js +81 -0
  382. package/dist/telegram/button-types.js +1 -0
  383. package/dist/telegram/group-access.js +65 -0
  384. package/dist/telegram/outbound-params.js +21 -0
  385. package/dist/telegram/poll-vote-cache.js +21 -0
  386. package/dist/terminal/health-style.js +36 -0
  387. package/dist/test-utils/chunk-test-helpers.js +21 -0
  388. package/dist/test-utils/env.js +72 -0
  389. package/dist/test-utils/exec-assertions.js +12 -0
  390. package/dist/test-utils/imessage-test-plugin.js +54 -0
  391. package/dist/test-utils/mock-http-response.js +17 -0
  392. package/dist/test-utils/vitest-mock-fn.js +1 -0
  393. package/dist/tts/tts-core.js +550 -0
  394. package/dist/utils/chunk-items.js +10 -0
  395. package/dist/utils/reaction-level.js +52 -0
  396. package/dist/utils/safe-json.js +22 -0
  397. package/dist/utils/with-timeout.js +14 -0
  398. package/dist/web/media.js +17 -5
  399. package/dist/whatsapp/resolve-outbound-target.js +42 -0
  400. package/dist/wizard/onboarding.completion.js +74 -0
  401. package/extensions/bluebubbles/package.json +1 -1
  402. package/extensions/bluebubbles/src/account-resolve.ts +29 -0
  403. package/extensions/bluebubbles/src/monitor-normalize.ts +796 -0
  404. package/extensions/bluebubbles/src/monitor-processing.ts +1007 -0
  405. package/extensions/bluebubbles/src/monitor-reply-cache.ts +185 -0
  406. package/extensions/bluebubbles/src/monitor-shared.ts +51 -0
  407. package/extensions/bluebubbles/src/multipart.ts +32 -0
  408. package/extensions/bluebubbles/src/send-helpers.ts +53 -0
  409. package/extensions/bluebubbles/src/test-harness.ts +50 -0
  410. package/extensions/bluebubbles/src/test-mocks.ts +11 -0
  411. package/extensions/copilot-proxy/package.json +1 -1
  412. package/extensions/device-pair/index.ts +554 -0
  413. package/extensions/diagnostics-otel/package.json +1 -1
  414. package/extensions/discord/package.json +1 -1
  415. package/extensions/discord/src/channel.js +366 -0
  416. package/extensions/discord/src/runtime.js +10 -0
  417. package/extensions/feishu/index.ts +63 -0
  418. package/extensions/feishu/src/accounts.ts +114 -0
  419. package/extensions/feishu/src/bitable.ts +739 -0
  420. package/extensions/feishu/src/bot.ts +965 -0
  421. package/extensions/feishu/src/channel.ts +351 -0
  422. package/extensions/feishu/src/client.ts +118 -0
  423. package/extensions/feishu/src/config-schema.ts +206 -0
  424. package/extensions/feishu/src/dedup.ts +33 -0
  425. package/extensions/feishu/src/directory.ts +177 -0
  426. package/extensions/feishu/src/doc-schema.ts +47 -0
  427. package/extensions/feishu/src/docx.ts +536 -0
  428. package/extensions/feishu/src/drive-schema.ts +46 -0
  429. package/extensions/feishu/src/drive.ts +227 -0
  430. package/extensions/feishu/src/dynamic-agent.ts +131 -0
  431. package/extensions/feishu/src/media.ts +449 -0
  432. package/extensions/feishu/src/mention.ts +126 -0
  433. package/extensions/feishu/src/monitor.ts +330 -0
  434. package/extensions/feishu/src/onboarding.ts +359 -0
  435. package/extensions/feishu/src/outbound.ts +55 -0
  436. package/extensions/feishu/src/perm-schema.ts +52 -0
  437. package/extensions/feishu/src/perm.ts +173 -0
  438. package/extensions/feishu/src/policy.ts +84 -0
  439. package/extensions/feishu/src/probe.ts +44 -0
  440. package/extensions/feishu/src/reactions.ts +160 -0
  441. package/extensions/feishu/src/reply-dispatcher.ts +239 -0
  442. package/extensions/feishu/src/runtime.ts +14 -0
  443. package/extensions/feishu/src/send-result.ts +29 -0
  444. package/extensions/feishu/src/send.ts +335 -0
  445. package/extensions/feishu/src/streaming-card.ts +223 -0
  446. package/extensions/feishu/src/targets.ts +78 -0
  447. package/extensions/feishu/src/tools-config.ts +21 -0
  448. package/extensions/feishu/src/types.ts +81 -0
  449. package/extensions/feishu/src/typing.ts +80 -0
  450. package/extensions/feishu/src/wiki-schema.ts +55 -0
  451. package/extensions/feishu/src/wiki.ts +232 -0
  452. package/extensions/google-antigravity-auth/package.json +1 -1
  453. package/extensions/google-gemini-cli-auth/package.json +1 -1
  454. package/extensions/googlechat/package.json +1 -1
  455. package/extensions/imessage/package.json +1 -1
  456. package/extensions/imessage/src/channel.js +253 -0
  457. package/extensions/imessage/src/runtime.js +10 -0
  458. package/extensions/irc/index.ts +17 -0
  459. package/extensions/irc/src/accounts.ts +268 -0
  460. package/extensions/irc/src/channel.ts +367 -0
  461. package/extensions/irc/src/client.ts +439 -0
  462. package/extensions/irc/src/config-schema.ts +97 -0
  463. package/extensions/irc/src/connect-options.ts +30 -0
  464. package/extensions/irc/src/control-chars.ts +22 -0
  465. package/extensions/irc/src/inbound.ts +334 -0
  466. package/extensions/irc/src/monitor.ts +147 -0
  467. package/extensions/irc/src/normalize.ts +117 -0
  468. package/extensions/irc/src/onboarding.ts +479 -0
  469. package/extensions/irc/src/policy.ts +157 -0
  470. package/extensions/irc/src/probe.ts +53 -0
  471. package/extensions/irc/src/protocol.ts +169 -0
  472. package/extensions/irc/src/runtime.ts +14 -0
  473. package/extensions/irc/src/send.ts +88 -0
  474. package/extensions/irc/src/types.ts +93 -0
  475. package/extensions/line/package.json +1 -1
  476. package/extensions/llm-task/package.json +1 -1
  477. package/extensions/lobster/package.json +1 -1
  478. package/extensions/matrix/CHANGELOG.md +5 -0
  479. package/extensions/matrix/package.json +1 -1
  480. package/extensions/matrix/src/matrix/client-bootstrap.ts +39 -0
  481. package/extensions/mattermost/package.json +1 -1
  482. package/extensions/mattermost/src/mattermost/monitor-onchar.ts +25 -0
  483. package/extensions/mattermost/src/mattermost/monitor-websocket.ts +221 -0
  484. package/extensions/mattermost/src/mattermost/reactions.ts +130 -0
  485. package/extensions/mattermost/src/mattermost/reconnect.ts +103 -0
  486. package/extensions/memory-core/package.json +1 -1
  487. package/extensions/memory-lancedb/package.json +1 -1
  488. package/extensions/minimax-portal-auth/index.ts +161 -0
  489. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  490. package/extensions/msteams/CHANGELOG.md +5 -0
  491. package/extensions/msteams/package.json +1 -1
  492. package/extensions/msteams/src/file-lock.ts +1 -0
  493. package/extensions/msteams/src/graph.ts +92 -0
  494. package/extensions/msteams/src/mentions.ts +114 -0
  495. package/extensions/msteams/src/test-runtime.ts +16 -0
  496. package/extensions/nextcloud-talk/package.json +1 -1
  497. package/extensions/nostr/CHANGELOG.md +5 -0
  498. package/extensions/nostr/package.json +1 -1
  499. package/extensions/open-prose/package.json +1 -1
  500. package/extensions/openai-codex-auth/index.ts +177 -0
  501. package/extensions/phone-control/index.ts +421 -0
  502. package/extensions/shared/resolve-target-test-helpers.ts +66 -0
  503. package/extensions/signal/package.json +1 -1
  504. package/extensions/signal/src/channel.js +273 -0
  505. package/extensions/signal/src/runtime.js +10 -0
  506. package/extensions/slack/package.json +1 -1
  507. package/extensions/slack/src/channel.js +489 -0
  508. package/extensions/slack/src/runtime.js +10 -0
  509. package/extensions/talk-voice/index.ts +150 -0
  510. package/extensions/telegram/package.json +1 -1
  511. package/extensions/telegram/src/channel.js +424 -0
  512. package/extensions/telegram/src/runtime.js +10 -0
  513. package/extensions/thread-ownership/index.ts +133 -0
  514. package/extensions/tlon/package.json +1 -1
  515. package/extensions/tlon/src/account-fields.ts +25 -0
  516. package/extensions/tlon/src/urbit/base-url.ts +57 -0
  517. package/extensions/tlon/src/urbit/channel-client.ts +157 -0
  518. package/extensions/tlon/src/urbit/channel-ops.ts +164 -0
  519. package/extensions/tlon/src/urbit/context.ts +47 -0
  520. package/extensions/tlon/src/urbit/errors.ts +51 -0
  521. package/extensions/tlon/src/urbit/fetch.ts +39 -0
  522. package/extensions/twitch/CHANGELOG.md +5 -0
  523. package/extensions/twitch/package.json +1 -1
  524. package/extensions/twitch/src/test-fixtures.ts +30 -0
  525. package/extensions/voice-call/CHANGELOG.md +5 -0
  526. package/extensions/voice-call/package.json +1 -1
  527. package/extensions/voice-call/src/allowlist.ts +19 -0
  528. package/extensions/whatsapp/package.json +1 -1
  529. package/extensions/whatsapp/src/channel.js +429 -0
  530. package/extensions/whatsapp/src/runtime.js +10 -0
  531. package/extensions/zalo/CHANGELOG.md +5 -0
  532. package/extensions/zalo/package.json +1 -1
  533. package/extensions/zalouser/CHANGELOG.md +5 -0
  534. package/extensions/zalouser/package.json +1 -1
  535. package/package.json +1 -1
@@ -0,0 +1,69 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function normalizeWindowsArgv(argv) {
4
+ if (process.platform !== "win32") {
5
+ return argv;
6
+ }
7
+ if (argv.length < 2) {
8
+ return argv;
9
+ }
10
+ const stripControlChars = (value) => {
11
+ let out = "";
12
+ for (let i = 0; i < value.length; i += 1) {
13
+ const code = value.charCodeAt(i);
14
+ if (code >= 32 && code !== 127) {
15
+ out += value[i];
16
+ }
17
+ }
18
+ return out;
19
+ };
20
+ const normalizeArg = (value) => stripControlChars(value)
21
+ .replace(/^['"]+|['"]+$/g, "")
22
+ .trim();
23
+ const normalizeCandidate = (value) => normalizeArg(value).replace(/^\\\\\\?\\/, "");
24
+ const execPath = normalizeCandidate(process.execPath);
25
+ const execPathLower = execPath.toLowerCase();
26
+ const execBase = path.basename(execPath).toLowerCase();
27
+ const isExecPath = (value) => {
28
+ if (!value) {
29
+ return false;
30
+ }
31
+ const normalized = normalizeCandidate(value);
32
+ if (!normalized) {
33
+ return false;
34
+ }
35
+ const lower = normalized.toLowerCase();
36
+ return (lower === execPathLower ||
37
+ path.basename(lower) === execBase ||
38
+ lower.endsWith("\\node.exe") ||
39
+ lower.endsWith("/node.exe") ||
40
+ lower.includes("node.exe") ||
41
+ (path.basename(lower) === "node.exe" && fs.existsSync(normalized)));
42
+ };
43
+ const next = [...argv];
44
+ for (let i = 1; i <= 3 && i < next.length;) {
45
+ if (isExecPath(next[i])) {
46
+ next.splice(i, 1);
47
+ continue;
48
+ }
49
+ i += 1;
50
+ }
51
+ const filtered = next.filter((arg, index) => index === 0 || !isExecPath(arg));
52
+ if (filtered.length < 3) {
53
+ return filtered;
54
+ }
55
+ const cleaned = [...filtered];
56
+ for (let i = 2; i < cleaned.length;) {
57
+ const arg = cleaned[i];
58
+ if (!arg || arg.startsWith("-")) {
59
+ i += 1;
60
+ continue;
61
+ }
62
+ if (isExecPath(arg)) {
63
+ cleaned.splice(i, 1);
64
+ continue;
65
+ }
66
+ break;
67
+ }
68
+ return cleaned;
69
+ }
@@ -0,0 +1,20 @@
1
+ export const AUTH_CHOICE_LEGACY_ALIASES_FOR_CLI = [
2
+ "setup-token",
3
+ "oauth",
4
+ "claude-cli",
5
+ "codex-cli",
6
+ "minimax-cloud",
7
+ "minimax",
8
+ ];
9
+ export function normalizeLegacyOnboardAuthChoice(authChoice) {
10
+ if (authChoice === "oauth" || authChoice === "claude-cli") {
11
+ return "setup-token";
12
+ }
13
+ if (authChoice === "codex-cli") {
14
+ return "openai-codex";
15
+ }
16
+ return authChoice;
17
+ }
18
+ export function isDeprecatedAuthChoice(authChoice) {
19
+ return authChoice === "claude-cli" || authChoice === "codex-cli";
20
+ }
@@ -0,0 +1,8 @@
1
+ export function createAuthChoiceAgentModelNoter(params) {
2
+ return async (model) => {
3
+ if (!params.agentId) {
4
+ return;
5
+ }
6
+ await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
7
+ };
8
+ }
@@ -0,0 +1,19 @@
1
+ import { discordPlugin } from "../../extensions/discord/src/channel.js";
2
+ import { imessagePlugin } from "../../extensions/imessage/src/channel.js";
3
+ import { signalPlugin } from "../../extensions/signal/src/channel.js";
4
+ import { slackPlugin } from "../../extensions/slack/src/channel.js";
5
+ import { telegramPlugin } from "../../extensions/telegram/src/channel.js";
6
+ import { whatsappPlugin } from "../../extensions/whatsapp/src/channel.js";
7
+ import { setActivePluginRegistry } from "../plugins/runtime.js";
8
+ import { createTestRegistry } from "../test-utils/channel-plugins.js";
9
+ export function setDefaultChannelPluginRegistryForTests() {
10
+ const channels = [
11
+ { pluginId: "discord", plugin: discordPlugin, source: "test" },
12
+ { pluginId: "slack", plugin: slackPlugin, source: "test" },
13
+ { pluginId: "telegram", plugin: telegramPlugin, source: "test" },
14
+ { pluginId: "whatsapp", plugin: whatsappPlugin, source: "test" },
15
+ { pluginId: "signal", plugin: signalPlugin, source: "test" },
16
+ { pluginId: "imessage", plugin: imessagePlugin, source: "test" },
17
+ ];
18
+ setActivePluginRegistry(createTestRegistry(channels));
19
+ }
@@ -0,0 +1,10 @@
1
+ import { loadConfig, resolveConfigPath, resolveOAuthDir, resolveStateDir, } from "../config/config.js";
2
+ import { buildCleanupPlan } from "./cleanup-utils.js";
3
+ export function resolveCleanupPlanFromDisk() {
4
+ const cfg = loadConfig();
5
+ const stateDir = resolveStateDir();
6
+ const configPath = resolveConfigPath();
7
+ const oauthDir = resolveOAuthDir();
8
+ const plan = buildCleanupPlan({ cfg, stateDir, configPath, oauthDir });
9
+ return { cfg, stateDir, configPath, oauthDir, ...plan };
10
+ }
@@ -20,6 +20,13 @@ export function collectWorkspaceDirs(cfg) {
20
20
  }
21
21
  return [...dirs];
22
22
  }
23
+ export function buildCleanupPlan(params) {
24
+ return {
25
+ configInsideState: isPathWithin(params.configPath, params.stateDir),
26
+ oauthInsideState: isPathWithin(params.oauthDir, params.stateDir),
27
+ workspaceDirs: collectWorkspaceDirs(params.cfg),
28
+ };
29
+ }
23
30
  export function isPathWithin(child, parent) {
24
31
  const relative = path.relative(parent, child);
25
32
  return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
@@ -0,0 +1,15 @@
1
+ import { formatCliCommand } from "../cli/command-format.js";
2
+ import { readConfigFileSnapshot } from "../config/config.js";
3
+ export async function requireValidConfigSnapshot(runtime) {
4
+ const snapshot = await readConfigFileSnapshot();
5
+ if (snapshot.exists && !snapshot.valid) {
6
+ const issues = snapshot.issues.length > 0
7
+ ? snapshot.issues.map((issue) => `- ${issue.path}: ${issue.message}`).join("\n")
8
+ : "Unknown validation issue.";
9
+ runtime.error(`Config invalid:\n${issues}`);
10
+ runtime.error(`Fix the config or run ${formatCliCommand("openclaw doctor")}.`);
11
+ runtime.exit(1);
12
+ return null;
13
+ }
14
+ return snapshot.config;
15
+ }
@@ -0,0 +1,112 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { resolveCliName } from "../cli/cli-name.js";
4
+ import { completionCacheExists, installCompletion, isCompletionInstalled, resolveCompletionCachePath, resolveShellFromEnv, usesSlowDynamicCompletion, } from "../cli/completion-cli.js";
5
+ import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js";
6
+ import { note } from "../terminal/note.js";
7
+ /** Generate the completion cache by spawning the CLI. */
8
+ async function generateCompletionCache() {
9
+ const root = await resolveOpenClawPackageRoot({
10
+ moduleUrl: import.meta.url,
11
+ argv1: process.argv[1],
12
+ cwd: process.cwd(),
13
+ });
14
+ if (!root) {
15
+ return false;
16
+ }
17
+ const binPath = path.join(root, "openclaw.mjs");
18
+ const result = spawnSync(process.execPath, [binPath, "completion", "--write-state"], {
19
+ cwd: root,
20
+ env: process.env,
21
+ encoding: "utf-8",
22
+ });
23
+ return result.status === 0;
24
+ }
25
+ /** Check the status of shell completion for the current shell. */
26
+ export async function checkShellCompletionStatus(binName = "poolbot") {
27
+ const shell = resolveShellFromEnv();
28
+ const profileInstalled = await isCompletionInstalled(shell, binName);
29
+ const cacheExists = await completionCacheExists(shell, binName);
30
+ const cachePath = resolveCompletionCachePath(shell, binName);
31
+ const usesSlowPattern = await usesSlowDynamicCompletion(shell, binName);
32
+ return {
33
+ shell,
34
+ profileInstalled,
35
+ cacheExists,
36
+ cachePath,
37
+ usesSlowPattern,
38
+ };
39
+ }
40
+ /**
41
+ * Doctor check for shell completion.
42
+ * - If profile uses slow dynamic pattern: upgrade to cached version
43
+ * - If profile has completion but no cache: auto-generate cache and upgrade profile
44
+ * - If no completion at all: prompt to install (with user confirmation)
45
+ */
46
+ export async function doctorShellCompletion(runtime, prompter, options = {}) {
47
+ const cliName = resolveCliName();
48
+ const status = await checkShellCompletionStatus(cliName);
49
+ // Profile uses slow dynamic pattern - upgrade to cached version
50
+ if (status.usesSlowPattern) {
51
+ note(`Your ${status.shell} profile uses slow dynamic completion (source <(...)).\nUpgrading to cached completion for faster shell startup...`, "Shell completion");
52
+ // Ensure cache exists first
53
+ if (!status.cacheExists) {
54
+ const generated = await generateCompletionCache();
55
+ if (!generated) {
56
+ note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`, "Shell completion");
57
+ return;
58
+ }
59
+ }
60
+ // Upgrade profile to use cached file
61
+ await installCompletion(status.shell, true, cliName);
62
+ note(`Shell completion upgraded. Restart your shell or run: source ~/.${status.shell === "zsh" ? "zshrc" : status.shell === "bash" ? "bashrc" : "config/fish/config.fish"}`, "Shell completion");
63
+ return;
64
+ }
65
+ // Profile has completion but no cache - auto-fix
66
+ if (status.profileInstalled && !status.cacheExists) {
67
+ note(`Shell completion is configured in your ${status.shell} profile but the cache is missing.\nRegenerating cache...`, "Shell completion");
68
+ const generated = await generateCompletionCache();
69
+ if (generated) {
70
+ note(`Completion cache regenerated at ${status.cachePath}`, "Shell completion");
71
+ }
72
+ else {
73
+ note(`Failed to regenerate completion cache. Run \`${cliName} completion --write-state\` manually.`, "Shell completion");
74
+ }
75
+ return;
76
+ }
77
+ // No completion at all - prompt to install
78
+ if (!status.profileInstalled) {
79
+ if (options.nonInteractive) {
80
+ // In non-interactive mode, just note that completion is not installed
81
+ return;
82
+ }
83
+ const shouldInstall = await prompter.confirm({
84
+ message: `Enable ${status.shell} shell completion for ${cliName}?`,
85
+ initialValue: true,
86
+ });
87
+ if (shouldInstall) {
88
+ // First generate the cache
89
+ const generated = await generateCompletionCache();
90
+ if (!generated) {
91
+ note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`, "Shell completion");
92
+ return;
93
+ }
94
+ // Then install to profile
95
+ await installCompletion(status.shell, true, cliName);
96
+ note(`Shell completion installed. Restart your shell or run: source ~/.${status.shell === "zsh" ? "zshrc" : status.shell === "bash" ? "bashrc" : "config/fish/config.fish"}`, "Shell completion");
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * Ensure completion cache exists. Used during onboarding/update to fix
102
+ * cases where profile has completion but no cache.
103
+ * This is a silent fix - no prompts.
104
+ */
105
+ export async function ensureCompletionCacheExists(binName = "poolbot") {
106
+ const shell = resolveShellFromEnv();
107
+ const cacheExists = await completionCacheExists(shell, binName);
108
+ if (cacheExists) {
109
+ return true;
110
+ }
111
+ return generateCompletionCache();
112
+ }
@@ -0,0 +1,119 @@
1
+ import fsSync from "node:fs";
2
+ import { resolveAgentDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
3
+ import { resolveMemorySearchConfig } from "../agents/memory-search.js";
4
+ import { resolveApiKeyForProvider } from "../agents/model-auth.js";
5
+ import { formatCliCommand } from "../cli/command-format.js";
6
+ import { note } from "../terminal/note.js";
7
+ import { resolveUserPath } from "../utils.js";
8
+ /**
9
+ * Check whether memory search has a usable embedding provider.
10
+ * Runs as part of `openclaw doctor` — config-only, no network calls.
11
+ */
12
+ export async function noteMemorySearchHealth(cfg) {
13
+ const agentId = resolveDefaultAgentId(cfg);
14
+ const agentDir = resolveAgentDir(cfg, agentId);
15
+ const resolved = resolveMemorySearchConfig(cfg, agentId);
16
+ const hasRemoteApiKey = Boolean(resolved?.remote?.apiKey?.trim());
17
+ if (!resolved) {
18
+ note("Memory search is explicitly disabled (enabled: false).", "Memory search");
19
+ return;
20
+ }
21
+ // If a specific provider is configured (not "auto"), check only that one.
22
+ if (resolved.provider !== "auto") {
23
+ if (resolved.provider === "local") {
24
+ if (hasLocalEmbeddings(resolved.local)) {
25
+ return; // local model file exists
26
+ }
27
+ note([
28
+ 'Memory search provider is set to "local" but no local model file was found.',
29
+ "",
30
+ "Fix (pick one):",
31
+ `- Install node-llama-cpp and set a local model path in config`,
32
+ `- Switch to a remote provider: ${formatCliCommand("openclaw config set agents.defaults.memorySearch.provider openai")}`,
33
+ "",
34
+ `Verify: ${formatCliCommand("openclaw memory status --deep")}`,
35
+ ].join("\n"), "Memory search");
36
+ return;
37
+ }
38
+ // Remote provider — check for API key
39
+ if (hasRemoteApiKey || (await hasApiKeyForProvider(resolved.provider, cfg, agentDir))) {
40
+ return;
41
+ }
42
+ const envVar = providerEnvVar(resolved.provider);
43
+ note([
44
+ `Memory search provider is set to "${resolved.provider}" but no API key was found.`,
45
+ `Semantic recall will not work without a valid API key.`,
46
+ "",
47
+ "Fix (pick one):",
48
+ `- Set ${envVar} in your environment`,
49
+ `- Add credentials: ${formatCliCommand(`openclaw auth add --provider ${resolved.provider}`)}`,
50
+ `- To disable: ${formatCliCommand("openclaw config set agents.defaults.memorySearch.enabled false")}`,
51
+ "",
52
+ `Verify: ${formatCliCommand("openclaw memory status --deep")}`,
53
+ ].join("\n"), "Memory search");
54
+ return;
55
+ }
56
+ // provider === "auto": check all providers in resolution order
57
+ if (hasLocalEmbeddings(resolved.local)) {
58
+ return;
59
+ }
60
+ for (const provider of ["openai", "gemini", "voyage"]) {
61
+ if (hasRemoteApiKey || (await hasApiKeyForProvider(provider, cfg, agentDir))) {
62
+ return;
63
+ }
64
+ }
65
+ note([
66
+ "Memory search is enabled but no embedding provider is configured.",
67
+ "Semantic recall will not work without an embedding provider.",
68
+ "",
69
+ "Fix (pick one):",
70
+ "- Set OPENAI_API_KEY or GEMINI_API_KEY in your environment",
71
+ `- Add credentials: ${formatCliCommand("openclaw auth add --provider openai")}`,
72
+ `- For local embeddings: configure agents.defaults.memorySearch.provider and local model path`,
73
+ `- To disable: ${formatCliCommand("openclaw config set agents.defaults.memorySearch.enabled false")}`,
74
+ "",
75
+ `Verify: ${formatCliCommand("openclaw memory status --deep")}`,
76
+ ].join("\n"), "Memory search");
77
+ }
78
+ function hasLocalEmbeddings(local) {
79
+ const modelPath = local.modelPath?.trim();
80
+ if (!modelPath) {
81
+ return false;
82
+ }
83
+ // Remote/downloadable models (hf: or http:) aren't pre-resolved on disk,
84
+ // so we can't confirm availability without a network call. Treat as
85
+ // potentially available — the user configured it intentionally.
86
+ if (/^(hf:|https?:)/i.test(modelPath)) {
87
+ return true;
88
+ }
89
+ const resolved = resolveUserPath(modelPath);
90
+ try {
91
+ return fsSync.statSync(resolved).isFile();
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ async function hasApiKeyForProvider(provider, cfg, agentDir) {
98
+ // Map embedding provider names to model-auth provider names
99
+ const authProvider = provider === "gemini" ? "google" : provider;
100
+ try {
101
+ await resolveApiKeyForProvider({ provider: authProvider, cfg, agentDir });
102
+ return true;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ function providerEnvVar(provider) {
109
+ switch (provider) {
110
+ case "openai":
111
+ return "OPENAI_API_KEY";
112
+ case "gemini":
113
+ return "GEMINI_API_KEY";
114
+ case "voyage":
115
+ return "VOYAGE_API_KEY";
116
+ default:
117
+ return `${provider.toUpperCase()}_API_KEY`;
118
+ }
119
+ }
@@ -0,0 +1,73 @@
1
+ import { resolveAgentSessionDirs } from "../agents/session-dirs.js";
2
+ import { cleanStaleLockFiles } from "../agents/session-write-lock.js";
3
+ import { resolveStateDir } from "../config/paths.js";
4
+ import { note } from "../terminal/note.js";
5
+ import { shortenHomePath } from "../utils.js";
6
+ const DEFAULT_STALE_MS = 30 * 60 * 1000;
7
+ function formatAge(ageMs) {
8
+ if (ageMs === null) {
9
+ return "unknown";
10
+ }
11
+ const seconds = Math.floor(ageMs / 1000);
12
+ if (seconds < 60) {
13
+ return `${seconds}s`;
14
+ }
15
+ const minutes = Math.floor(seconds / 60);
16
+ const remainingSeconds = seconds % 60;
17
+ if (minutes < 60) {
18
+ return `${minutes}m${remainingSeconds}s`;
19
+ }
20
+ const hours = Math.floor(minutes / 60);
21
+ const remainingMinutes = minutes % 60;
22
+ return `${hours}h${remainingMinutes}m`;
23
+ }
24
+ function formatLockLine(lock) {
25
+ const pidStatus = lock.pid === null ? "pid=missing" : `pid=${lock.pid} (${lock.pidAlive ? "alive" : "dead"})`;
26
+ const ageStatus = `age=${formatAge(lock.ageMs)}`;
27
+ const staleStatus = lock.stale
28
+ ? `stale=yes (${lock.staleReasons.join(", ") || "unknown"})`
29
+ : "stale=no";
30
+ const removedStatus = lock.removed ? " [removed]" : "";
31
+ return `- ${shortenHomePath(lock.lockPath)} ${pidStatus} ${ageStatus} ${staleStatus}${removedStatus}`;
32
+ }
33
+ export async function noteSessionLockHealth(params) {
34
+ const shouldRepair = params?.shouldRepair === true;
35
+ const staleMs = params?.staleMs ?? DEFAULT_STALE_MS;
36
+ let sessionDirs = [];
37
+ try {
38
+ sessionDirs = await resolveAgentSessionDirs(resolveStateDir(process.env));
39
+ }
40
+ catch (err) {
41
+ note(`- Failed to inspect session lock files: ${String(err)}`, "Session locks");
42
+ return;
43
+ }
44
+ if (sessionDirs.length === 0) {
45
+ return;
46
+ }
47
+ const allLocks = [];
48
+ for (const sessionsDir of sessionDirs) {
49
+ const result = await cleanStaleLockFiles({
50
+ sessionsDir,
51
+ staleMs,
52
+ removeStale: shouldRepair,
53
+ });
54
+ allLocks.push(...result.locks);
55
+ }
56
+ if (allLocks.length === 0) {
57
+ return;
58
+ }
59
+ const staleCount = allLocks.filter((lock) => lock.stale).length;
60
+ const removedCount = allLocks.filter((lock) => lock.removed).length;
61
+ const lines = [
62
+ `- Found ${allLocks.length} session lock file${allLocks.length === 1 ? "" : "s"}.`,
63
+ ...allLocks.toSorted((a, b) => a.lockPath.localeCompare(b.lockPath)).map(formatLockLine),
64
+ ];
65
+ if (staleCount > 0 && !shouldRepair) {
66
+ lines.push(`- ${staleCount} lock file${staleCount === 1 ? " is" : "s are"} stale.`);
67
+ lines.push('- Run "openclaw doctor --fix" to remove stale lock files automatically.');
68
+ }
69
+ if (shouldRepair && removedCount > 0) {
70
+ lines.push(`- Removed ${removedCount} stale session lock file${removedCount === 1 ? "" : "s"}.`);
71
+ }
72
+ note(lines.join("\n"), "Session locks");
73
+ }