nodmix 2026.5.25

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 (827) hide show
  1. package/CHANGELOG.md +11573 -0
  2. package/LICENSE +21 -0
  3. package/README.md +486 -0
  4. package/docs/.i18n/README.md +81 -0
  5. package/docs/.i18n/ar-navigation.json +18 -0
  6. package/docs/.i18n/de-navigation.json +18 -0
  7. package/docs/.i18n/es-navigation.json +18 -0
  8. package/docs/.i18n/fr-navigation.json +18 -0
  9. package/docs/.i18n/glossary.ar.json +78 -0
  10. package/docs/.i18n/glossary.de.json +78 -0
  11. package/docs/.i18n/glossary.es.json +78 -0
  12. package/docs/.i18n/glossary.fa.json +78 -0
  13. package/docs/.i18n/glossary.fr.json +78 -0
  14. package/docs/.i18n/glossary.id.json +78 -0
  15. package/docs/.i18n/glossary.it.json +78 -0
  16. package/docs/.i18n/glossary.ja-JP.json +98 -0
  17. package/docs/.i18n/glossary.ko.json +78 -0
  18. package/docs/.i18n/glossary.nl.json +78 -0
  19. package/docs/.i18n/glossary.pl.json +78 -0
  20. package/docs/.i18n/glossary.pt-BR.json +78 -0
  21. package/docs/.i18n/glossary.th.json +78 -0
  22. package/docs/.i18n/glossary.tr.json +78 -0
  23. package/docs/.i18n/glossary.uk.json +78 -0
  24. package/docs/.i18n/glossary.vi.json +78 -0
  25. package/docs/.i18n/glossary.zh-CN.json +1002 -0
  26. package/docs/.i18n/glossary.zh-TW.json +78 -0
  27. package/docs/.i18n/id-navigation.json +18 -0
  28. package/docs/.i18n/it-navigation.json +18 -0
  29. package/docs/.i18n/ja-navigation.json +18 -0
  30. package/docs/.i18n/ko-navigation.json +18 -0
  31. package/docs/.i18n/pl-navigation.json +18 -0
  32. package/docs/.i18n/pt-BR-navigation.json +18 -0
  33. package/docs/.i18n/tr-navigation.json +18 -0
  34. package/docs/.i18n/translation-workflow.md +111 -0
  35. package/docs/.i18n/zh-Hans-navigation.json +542 -0
  36. package/docs/AGENTS.md +36 -0
  37. package/docs/announcements/bluebubbles-imessage.md +79 -0
  38. package/docs/assets/install-script.svg +1 -0
  39. package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
  40. package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
  41. package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
  42. package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
  43. package/docs/assets/macos-onboarding/05-permissions.png +0 -0
  44. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  45. package/docs/assets/openclaw-logo-text-dark.svg +418 -0
  46. package/docs/assets/openclaw-logo-text.png +0 -0
  47. package/docs/assets/openclaw-logo-text.svg +418 -0
  48. package/docs/assets/pixel-lobster.svg +60 -0
  49. package/docs/assets/pr/quick-settings-browser-tools.png +0 -0
  50. package/docs/assets/showcase/agents-ui.jpg +0 -0
  51. package/docs/assets/showcase/bambu-cli.png +0 -0
  52. package/docs/assets/showcase/codexmonitor.png +0 -0
  53. package/docs/assets/showcase/gohome-grafana.png +0 -0
  54. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  55. package/docs/assets/showcase/oura-health.png +0 -0
  56. package/docs/assets/showcase/padel-cli.svg +11 -0
  57. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  58. package/docs/assets/showcase/papla-tts.jpg +0 -0
  59. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  60. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  61. package/docs/assets/showcase/roborock-status.svg +13 -0
  62. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  63. package/docs/assets/showcase/snag.png +0 -0
  64. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  65. package/docs/assets/showcase/wienerlinien.png +0 -0
  66. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  67. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  68. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  69. package/docs/assets/sponsors/blacksmith-light.svg +14 -0
  70. package/docs/assets/sponsors/blacksmith.svg +14 -0
  71. package/docs/assets/sponsors/convex-light.svg +16 -0
  72. package/docs/assets/sponsors/convex.svg +16 -0
  73. package/docs/assets/sponsors/github-light.svg +3 -0
  74. package/docs/assets/sponsors/github.svg +3 -0
  75. package/docs/assets/sponsors/nvidia-dark.svg +9 -0
  76. package/docs/assets/sponsors/nvidia.svg +9 -0
  77. package/docs/assets/sponsors/openai-light.svg +3 -0
  78. package/docs/assets/sponsors/openai.svg +3 -0
  79. package/docs/assets/sponsors/vercel-light.svg +5 -0
  80. package/docs/assets/sponsors/vercel.svg +5 -0
  81. package/docs/auth-credential-semantics.md +124 -0
  82. package/docs/automation/auth-monitoring.md +11 -0
  83. package/docs/automation/clawflow.md +12 -0
  84. package/docs/automation/cron-jobs.md +500 -0
  85. package/docs/automation/cron-vs-heartbeat.md +11 -0
  86. package/docs/automation/gmail-pubsub.md +11 -0
  87. package/docs/automation/hooks.md +365 -0
  88. package/docs/automation/index.md +135 -0
  89. package/docs/automation/poll.md +12 -0
  90. package/docs/automation/standing-orders.md +250 -0
  91. package/docs/automation/taskflow.md +155 -0
  92. package/docs/automation/tasks.md +374 -0
  93. package/docs/automation/troubleshooting.md +12 -0
  94. package/docs/automation/webhook.md +12 -0
  95. package/docs/brave-search.md +11 -0
  96. package/docs/channels/access-groups.md +201 -0
  97. package/docs/channels/ambient-room-events.md +214 -0
  98. package/docs/channels/bot-loop-protection.md +131 -0
  99. package/docs/channels/broadcast-groups.md +472 -0
  100. package/docs/channels/channel-routing.md +162 -0
  101. package/docs/channels/clickclack.md +138 -0
  102. package/docs/channels/discord.md +1762 -0
  103. package/docs/channels/feishu.md +502 -0
  104. package/docs/channels/googlechat.md +284 -0
  105. package/docs/channels/group-messages.md +95 -0
  106. package/docs/channels/groups.md +519 -0
  107. package/docs/channels/imessage-from-bluebubbles.md +259 -0
  108. package/docs/channels/imessage.md +813 -0
  109. package/docs/channels/index.md +64 -0
  110. package/docs/channels/irc.md +253 -0
  111. package/docs/channels/line.md +243 -0
  112. package/docs/channels/location.md +71 -0
  113. package/docs/channels/matrix-migration.md +370 -0
  114. package/docs/channels/matrix-presentation.md +77 -0
  115. package/docs/channels/matrix-push-rules.md +150 -0
  116. package/docs/channels/matrix.md +921 -0
  117. package/docs/channels/mattermost.md +542 -0
  118. package/docs/channels/msteams.md +1042 -0
  119. package/docs/channels/nextcloud-talk.md +176 -0
  120. package/docs/channels/nostr.md +253 -0
  121. package/docs/channels/pairing.md +214 -0
  122. package/docs/channels/qqbot.md +309 -0
  123. package/docs/channels/signal.md +400 -0
  124. package/docs/channels/slack.md +1564 -0
  125. package/docs/channels/synology-chat.md +187 -0
  126. package/docs/channels/telegram.md +1107 -0
  127. package/docs/channels/tlon.md +296 -0
  128. package/docs/channels/troubleshooting.md +161 -0
  129. package/docs/channels/twitch.md +431 -0
  130. package/docs/channels/wechat.md +171 -0
  131. package/docs/channels/whatsapp.md +739 -0
  132. package/docs/channels/yuanbao.md +416 -0
  133. package/docs/channels/zalo.md +253 -0
  134. package/docs/channels/zalouser.md +199 -0
  135. package/docs/ci.md +612 -0
  136. package/docs/clawhub/publishing.md +96 -0
  137. package/docs/cli/acp.md +370 -0
  138. package/docs/cli/agent.md +103 -0
  139. package/docs/cli/agents.md +232 -0
  140. package/docs/cli/approvals.md +190 -0
  141. package/docs/cli/backup.md +97 -0
  142. package/docs/cli/browser.md +307 -0
  143. package/docs/cli/channels.md +154 -0
  144. package/docs/cli/clawbot.md +25 -0
  145. package/docs/cli/commitments.md +90 -0
  146. package/docs/cli/completion.md +39 -0
  147. package/docs/cli/config.md +504 -0
  148. package/docs/cli/configure.md +77 -0
  149. package/docs/cli/crestodian.md +332 -0
  150. package/docs/cli/cron.md +281 -0
  151. package/docs/cli/daemon.md +67 -0
  152. package/docs/cli/dashboard.md +33 -0
  153. package/docs/cli/devices.md +204 -0
  154. package/docs/cli/directory.md +68 -0
  155. package/docs/cli/dns.md +53 -0
  156. package/docs/cli/docs.md +73 -0
  157. package/docs/cli/doctor.md +237 -0
  158. package/docs/cli/flows.md +52 -0
  159. package/docs/cli/gateway.md +567 -0
  160. package/docs/cli/health.md +43 -0
  161. package/docs/cli/hooks.md +345 -0
  162. package/docs/cli/index.md +396 -0
  163. package/docs/cli/infer.md +364 -0
  164. package/docs/cli/logs.md +65 -0
  165. package/docs/cli/mcp.md +529 -0
  166. package/docs/cli/memory.md +183 -0
  167. package/docs/cli/message.md +317 -0
  168. package/docs/cli/migrate.md +290 -0
  169. package/docs/cli/models.md +224 -0
  170. package/docs/cli/node.md +177 -0
  171. package/docs/cli/nodes.md +76 -0
  172. package/docs/cli/onboard.md +245 -0
  173. package/docs/cli/pairing.md +77 -0
  174. package/docs/cli/path.md +502 -0
  175. package/docs/cli/plugins.md +454 -0
  176. package/docs/cli/policy.md +418 -0
  177. package/docs/cli/proxy.md +89 -0
  178. package/docs/cli/qr.md +56 -0
  179. package/docs/cli/reset.md +39 -0
  180. package/docs/cli/sandbox.md +208 -0
  181. package/docs/cli/secrets.md +202 -0
  182. package/docs/cli/security.md +124 -0
  183. package/docs/cli/sessions.md +164 -0
  184. package/docs/cli/setup.md +59 -0
  185. package/docs/cli/skills.md +102 -0
  186. package/docs/cli/status.md +45 -0
  187. package/docs/cli/system.md +89 -0
  188. package/docs/cli/tasks.md +111 -0
  189. package/docs/cli/tui.md +89 -0
  190. package/docs/cli/uninstall.md +44 -0
  191. package/docs/cli/update.md +242 -0
  192. package/docs/cli/voicecall.md +204 -0
  193. package/docs/cli/webhooks.md +117 -0
  194. package/docs/cli/wiki.md +256 -0
  195. package/docs/concepts/active-memory.md +856 -0
  196. package/docs/concepts/agent-loop.md +185 -0
  197. package/docs/concepts/agent-runtimes.md +243 -0
  198. package/docs/concepts/agent-workspace.md +230 -0
  199. package/docs/concepts/agent.md +136 -0
  200. package/docs/concepts/architecture.md +154 -0
  201. package/docs/concepts/channel-docking.md +145 -0
  202. package/docs/concepts/commitments.md +150 -0
  203. package/docs/concepts/compaction.md +203 -0
  204. package/docs/concepts/context-engine.md +306 -0
  205. package/docs/concepts/context.md +199 -0
  206. package/docs/concepts/delegate-architecture.md +319 -0
  207. package/docs/concepts/dreaming.md +261 -0
  208. package/docs/concepts/experimental-features.md +108 -0
  209. package/docs/concepts/features.md +91 -0
  210. package/docs/concepts/mantis-slack-desktop-runbook.md +202 -0
  211. package/docs/concepts/mantis.md +740 -0
  212. package/docs/concepts/markdown-formatting.md +139 -0
  213. package/docs/concepts/memory-builtin.md +146 -0
  214. package/docs/concepts/memory-honcho.md +144 -0
  215. package/docs/concepts/memory-qmd.md +271 -0
  216. package/docs/concepts/memory-search.md +166 -0
  217. package/docs/concepts/memory.md +258 -0
  218. package/docs/concepts/message-lifecycle-refactor.md +1128 -0
  219. package/docs/concepts/messages.md +214 -0
  220. package/docs/concepts/model-failover.md +385 -0
  221. package/docs/concepts/model-providers.md +715 -0
  222. package/docs/concepts/models.md +370 -0
  223. package/docs/concepts/multi-agent.md +619 -0
  224. package/docs/concepts/oauth.md +198 -0
  225. package/docs/concepts/openclaw-sdk.md +323 -0
  226. package/docs/concepts/parallel-specialist-lanes.md +127 -0
  227. package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
  228. package/docs/concepts/presence.md +117 -0
  229. package/docs/concepts/progress-drafts.md +362 -0
  230. package/docs/concepts/qa-e2e-automation.md +820 -0
  231. package/docs/concepts/qa-matrix.md +139 -0
  232. package/docs/concepts/queue-steering.md +90 -0
  233. package/docs/concepts/queue.md +122 -0
  234. package/docs/concepts/retry.md +86 -0
  235. package/docs/concepts/session-pruning.md +104 -0
  236. package/docs/concepts/session-tool.md +190 -0
  237. package/docs/concepts/session.md +164 -0
  238. package/docs/concepts/soul.md +116 -0
  239. package/docs/concepts/streaming.md +251 -0
  240. package/docs/concepts/system-prompt.md +310 -0
  241. package/docs/concepts/timezone.md +47 -0
  242. package/docs/concepts/typebox.md +309 -0
  243. package/docs/concepts/typing-indicators.md +88 -0
  244. package/docs/concepts/usage-tracking.md +66 -0
  245. package/docs/date-time.md +126 -0
  246. package/docs/debug/node-issue.md +90 -0
  247. package/docs/diagnostics/flags.md +138 -0
  248. package/docs/docs.json +1832 -0
  249. package/docs/gateway/authentication.md +239 -0
  250. package/docs/gateway/background-process.md +147 -0
  251. package/docs/gateway/bonjour.md +303 -0
  252. package/docs/gateway/bridge-protocol.md +94 -0
  253. package/docs/gateway/cli-backends.md +420 -0
  254. package/docs/gateway/config-agents.md +1514 -0
  255. package/docs/gateway/config-channels.md +945 -0
  256. package/docs/gateway/config-tools.md +769 -0
  257. package/docs/gateway/configuration-examples.md +705 -0
  258. package/docs/gateway/configuration-reference.md +1393 -0
  259. package/docs/gateway/configuration.md +737 -0
  260. package/docs/gateway/diagnostics.md +213 -0
  261. package/docs/gateway/discovery.md +154 -0
  262. package/docs/gateway/doctor.md +574 -0
  263. package/docs/gateway/gateway-lock.md +37 -0
  264. package/docs/gateway/health.md +73 -0
  265. package/docs/gateway/heartbeat.md +493 -0
  266. package/docs/gateway/index.md +383 -0
  267. package/docs/gateway/local-model-services.md +205 -0
  268. package/docs/gateway/local-models.md +355 -0
  269. package/docs/gateway/logging.md +149 -0
  270. package/docs/gateway/multiple-gateways.md +178 -0
  271. package/docs/gateway/network-model.md +15 -0
  272. package/docs/gateway/openai-http-api.md +350 -0
  273. package/docs/gateway/openresponses-http-api.md +347 -0
  274. package/docs/gateway/openshell.md +316 -0
  275. package/docs/gateway/opentelemetry.md +404 -0
  276. package/docs/gateway/operator-scopes.md +111 -0
  277. package/docs/gateway/pairing.md +207 -0
  278. package/docs/gateway/prometheus.md +230 -0
  279. package/docs/gateway/protocol.md +803 -0
  280. package/docs/gateway/remote-gateway-readme.md +169 -0
  281. package/docs/gateway/remote.md +280 -0
  282. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +146 -0
  283. package/docs/gateway/sandboxing.md +545 -0
  284. package/docs/gateway/secrets-plan-contract.md +114 -0
  285. package/docs/gateway/secrets.md +609 -0
  286. package/docs/gateway/security/audit-checks.md +127 -0
  287. package/docs/gateway/security/index.md +1326 -0
  288. package/docs/gateway/security/secure-file-operations.md +76 -0
  289. package/docs/gateway/tailscale.md +156 -0
  290. package/docs/gateway/tools-invoke-http-api.md +169 -0
  291. package/docs/gateway/troubleshooting.md +772 -0
  292. package/docs/gateway/trusted-proxy-auth.md +451 -0
  293. package/docs/help/debugging.md +344 -0
  294. package/docs/help/environment.md +214 -0
  295. package/docs/help/faq-first-run.md +867 -0
  296. package/docs/help/faq-models.md +553 -0
  297. package/docs/help/faq.md +1975 -0
  298. package/docs/help/gpt55-codex-agentic-parity-maintainers.md +196 -0
  299. package/docs/help/gpt55-codex-agentic-parity.md +230 -0
  300. package/docs/help/index.md +39 -0
  301. package/docs/help/scripts.md +56 -0
  302. package/docs/help/testing-live.md +580 -0
  303. package/docs/help/testing-updates-plugins.md +291 -0
  304. package/docs/help/testing.md +928 -0
  305. package/docs/help/troubleshooting.md +424 -0
  306. package/docs/images/configure-model-picker-unsearchable.png +0 -0
  307. package/docs/images/feishu-get-group-id.png +0 -0
  308. package/docs/images/groups-flow.svg +52 -0
  309. package/docs/images/mobile-ui-screenshot.png +0 -0
  310. package/docs/index.md +196 -0
  311. package/docs/install/ansible.md +233 -0
  312. package/docs/install/azure.md +315 -0
  313. package/docs/install/bun.md +59 -0
  314. package/docs/install/clawdock.md +112 -0
  315. package/docs/install/development-channels.md +135 -0
  316. package/docs/install/digitalocean.md +174 -0
  317. package/docs/install/docker-vm-runtime.md +154 -0
  318. package/docs/install/docker.md +562 -0
  319. package/docs/install/exe-dev.md +201 -0
  320. package/docs/install/fly.md +524 -0
  321. package/docs/install/gcp.md +418 -0
  322. package/docs/install/hetzner.md +285 -0
  323. package/docs/install/hostinger.md +98 -0
  324. package/docs/install/index.md +221 -0
  325. package/docs/install/installer.md +455 -0
  326. package/docs/install/kubernetes.md +196 -0
  327. package/docs/install/macos-vm.md +281 -0
  328. package/docs/install/migrating-claude.md +165 -0
  329. package/docs/install/migrating-hermes.md +177 -0
  330. package/docs/install/migrating.md +137 -0
  331. package/docs/install/nix.md +112 -0
  332. package/docs/install/node.md +142 -0
  333. package/docs/install/northflank.mdx +44 -0
  334. package/docs/install/oracle.md +218 -0
  335. package/docs/install/podman.md +210 -0
  336. package/docs/install/railway.mdx +92 -0
  337. package/docs/install/raspberry-pi.md +234 -0
  338. package/docs/install/render.mdx +167 -0
  339. package/docs/install/uninstall.md +131 -0
  340. package/docs/install/updating.md +280 -0
  341. package/docs/logging.md +318 -0
  342. package/docs/nav-tabs-underline.js +100 -0
  343. package/docs/network.md +72 -0
  344. package/docs/nodes/audio.md +215 -0
  345. package/docs/nodes/camera.md +166 -0
  346. package/docs/nodes/images.md +77 -0
  347. package/docs/nodes/index.md +439 -0
  348. package/docs/nodes/location-command.md +102 -0
  349. package/docs/nodes/media-understanding.md +469 -0
  350. package/docs/nodes/talk.md +154 -0
  351. package/docs/nodes/troubleshooting.md +123 -0
  352. package/docs/nodes/voicewake.md +93 -0
  353. package/docs/perplexity.md +11 -0
  354. package/docs/pi-dev.md +82 -0
  355. package/docs/pi.md +573 -0
  356. package/docs/plan/codex-context-engine-harness.md +624 -0
  357. package/docs/plan/ui-channels.md +284 -0
  358. package/docs/platforms/android.md +285 -0
  359. package/docs/platforms/digitalocean.md +12 -0
  360. package/docs/platforms/index.md +60 -0
  361. package/docs/platforms/ios.md +283 -0
  362. package/docs/platforms/linux.md +141 -0
  363. package/docs/platforms/mac/bundled-gateway.md +79 -0
  364. package/docs/platforms/mac/canvas.md +128 -0
  365. package/docs/platforms/mac/child-process.md +72 -0
  366. package/docs/platforms/mac/dev-setup.md +112 -0
  367. package/docs/platforms/mac/health.md +39 -0
  368. package/docs/platforms/mac/icon.md +36 -0
  369. package/docs/platforms/mac/logging.md +62 -0
  370. package/docs/platforms/mac/menu-bar.md +93 -0
  371. package/docs/platforms/mac/peekaboo.md +92 -0
  372. package/docs/platforms/mac/permissions.md +53 -0
  373. package/docs/platforms/mac/remote.md +123 -0
  374. package/docs/platforms/mac/signing.md +52 -0
  375. package/docs/platforms/mac/skills.md +43 -0
  376. package/docs/platforms/mac/voice-overlay.md +66 -0
  377. package/docs/platforms/mac/voicewake.md +73 -0
  378. package/docs/platforms/mac/webchat.md +54 -0
  379. package/docs/platforms/mac/xpc.md +66 -0
  380. package/docs/platforms/macos.md +226 -0
  381. package/docs/platforms/oracle.md +12 -0
  382. package/docs/platforms/raspberry-pi.md +13 -0
  383. package/docs/platforms/windows.md +286 -0
  384. package/docs/plugins/adding-capabilities.md +133 -0
  385. package/docs/plugins/admin-http-rpc.md +216 -0
  386. package/docs/plugins/agent-tools.md +13 -0
  387. package/docs/plugins/architecture-internals.md +1195 -0
  388. package/docs/plugins/architecture.md +481 -0
  389. package/docs/plugins/building-extensions.md +13 -0
  390. package/docs/plugins/building-plugins.md +330 -0
  391. package/docs/plugins/bundles.md +310 -0
  392. package/docs/plugins/cli-backend-plugins.md +310 -0
  393. package/docs/plugins/codex-computer-use.md +293 -0
  394. package/docs/plugins/codex-harness-reference.md +409 -0
  395. package/docs/plugins/codex-harness-runtime.md +247 -0
  396. package/docs/plugins/codex-harness.md +746 -0
  397. package/docs/plugins/codex-native-plugins.md +276 -0
  398. package/docs/plugins/community.md +77 -0
  399. package/docs/plugins/compatibility.md +164 -0
  400. package/docs/plugins/dependency-resolution.md +143 -0
  401. package/docs/plugins/google-meet.md +1737 -0
  402. package/docs/plugins/hooks.md +459 -0
  403. package/docs/plugins/install-overrides.md +80 -0
  404. package/docs/plugins/manage-plugins.md +210 -0
  405. package/docs/plugins/manifest.md +1359 -0
  406. package/docs/plugins/memory-lancedb.md +385 -0
  407. package/docs/plugins/memory-wiki.md +529 -0
  408. package/docs/plugins/message-presentation.md +473 -0
  409. package/docs/plugins/oc-path.md +166 -0
  410. package/docs/plugins/plugin-inventory.md +182 -0
  411. package/docs/plugins/reference/acpx.md +23 -0
  412. package/docs/plugins/reference/admin-http-rpc.md +23 -0
  413. package/docs/plugins/reference/alibaba.md +23 -0
  414. package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
  415. package/docs/plugins/reference/amazon-bedrock.md +23 -0
  416. package/docs/plugins/reference/anthropic-vertex.md +19 -0
  417. package/docs/plugins/reference/anthropic.md +23 -0
  418. package/docs/plugins/reference/arcee.md +23 -0
  419. package/docs/plugins/reference/azure-speech.md +23 -0
  420. package/docs/plugins/reference/bonjour.md +19 -0
  421. package/docs/plugins/reference/brave.md +23 -0
  422. package/docs/plugins/reference/browser.md +23 -0
  423. package/docs/plugins/reference/byteplus.md +19 -0
  424. package/docs/plugins/reference/canvas.md +19 -0
  425. package/docs/plugins/reference/cerebras.md +23 -0
  426. package/docs/plugins/reference/chutes.md +23 -0
  427. package/docs/plugins/reference/clickclack.md +23 -0
  428. package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
  429. package/docs/plugins/reference/codex.md +23 -0
  430. package/docs/plugins/reference/comfy.md +23 -0
  431. package/docs/plugins/reference/copilot-proxy.md +19 -0
  432. package/docs/plugins/reference/deepgram.md +23 -0
  433. package/docs/plugins/reference/deepinfra.md +23 -0
  434. package/docs/plugins/reference/deepseek.md +23 -0
  435. package/docs/plugins/reference/diagnostics-otel.md +19 -0
  436. package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
  437. package/docs/plugins/reference/diffs.md +19 -0
  438. package/docs/plugins/reference/discord.md +23 -0
  439. package/docs/plugins/reference/document-extract.md +23 -0
  440. package/docs/plugins/reference/duckduckgo.md +23 -0
  441. package/docs/plugins/reference/elevenlabs.md +23 -0
  442. package/docs/plugins/reference/exa.md +23 -0
  443. package/docs/plugins/reference/fal.md +23 -0
  444. package/docs/plugins/reference/feishu.md +23 -0
  445. package/docs/plugins/reference/file-transfer.md +19 -0
  446. package/docs/plugins/reference/firecrawl.md +23 -0
  447. package/docs/plugins/reference/fireworks.md +23 -0
  448. package/docs/plugins/reference/github-copilot.md +23 -0
  449. package/docs/plugins/reference/google-meet.md +23 -0
  450. package/docs/plugins/reference/google.md +23 -0
  451. package/docs/plugins/reference/googlechat.md +23 -0
  452. package/docs/plugins/reference/gradium.md +23 -0
  453. package/docs/plugins/reference/groq.md +23 -0
  454. package/docs/plugins/reference/huggingface.md +23 -0
  455. package/docs/plugins/reference/imessage.md +23 -0
  456. package/docs/plugins/reference/inworld.md +23 -0
  457. package/docs/plugins/reference/irc.md +23 -0
  458. package/docs/plugins/reference/kilocode.md +23 -0
  459. package/docs/plugins/reference/kimi.md +23 -0
  460. package/docs/plugins/reference/line.md +23 -0
  461. package/docs/plugins/reference/litellm.md +23 -0
  462. package/docs/plugins/reference/llm-task.md +19 -0
  463. package/docs/plugins/reference/lmstudio.md +23 -0
  464. package/docs/plugins/reference/lobster.md +19 -0
  465. package/docs/plugins/reference/matrix.md +23 -0
  466. package/docs/plugins/reference/mattermost.md +23 -0
  467. package/docs/plugins/reference/memory-core.md +19 -0
  468. package/docs/plugins/reference/memory-lancedb.md +23 -0
  469. package/docs/plugins/reference/memory-wiki.md +23 -0
  470. package/docs/plugins/reference/microsoft-foundry.md +19 -0
  471. package/docs/plugins/reference/microsoft.md +19 -0
  472. package/docs/plugins/reference/migrate-claude.md +19 -0
  473. package/docs/plugins/reference/migrate-hermes.md +19 -0
  474. package/docs/plugins/reference/minimax.md +23 -0
  475. package/docs/plugins/reference/mistral.md +23 -0
  476. package/docs/plugins/reference/moonshot.md +23 -0
  477. package/docs/plugins/reference/msteams.md +23 -0
  478. package/docs/plugins/reference/nextcloud-talk.md +23 -0
  479. package/docs/plugins/reference/nostr.md +23 -0
  480. package/docs/plugins/reference/nvidia.md +23 -0
  481. package/docs/plugins/reference/oc-path.md +23 -0
  482. package/docs/plugins/reference/ollama.md +23 -0
  483. package/docs/plugins/reference/open-prose.md +19 -0
  484. package/docs/plugins/reference/openai.md +23 -0
  485. package/docs/plugins/reference/opencode-go.md +23 -0
  486. package/docs/plugins/reference/opencode.md +23 -0
  487. package/docs/plugins/reference/openrouter.md +23 -0
  488. package/docs/plugins/reference/openshell.md +19 -0
  489. package/docs/plugins/reference/perplexity.md +23 -0
  490. package/docs/plugins/reference/policy.md +23 -0
  491. package/docs/plugins/reference/qa-channel.md +23 -0
  492. package/docs/plugins/reference/qa-lab.md +19 -0
  493. package/docs/plugins/reference/qa-matrix.md +19 -0
  494. package/docs/plugins/reference/qianfan.md +23 -0
  495. package/docs/plugins/reference/qqbot.md +23 -0
  496. package/docs/plugins/reference/qwen.md +23 -0
  497. package/docs/plugins/reference/runway.md +23 -0
  498. package/docs/plugins/reference/searxng.md +19 -0
  499. package/docs/plugins/reference/senseaudio.md +23 -0
  500. package/docs/plugins/reference/sglang.md +23 -0
  501. package/docs/plugins/reference/signal.md +23 -0
  502. package/docs/plugins/reference/skill-workshop.md +23 -0
  503. package/docs/plugins/reference/slack.md +23 -0
  504. package/docs/plugins/reference/stepfun.md +23 -0
  505. package/docs/plugins/reference/synology-chat.md +23 -0
  506. package/docs/plugins/reference/synthetic.md +23 -0
  507. package/docs/plugins/reference/tavily.md +23 -0
  508. package/docs/plugins/reference/telegram.md +23 -0
  509. package/docs/plugins/reference/tencent.md +23 -0
  510. package/docs/plugins/reference/tlon.md +23 -0
  511. package/docs/plugins/reference/together.md +23 -0
  512. package/docs/plugins/reference/tokenjuice.md +23 -0
  513. package/docs/plugins/reference/tts-local-cli.md +19 -0
  514. package/docs/plugins/reference/twitch.md +23 -0
  515. package/docs/plugins/reference/venice.md +23 -0
  516. package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
  517. package/docs/plugins/reference/vllm.md +23 -0
  518. package/docs/plugins/reference/voice-call.md +23 -0
  519. package/docs/plugins/reference/volcengine.md +23 -0
  520. package/docs/plugins/reference/voyage.md +19 -0
  521. package/docs/plugins/reference/vydra.md +23 -0
  522. package/docs/plugins/reference/web-readability.md +19 -0
  523. package/docs/plugins/reference/webhooks.md +23 -0
  524. package/docs/plugins/reference/whatsapp.md +23 -0
  525. package/docs/plugins/reference/xai.md +23 -0
  526. package/docs/plugins/reference/xiaomi.md +23 -0
  527. package/docs/plugins/reference/zai.md +23 -0
  528. package/docs/plugins/reference/zalo.md +23 -0
  529. package/docs/plugins/reference/zalouser.md +24 -0
  530. package/docs/plugins/reference.md +138 -0
  531. package/docs/plugins/sdk-agent-harness.md +339 -0
  532. package/docs/plugins/sdk-channel-ingress.md +137 -0
  533. package/docs/plugins/sdk-channel-message.md +458 -0
  534. package/docs/plugins/sdk-channel-plugins.md +762 -0
  535. package/docs/plugins/sdk-channel-turn.md +580 -0
  536. package/docs/plugins/sdk-entrypoints.md +333 -0
  537. package/docs/plugins/sdk-migration.md +949 -0
  538. package/docs/plugins/sdk-overview.md +501 -0
  539. package/docs/plugins/sdk-provider-plugins.md +807 -0
  540. package/docs/plugins/sdk-runtime.md +676 -0
  541. package/docs/plugins/sdk-setup.md +550 -0
  542. package/docs/plugins/sdk-subpaths.md +396 -0
  543. package/docs/plugins/sdk-testing.md +401 -0
  544. package/docs/plugins/skill-workshop.md +713 -0
  545. package/docs/plugins/tool-plugins.md +411 -0
  546. package/docs/plugins/voice-call.md +943 -0
  547. package/docs/plugins/webhooks.md +192 -0
  548. package/docs/plugins/zalouser.md +86 -0
  549. package/docs/prose.md +137 -0
  550. package/docs/providers/alibaba.md +158 -0
  551. package/docs/providers/anthropic.md +344 -0
  552. package/docs/providers/arcee.md +144 -0
  553. package/docs/providers/azure-speech.md +119 -0
  554. package/docs/providers/bedrock-mantle.md +211 -0
  555. package/docs/providers/bedrock.md +414 -0
  556. package/docs/providers/cerebras.md +130 -0
  557. package/docs/providers/chutes.md +153 -0
  558. package/docs/providers/claude-max-api-proxy.md +188 -0
  559. package/docs/providers/cloudflare-ai-gateway.md +119 -0
  560. package/docs/providers/comfy.md +362 -0
  561. package/docs/providers/deepgram.md +184 -0
  562. package/docs/providers/deepinfra.md +87 -0
  563. package/docs/providers/deepseek.md +146 -0
  564. package/docs/providers/ds4.md +309 -0
  565. package/docs/providers/elevenlabs.md +130 -0
  566. package/docs/providers/fal.md +204 -0
  567. package/docs/providers/fireworks.md +144 -0
  568. package/docs/providers/github-copilot.md +225 -0
  569. package/docs/providers/glm.md +137 -0
  570. package/docs/providers/google.md +472 -0
  571. package/docs/providers/gradium.md +123 -0
  572. package/docs/providers/groq.md +180 -0
  573. package/docs/providers/huggingface.md +235 -0
  574. package/docs/providers/index.md +102 -0
  575. package/docs/providers/inferrs.md +272 -0
  576. package/docs/providers/inworld.md +120 -0
  577. package/docs/providers/kilocode.md +135 -0
  578. package/docs/providers/litellm.md +234 -0
  579. package/docs/providers/lmstudio.md +224 -0
  580. package/docs/providers/minimax.md +505 -0
  581. package/docs/providers/mistral.md +235 -0
  582. package/docs/providers/models.md +65 -0
  583. package/docs/providers/moonshot.md +413 -0
  584. package/docs/providers/nvidia.md +140 -0
  585. package/docs/providers/ollama.md +1180 -0
  586. package/docs/providers/openai.md +1057 -0
  587. package/docs/providers/opencode-go.md +123 -0
  588. package/docs/providers/opencode.md +149 -0
  589. package/docs/providers/openrouter.md +349 -0
  590. package/docs/providers/perplexity-provider.md +123 -0
  591. package/docs/providers/qianfan.md +132 -0
  592. package/docs/providers/qwen.md +332 -0
  593. package/docs/providers/runway.md +103 -0
  594. package/docs/providers/senseaudio.md +68 -0
  595. package/docs/providers/sglang.md +161 -0
  596. package/docs/providers/stepfun.md +229 -0
  597. package/docs/providers/synthetic.md +154 -0
  598. package/docs/providers/tencent.md +130 -0
  599. package/docs/providers/together.md +141 -0
  600. package/docs/providers/venice.md +315 -0
  601. package/docs/providers/vercel-ai-gateway.md +128 -0
  602. package/docs/providers/vllm.md +383 -0
  603. package/docs/providers/volcengine.md +199 -0
  604. package/docs/providers/vydra.md +180 -0
  605. package/docs/providers/xai.md +560 -0
  606. package/docs/providers/xiaomi.md +188 -0
  607. package/docs/providers/zai.md +203 -0
  608. package/docs/refactor/access.md +9 -0
  609. package/docs/refactor/acp.md +298 -0
  610. package/docs/refactor/canvas.md +131 -0
  611. package/docs/refactor/ingress-core.md +341 -0
  612. package/docs/reference/AGENTS.default.md +129 -0
  613. package/docs/reference/RELEASING.md +767 -0
  614. package/docs/reference/api-usage-costs.md +202 -0
  615. package/docs/reference/application-modernization-plan.md +208 -0
  616. package/docs/reference/code-mode.md +757 -0
  617. package/docs/reference/credits.md +33 -0
  618. package/docs/reference/device-models.md +50 -0
  619. package/docs/reference/full-release-validation.md +202 -0
  620. package/docs/reference/memory-config.md +630 -0
  621. package/docs/reference/openclaw-sdk-api-design.md +390 -0
  622. package/docs/reference/prompt-caching.md +358 -0
  623. package/docs/reference/rich-output-protocol.md +79 -0
  624. package/docs/reference/rpc.md +43 -0
  625. package/docs/reference/secretref-credential-surface.md +159 -0
  626. package/docs/reference/secretref-user-supplied-credentials-matrix.json +663 -0
  627. package/docs/reference/session-management-compaction.md +461 -0
  628. package/docs/reference/templates/AGENTS.dev.md +89 -0
  629. package/docs/reference/templates/AGENTS.md +225 -0
  630. package/docs/reference/templates/BOOT.md +16 -0
  631. package/docs/reference/templates/BOOTSTRAP.md +66 -0
  632. package/docs/reference/templates/HEARTBEAT.md +16 -0
  633. package/docs/reference/templates/IDENTITY.dev.md +52 -0
  634. package/docs/reference/templates/IDENTITY.md +34 -0
  635. package/docs/reference/templates/SOUL.dev.md +82 -0
  636. package/docs/reference/templates/SOUL.md +49 -0
  637. package/docs/reference/templates/TOOLS.dev.md +29 -0
  638. package/docs/reference/templates/TOOLS.md +51 -0
  639. package/docs/reference/templates/USER.dev.md +23 -0
  640. package/docs/reference/templates/USER.md +28 -0
  641. package/docs/reference/test.md +239 -0
  642. package/docs/reference/token-use.md +233 -0
  643. package/docs/reference/transcript-hygiene.md +214 -0
  644. package/docs/reference/wizard.md +252 -0
  645. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
  646. package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
  647. package/docs/security/formal-verification.md +170 -0
  648. package/docs/security/incident-response.md +59 -0
  649. package/docs/security/network-proxy.md +268 -0
  650. package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
  651. package/docs/snippets/plugin-publish/minimal-package.json +16 -0
  652. package/docs/start/bootstrapping.md +49 -0
  653. package/docs/start/docs-directory.md +69 -0
  654. package/docs/start/getting-started.md +152 -0
  655. package/docs/start/hubs.md +201 -0
  656. package/docs/start/lore.md +223 -0
  657. package/docs/start/onboarding-overview.md +72 -0
  658. package/docs/start/onboarding.md +95 -0
  659. package/docs/start/openclaw.md +244 -0
  660. package/docs/start/quickstart.md +25 -0
  661. package/docs/start/setup.md +178 -0
  662. package/docs/start/showcase.md +383 -0
  663. package/docs/start/wizard-cli-automation.md +232 -0
  664. package/docs/start/wizard-cli-reference.md +331 -0
  665. package/docs/start/wizard.md +141 -0
  666. package/docs/style.css +184 -0
  667. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +316 -0
  668. package/docs/tools/acp-agents-setup.md +352 -0
  669. package/docs/tools/acp-agents.md +847 -0
  670. package/docs/tools/agent-send.md +112 -0
  671. package/docs/tools/apply-patch.md +64 -0
  672. package/docs/tools/brave-search.md +139 -0
  673. package/docs/tools/browser-control.md +391 -0
  674. package/docs/tools/browser-linux-troubleshooting.md +173 -0
  675. package/docs/tools/browser-login.md +77 -0
  676. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
  677. package/docs/tools/browser.md +769 -0
  678. package/docs/tools/btw.md +159 -0
  679. package/docs/tools/capability-cookbook.md +12 -0
  680. package/docs/tools/clawhub.md +5 -0
  681. package/docs/tools/code-execution.md +173 -0
  682. package/docs/tools/creating-skills.md +120 -0
  683. package/docs/tools/diffs.md +506 -0
  684. package/docs/tools/duckduckgo-search.md +109 -0
  685. package/docs/tools/elevated.md +128 -0
  686. package/docs/tools/exa-search.md +152 -0
  687. package/docs/tools/exec-approvals-advanced.md +360 -0
  688. package/docs/tools/exec-approvals.md +474 -0
  689. package/docs/tools/exec.md +282 -0
  690. package/docs/tools/firecrawl.md +155 -0
  691. package/docs/tools/gemini-search.md +114 -0
  692. package/docs/tools/grok-search.md +113 -0
  693. package/docs/tools/image-generation.md +433 -0
  694. package/docs/tools/index.md +178 -0
  695. package/docs/tools/kimi-search.md +105 -0
  696. package/docs/tools/llm-task.md +137 -0
  697. package/docs/tools/lobster.md +365 -0
  698. package/docs/tools/loop-detection.md +154 -0
  699. package/docs/tools/media-overview.md +157 -0
  700. package/docs/tools/minimax-search.md +102 -0
  701. package/docs/tools/multi-agent-sandbox-tools.md +409 -0
  702. package/docs/tools/music-generation.md +371 -0
  703. package/docs/tools/ollama-search.md +153 -0
  704. package/docs/tools/pdf.md +195 -0
  705. package/docs/tools/perplexity-search.md +220 -0
  706. package/docs/tools/plugin.md +327 -0
  707. package/docs/tools/reactions.md +100 -0
  708. package/docs/tools/searxng-search.md +141 -0
  709. package/docs/tools/skills-config.md +195 -0
  710. package/docs/tools/skills.md +535 -0
  711. package/docs/tools/slash-commands.md +488 -0
  712. package/docs/tools/steer.md +84 -0
  713. package/docs/tools/subagents.md +650 -0
  714. package/docs/tools/tavily.md +162 -0
  715. package/docs/tools/thinking.md +140 -0
  716. package/docs/tools/tokenjuice.md +81 -0
  717. package/docs/tools/tool-search.md +269 -0
  718. package/docs/tools/trajectory.md +229 -0
  719. package/docs/tools/tts.md +1004 -0
  720. package/docs/tools/video-generation.md +552 -0
  721. package/docs/tools/web-fetch.md +195 -0
  722. package/docs/tools/web.md +459 -0
  723. package/docs/tts.md +11 -0
  724. package/docs/vps.md +139 -0
  725. package/docs/web/control-ui.md +503 -0
  726. package/docs/web/dashboard.md +107 -0
  727. package/docs/web/index.md +133 -0
  728. package/docs/web/tui.md +246 -0
  729. package/docs/web/webchat.md +99 -0
  730. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  731. package/docs/whatsapp-openclaw.jpg +0 -0
  732. package/nodmix.mjs +487 -0
  733. package/package.json +1852 -0
  734. package/patches/.gitkeep +0 -0
  735. package/patches/@agentclientprotocol__claude-agent-acp@0.36.1.patch +41 -0
  736. package/pnpm-workspace.yaml +63 -0
  737. package/scripts/crabbox-wrapper.mjs +353 -0
  738. package/scripts/lib/official-external-channel-catalog.json +559 -0
  739. package/scripts/lib/official-external-plugin-catalog.json +192 -0
  740. package/scripts/lib/official-external-provider-catalog.json +117 -0
  741. package/scripts/lib/package-dist-imports.mjs +171 -0
  742. package/scripts/npm-runner.mjs +91 -0
  743. package/scripts/postinstall-bundled-plugins.mjs +978 -0
  744. package/scripts/preinstall-package-manager-warning.mjs +64 -0
  745. package/scripts/windows-cmd-helpers.mjs +20 -0
  746. package/skills/1password/SKILL.md +70 -0
  747. package/skills/1password/references/cli-examples.md +29 -0
  748. package/skills/1password/references/get-started.md +17 -0
  749. package/skills/apple-notes/SKILL.md +77 -0
  750. package/skills/apple-reminders/SKILL.md +118 -0
  751. package/skills/bear-notes/SKILL.md +107 -0
  752. package/skills/blogwatcher/SKILL.md +69 -0
  753. package/skills/blucli/SKILL.md +47 -0
  754. package/skills/camsnap/SKILL.md +45 -0
  755. package/skills/canvas/SKILL.md +78 -0
  756. package/skills/clawhub/SKILL.md +77 -0
  757. package/skills/coding-agent/SKILL.md +149 -0
  758. package/skills/diagram-maker/SKILL.md +53 -0
  759. package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
  760. package/skills/diagram-maker/references/svg-template.md +112 -0
  761. package/skills/discord/SKILL.md +136 -0
  762. package/skills/eightctl/SKILL.md +50 -0
  763. package/skills/gemini/SKILL.md +47 -0
  764. package/skills/gh-issues/SKILL.md +213 -0
  765. package/skills/gifgrep/SKILL.md +85 -0
  766. package/skills/github/SKILL.md +84 -0
  767. package/skills/gog/SKILL.md +116 -0
  768. package/skills/goplaces/SKILL.md +52 -0
  769. package/skills/healthcheck/SKILL.md +105 -0
  770. package/skills/himalaya/SKILL.md +80 -0
  771. package/skills/himalaya/references/configuration.md +184 -0
  772. package/skills/himalaya/references/message-composition.md +199 -0
  773. package/skills/imsg/SKILL.md +122 -0
  774. package/skills/mcporter/SKILL.md +61 -0
  775. package/skills/meme-maker/SKILL.md +42 -0
  776. package/skills/meme-maker/references/templates.json +358 -0
  777. package/skills/meme-maker/scripts/meme.mjs +398 -0
  778. package/skills/model-usage/SKILL.md +69 -0
  779. package/skills/model-usage/references/codexbar-cli.md +33 -0
  780. package/skills/model-usage/scripts/model_usage.py +319 -0
  781. package/skills/model-usage/scripts/test_model_usage.py +40 -0
  782. package/skills/nano-pdf/SKILL.md +38 -0
  783. package/skills/node-connect/SKILL.md +142 -0
  784. package/skills/node-inspect-debugger/SKILL.md +85 -0
  785. package/skills/notion/SKILL.md +150 -0
  786. package/skills/obsidian/SKILL.md +119 -0
  787. package/skills/openai-whisper/SKILL.md +38 -0
  788. package/skills/openai-whisper-api/SKILL.md +71 -0
  789. package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
  790. package/skills/openhue/SKILL.md +112 -0
  791. package/skills/oracle/SKILL.md +126 -0
  792. package/skills/ordercli/SKILL.md +78 -0
  793. package/skills/peekaboo/SKILL.md +190 -0
  794. package/skills/pyproject.toml +10 -0
  795. package/skills/python-debugpy/SKILL.md +73 -0
  796. package/skills/sag/SKILL.md +87 -0
  797. package/skills/session-logs/SKILL.md +151 -0
  798. package/skills/sherpa-onnx-tts/SKILL.md +109 -0
  799. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  800. package/skills/skill-creator/SKILL.md +78 -0
  801. package/skills/skill-creator/license.txt +202 -0
  802. package/skills/skill-creator/scripts/init_skill.py +378 -0
  803. package/skills/skill-creator/scripts/package_skill.py +139 -0
  804. package/skills/skill-creator/scripts/quick_validate.py +169 -0
  805. package/skills/skill-creator/scripts/test_package_skill.py +161 -0
  806. package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
  807. package/skills/slack/SKILL.md +78 -0
  808. package/skills/songsee/SKILL.md +49 -0
  809. package/skills/sonoscli/SKILL.md +65 -0
  810. package/skills/spike/SKILL.md +51 -0
  811. package/skills/spotify-player/SKILL.md +64 -0
  812. package/skills/summarize/SKILL.md +87 -0
  813. package/skills/taskflow/SKILL.md +149 -0
  814. package/skills/taskflow/examples/inbox-triage.lobster +33 -0
  815. package/skills/taskflow/examples/pr-intake.lobster +32 -0
  816. package/skills/taskflow-inbox-triage/SKILL.md +119 -0
  817. package/skills/things-mac/SKILL.md +86 -0
  818. package/skills/tmux/SKILL.md +91 -0
  819. package/skills/tmux/scripts/find-sessions.sh +112 -0
  820. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  821. package/skills/trello/SKILL.md +108 -0
  822. package/skills/video-frames/SKILL.md +46 -0
  823. package/skills/video-frames/scripts/frame.sh +81 -0
  824. package/skills/voice-call/SKILL.md +45 -0
  825. package/skills/wacli/SKILL.md +72 -0
  826. package/skills/weather/SKILL.md +64 -0
  827. package/skills/xurl/SKILL.md +120 -0
@@ -0,0 +1,978 @@
1
+ #!/usr/bin/env node
2
+ // Runs after install to keep packaged dist safe and compatible.
3
+ // Keep packaged dist safe and compatible. Plugin package dependencies are
4
+ // installed only by explicit plugin install/update flows, never postinstall.
5
+ import { randomUUID } from "node:crypto";
6
+ import {
7
+ chmodSync,
8
+ closeSync,
9
+ existsSync,
10
+ lstatSync,
11
+ openSync,
12
+ readdirSync,
13
+ readFileSync,
14
+ readlinkSync,
15
+ realpathSync,
16
+ renameSync,
17
+ rmdirSync,
18
+ rmSync,
19
+ unlinkSync,
20
+ writeFileSync,
21
+ } from "node:fs";
22
+ import { homedir, tmpdir } from "node:os";
23
+ import { basename, dirname, isAbsolute, join, relative, resolve as pathResolve } from "node:path";
24
+ import { fileURLToPath, pathToFileURL } from "node:url";
25
+ import { expandPackageDistImportClosure } from "./lib/package-dist-imports.mjs";
26
+
27
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
28
+ const DEFAULT_PACKAGE_ROOT = join(scriptDir, "..");
29
+ const DISABLE_POSTINSTALL_ENV = "NODMIX_DISABLE_BUNDLED_PLUGIN_POSTINSTALL";
30
+ const DISABLE_PLUGIN_REGISTRY_MIGRATION_ENV = "NODMIX_DISABLE_PLUGIN_REGISTRY_MIGRATION";
31
+ const DIST_INVENTORY_PATH = "dist/postinstall-inventory.json";
32
+ const LEGACY_PLUGIN_RUNTIME_DEPS_DIR = "plugin-runtime-deps";
33
+ const BAILEYS_MEDIA_FILE = join("node_modules", "baileys", "lib", "Utils", "messages-media.js");
34
+ const BAILEYS_MEDIA_HOTFIX_NEEDLE = [
35
+ " encFileWriteStream.write(mac);",
36
+ " encFileWriteStream.end();",
37
+ " originalFileStream?.end?.();",
38
+ " stream.destroy();",
39
+ " logger?.debug('encrypted data successfully');",
40
+ ].join("\n");
41
+ const BAILEYS_MEDIA_HOTFIX_REPLACEMENT = [
42
+ " encFileWriteStream.write(mac);",
43
+ " const encFinishPromise = once(encFileWriteStream, 'finish');",
44
+ " const originalFinishPromise = originalFileStream ? once(originalFileStream, 'finish') : Promise.resolve();",
45
+ " encFileWriteStream.end();",
46
+ " originalFileStream?.end?.();",
47
+ " stream.destroy();",
48
+ " await Promise.all([encFinishPromise, originalFinishPromise]);",
49
+ " logger?.debug('encrypted data successfully');",
50
+ ].join("\n");
51
+ const BAILEYS_MEDIA_HOTFIX_SEQUENTIAL_REPLACEMENT = [
52
+ " encFileWriteStream.write(mac);",
53
+ " const encFinishPromise = once(encFileWriteStream, 'finish');",
54
+ " const originalFinishPromise = originalFileStream ? once(originalFileStream, 'finish') : Promise.resolve();",
55
+ " encFileWriteStream.end();",
56
+ " originalFileStream?.end?.();",
57
+ " stream.destroy();",
58
+ " await encFinishPromise;",
59
+ " await originalFinishPromise;",
60
+ " logger?.debug('encrypted data successfully');",
61
+ ].join("\n");
62
+ const BAILEYS_MEDIA_HOTFIX_FINISH_PROMISES_RE =
63
+ /const\s+encFinishPromise\s*=\s*once\(encFileWriteStream,\s*'finish'\);\s*\n[\s\S]*const\s+originalFinishPromise\s*=\s*originalFileStream\s*\?\s*once\(originalFileStream,\s*'finish'\)\s*:\s*Promise\.resolve\(\);/u;
64
+ const BAILEYS_MEDIA_HOTFIX_PROMISE_ALL_RE =
65
+ /await\s+Promise\.all\(\[\s*encFinishPromise\s*,\s*originalFinishPromise\s*\]\);/u;
66
+ const BAILEYS_MEDIA_HOTFIX_SEQUENTIAL_AWAITS_RE =
67
+ /await\s+encFinishPromise;\s*(?:\/\/[^\n]*\n|\s)*await\s+originalFinishPromise;/u;
68
+ const BAILEYS_MEDIA_DISPATCHER_NEEDLE = [
69
+ " const response = await fetch(url, {",
70
+ " dispatcher: fetchAgent,",
71
+ " method: 'POST',",
72
+ ].join("\n");
73
+ const BAILEYS_MEDIA_DISPATCHER_REPLACEMENT = [
74
+ " const response = await fetch(url, {",
75
+ " method: 'POST',",
76
+ ].join("\n");
77
+ const BAILEYS_MEDIA_DISPATCHER_HEADER_NEEDLE = [
78
+ " 'Content-Type': 'application/octet-stream',",
79
+ " Origin: DEFAULT_ORIGIN",
80
+ " },",
81
+ ].join("\n");
82
+ const BAILEYS_MEDIA_DISPATCHER_HEADER_REPLACEMENT = [
83
+ " 'Content-Type': 'application/octet-stream',",
84
+ " Origin: DEFAULT_ORIGIN",
85
+ " },",
86
+ " // Baileys passes a generic agent here in some runtimes. Undici's",
87
+ " // `dispatcher` only works with Dispatcher-compatible implementations,",
88
+ " // so only wire it through when the object actually implements",
89
+ " // `dispatch`.",
90
+ " ...(typeof fetchAgent?.dispatch === 'function' ? { dispatcher: fetchAgent } : {}),",
91
+ ].join("\n");
92
+ const BAILEYS_MEDIA_UPLOAD_WITH_FETCH_DISPATCHER_NEEDLE = [
93
+ " const response = await fetch(url, {",
94
+ " dispatcher: agent,",
95
+ " method: 'POST',",
96
+ ].join("\n");
97
+ const BAILEYS_MEDIA_UPLOAD_WITH_FETCH_DISPATCHER_REPLACEMENT = [
98
+ " const response = await fetch(url, {",
99
+ " // Baileys may pass a generic agent in some runtimes. Undici's dispatcher",
100
+ " // option only accepts Dispatcher-compatible implementations, so only wire",
101
+ " // it through when the object actually implements dispatch.",
102
+ " ...(typeof agent?.dispatch === 'function' ? { dispatcher: agent } : {}),",
103
+ " method: 'POST',",
104
+ ].join("\n");
105
+ const BAILEYS_MEDIA_ONCE_IMPORT_RE = /import\s+\{\s*once\s*\}\s+from\s+['"]events['"]/u;
106
+ const BAILEYS_MEDIA_ASYNC_CONTEXT_RE =
107
+ /async\s+function\s+encryptedStream|encryptedStream\s*=\s*async/u;
108
+ const NODE_COMPILE_CACHE_VERSION_DIR_RE = /^v\d+\.\d+\.\d+-/u;
109
+
110
+ function hasEnvFlag(env, key) {
111
+ const value = env?.[key]?.trim().toLowerCase();
112
+ return Boolean(value && value !== "0" && value !== "false" && value !== "no");
113
+ }
114
+
115
+ function normalizeRelativePath(filePath) {
116
+ return filePath.replace(/\\/g, "/");
117
+ }
118
+
119
+ function resolvePostinstallOsHomeDir(env, getHomedir = homedir) {
120
+ return env?.HOME?.trim() || env?.USERPROFILE?.trim() || getHomedir();
121
+ }
122
+
123
+ function resolvePostinstallTildePath(input, homeDir) {
124
+ if (input === "~") {
125
+ return homeDir;
126
+ }
127
+ if (input.startsWith("~/") || input.startsWith("~\\")) {
128
+ return join(homeDir, input.slice(2));
129
+ }
130
+ return input;
131
+ }
132
+
133
+ function resolvePostinstallNodmixHomeDir(env, getHomedir = homedir) {
134
+ const osHome = resolvePostinstallOsHomeDir(env, getHomedir);
135
+ const override = env?.NODMIX_HOME?.trim();
136
+ return override ? pathResolve(resolvePostinstallTildePath(override, osHome)) : osHome;
137
+ }
138
+
139
+ function resolvePostinstallUserPath(input, openClawHome) {
140
+ return pathResolve(resolvePostinstallTildePath(input, openClawHome));
141
+ }
142
+
143
+ function readInstalledDistInventory(params = {}) {
144
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
145
+ const pathExists = params.existsSync ?? existsSync;
146
+ const readFile = params.readFileSync ?? readFileSync;
147
+ const inventoryPath = join(packageRoot, DIST_INVENTORY_PATH);
148
+ if (!pathExists(inventoryPath)) {
149
+ throw new Error(`missing dist inventory: ${DIST_INVENTORY_PATH}`);
150
+ }
151
+ let parsed;
152
+ try {
153
+ parsed = JSON.parse(readFile(inventoryPath, "utf8"));
154
+ } catch {
155
+ throw new Error(`invalid dist inventory: ${DIST_INVENTORY_PATH}`);
156
+ }
157
+ if (!Array.isArray(parsed) || parsed.some((entry) => typeof entry !== "string")) {
158
+ throw new Error(`invalid dist inventory: ${DIST_INVENTORY_PATH}`);
159
+ }
160
+ return new Set(parsed.map(normalizeRelativePath));
161
+ }
162
+
163
+ function isRecoverableInstalledDistInventoryError(error) {
164
+ return error instanceof Error && /^(missing|invalid) dist inventory: /u.test(error.message);
165
+ }
166
+
167
+ function resolveInstalledDistRoot(params = {}) {
168
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
169
+ const pathExists = params.existsSync ?? existsSync;
170
+ const pathLstat = params.lstatSync ?? lstatSync;
171
+ const resolveRealPath = params.realpathSync ?? realpathSync;
172
+ const distDir = join(packageRoot, "dist");
173
+ if (!pathExists(distDir)) {
174
+ return null;
175
+ }
176
+ const distStats = pathLstat(distDir);
177
+ if (!distStats.isDirectory() || distStats.isSymbolicLink()) {
178
+ throw new Error("unsafe dist root: dist must be a real directory");
179
+ }
180
+ const packageRootReal = resolveRealPath(packageRoot);
181
+ const distDirReal = resolveRealPath(distDir);
182
+ const relativeDistPath = relative(packageRootReal, distDirReal);
183
+ if (relativeDistPath !== "dist") {
184
+ throw new Error("unsafe dist root: dist escaped package root");
185
+ }
186
+ return { distDir, distDirReal, packageRootReal };
187
+ }
188
+
189
+ function assertSafeInstalledDistPath(relativePath, params) {
190
+ const resolveRealPath = params.realpathSync ?? realpathSync;
191
+ const candidatePath = join(params.packageRoot, relativePath);
192
+ const candidateRealPath = resolveRealPath(candidatePath);
193
+ const relativeCandidatePath = relative(params.distDirReal, candidateRealPath);
194
+ if (relativeCandidatePath.startsWith("..") || isAbsolute(relativeCandidatePath)) {
195
+ throw new Error(`unsafe dist path: ${relativePath}`);
196
+ }
197
+ return candidatePath;
198
+ }
199
+
200
+ function listInstalledDistFiles(params = {}) {
201
+ const readDir = params.readdirSync ?? readdirSync;
202
+ const distRoot = resolveInstalledDistRoot(params);
203
+ if (distRoot === null) {
204
+ return [];
205
+ }
206
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
207
+ const pending = [distRoot.distDir];
208
+ const files = [];
209
+ while (pending.length > 0) {
210
+ const currentDir = pending.pop();
211
+ if (!currentDir) {
212
+ continue;
213
+ }
214
+ for (const entry of readDir(currentDir, { withFileTypes: true })) {
215
+ const entryPath = join(currentDir, entry.name);
216
+ if (entry.isSymbolicLink()) {
217
+ throw new Error(
218
+ `unsafe dist entry: ${normalizeRelativePath(relative(packageRoot, entryPath))}`,
219
+ );
220
+ }
221
+ if (entry.isDirectory()) {
222
+ pending.push(entryPath);
223
+ continue;
224
+ }
225
+ if (!entry.isFile()) {
226
+ continue;
227
+ }
228
+ const relativePath = normalizeRelativePath(relative(packageRoot, entryPath));
229
+ if (relativePath === DIST_INVENTORY_PATH) {
230
+ continue;
231
+ }
232
+ files.push(relativePath);
233
+ }
234
+ }
235
+ return files.toSorted((left, right) => left.localeCompare(right));
236
+ }
237
+
238
+ function pruneEmptyDistDirectories(params = {}) {
239
+ const readDir = params.readdirSync ?? readdirSync;
240
+ const removeDirectory = params.rmdirSync ?? rmdirSync;
241
+ const distRoot = resolveInstalledDistRoot(params);
242
+ if (distRoot === null) {
243
+ return;
244
+ }
245
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
246
+ const pathLstat = params.lstatSync ?? lstatSync;
247
+
248
+ function prune(currentDir) {
249
+ for (const entry of readDir(currentDir, { withFileTypes: true })) {
250
+ if (entry.isSymbolicLink()) {
251
+ throw new Error(
252
+ `unsafe dist entry: ${normalizeRelativePath(relative(packageRoot, join(currentDir, entry.name)))}`,
253
+ );
254
+ }
255
+ if (!entry.isDirectory()) {
256
+ continue;
257
+ }
258
+ prune(join(currentDir, entry.name));
259
+ }
260
+ if (currentDir === distRoot.distDir) {
261
+ return;
262
+ }
263
+ const currentStats = pathLstat(currentDir);
264
+ if (!currentStats.isDirectory() || currentStats.isSymbolicLink()) {
265
+ throw new Error(
266
+ `unsafe dist directory: ${normalizeRelativePath(relative(packageRoot, currentDir))}`,
267
+ );
268
+ }
269
+ if (readDir(currentDir).length === 0) {
270
+ removeDirectory(
271
+ assertSafeInstalledDistPath(normalizeRelativePath(relative(packageRoot, currentDir)), {
272
+ packageRoot,
273
+ distDirReal: distRoot.distDirReal,
274
+ realpathSync: params.realpathSync,
275
+ }),
276
+ );
277
+ }
278
+ }
279
+
280
+ prune(distRoot.distDir);
281
+ }
282
+
283
+ function isLegacyInstalledPluginDependencyDirName(name) {
284
+ return name === "node_modules" || /^\.nodmix-install-stage(?:-[^/]+)?$/iu.test(name);
285
+ }
286
+
287
+ function pruneLegacyInstalledPluginDependencyDirs(params) {
288
+ const readDir = params.readdirSync ?? readdirSync;
289
+ const removePath = params.rmSync ?? rmSync;
290
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
291
+ const extensionsDir = join(packageRoot, "dist", "extensions");
292
+ const removed = [];
293
+ let pluginEntries;
294
+ try {
295
+ pluginEntries = readDir(extensionsDir, { withFileTypes: true });
296
+ } catch {
297
+ return removed;
298
+ }
299
+
300
+ for (const pluginEntry of pluginEntries) {
301
+ if (!pluginEntry.isDirectory() || pluginEntry.isSymbolicLink()) {
302
+ continue;
303
+ }
304
+ const pluginDir = join(extensionsDir, pluginEntry.name);
305
+ let pluginChildren;
306
+ try {
307
+ pluginChildren = readDir(pluginDir, { withFileTypes: true });
308
+ } catch {
309
+ continue;
310
+ }
311
+ for (const childEntry of pluginChildren) {
312
+ if (!isLegacyInstalledPluginDependencyDirName(childEntry.name)) {
313
+ continue;
314
+ }
315
+ const safePluginDir = assertSafeInstalledDistPath(
316
+ normalizeRelativePath(relative(packageRoot, pluginDir)),
317
+ {
318
+ packageRoot,
319
+ distDirReal: params.distDirReal,
320
+ realpathSync: params.realpathSync,
321
+ },
322
+ );
323
+ const relativePath = normalizeRelativePath(
324
+ relative(packageRoot, join(pluginDir, childEntry.name)),
325
+ );
326
+ removePath(join(safePluginDir, childEntry.name), { recursive: true, force: true });
327
+ removed.push(relativePath);
328
+ }
329
+ }
330
+
331
+ return removed;
332
+ }
333
+
334
+ function splitPostinstallPathList(value) {
335
+ return value
336
+ ? value
337
+ .split(pathDelimiter)
338
+ .map((entry) => entry.trim())
339
+ .filter(Boolean)
340
+ : [];
341
+ }
342
+
343
+ const pathDelimiter = process.platform === "win32" ? ";" : ":";
344
+
345
+ export function collectLegacyPluginRuntimeDepsStateRoots(params = {}) {
346
+ const env = params.env ?? process.env;
347
+ const getHomedir = params.homedir ?? homedir;
348
+ const openClawHome = resolvePostinstallNodmixHomeDir(env, getHomedir);
349
+ const stateRoots = [];
350
+ const addStateRoot = (root) => {
351
+ if (root) {
352
+ stateRoots.push(join(root, LEGACY_PLUGIN_RUNTIME_DEPS_DIR));
353
+ }
354
+ };
355
+
356
+ const stateOverride = env?.NODMIX_STATE_DIR?.trim();
357
+ if (stateOverride) {
358
+ addStateRoot(resolvePostinstallUserPath(stateOverride, openClawHome));
359
+ }
360
+ const configPath = env?.NODMIX_CONFIG_PATH?.trim();
361
+ if (configPath) {
362
+ addStateRoot(dirname(resolvePostinstallUserPath(configPath, openClawHome)));
363
+ }
364
+ addStateRoot(join(openClawHome, ".nodmix"));
365
+ addStateRoot(join(openClawHome, ".clawdbot"));
366
+
367
+ for (const entry of splitPostinstallPathList(env?.STATE_DIRECTORY)) {
368
+ addStateRoot(resolvePostinstallUserPath(entry, openClawHome));
369
+ }
370
+
371
+ return [...new Set(stateRoots.map((root) => pathResolve(root)))].toSorted((left, right) =>
372
+ left.localeCompare(right),
373
+ );
374
+ }
375
+
376
+ function isPathInsideRoot(candidate, root) {
377
+ const relativePath = relative(root, candidate);
378
+ return relativePath === "" || (!relativePath.startsWith("..") && !isAbsolute(relativePath));
379
+ }
380
+
381
+ function collectLegacyPluginRuntimeDepsSymlinkPaths(roots, params = {}) {
382
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
383
+ const readDir = params.readdirSync ?? readdirSync;
384
+ const pathLstat = params.lstatSync ?? lstatSync;
385
+ const readLink = params.readlinkSync ?? readlinkSync;
386
+ const pathExists = params.existsSync ?? existsSync;
387
+ const containingNodeModules = dirname(packageRoot);
388
+ if (basename(containingNodeModules) !== "node_modules") {
389
+ return [];
390
+ }
391
+
392
+ const normalizedRoots = roots.map((root) => pathResolve(root));
393
+ const candidates = [];
394
+ function addCandidate(linkPath) {
395
+ let linkStat;
396
+ try {
397
+ linkStat = pathLstat(linkPath);
398
+ } catch {
399
+ return;
400
+ }
401
+ if (!linkStat.isSymbolicLink()) {
402
+ return;
403
+ }
404
+ let target;
405
+ try {
406
+ target = readLink(linkPath);
407
+ } catch {
408
+ return;
409
+ }
410
+ if (!target.includes(LEGACY_PLUGIN_RUNTIME_DEPS_DIR)) {
411
+ return;
412
+ }
413
+ const resolvedTarget = pathResolve(dirname(linkPath), target);
414
+ const pointsIntoPrunedRoot = normalizedRoots.some((root) =>
415
+ isPathInsideRoot(resolvedTarget, root),
416
+ );
417
+ if (pointsIntoPrunedRoot || !pathExists(resolvedTarget)) {
418
+ candidates.push(linkPath);
419
+ }
420
+ }
421
+
422
+ let entries;
423
+ try {
424
+ entries = readDir(containingNodeModules, { withFileTypes: true });
425
+ } catch {
426
+ return [];
427
+ }
428
+ for (const entry of entries) {
429
+ if (entry.isDirectory() && entry.name.startsWith("@")) {
430
+ const scopeDir = join(containingNodeModules, entry.name);
431
+ let scopeEntries;
432
+ try {
433
+ scopeEntries = readDir(scopeDir, { withFileTypes: true });
434
+ } catch {
435
+ continue;
436
+ }
437
+ for (const scopeEntry of scopeEntries) {
438
+ addCandidate(join(scopeDir, scopeEntry.name));
439
+ }
440
+ continue;
441
+ }
442
+ if (entry.isSymbolicLink()) {
443
+ addCandidate(join(containingNodeModules, entry.name));
444
+ }
445
+ }
446
+ return [...new Set(candidates.map((entry) => pathResolve(entry)))].toSorted((left, right) =>
447
+ left.localeCompare(right),
448
+ );
449
+ }
450
+
451
+ export function pruneLegacyPluginRuntimeDepsState(params = {}) {
452
+ const pathExists = params.existsSync ?? existsSync;
453
+ const removePath = params.rmSync ?? rmSync;
454
+ const unlinkPath = params.unlinkSync ?? unlinkSync;
455
+ const log = params.log ?? console;
456
+ const removed = [];
457
+ const removedSymlinks = [];
458
+ const roots = collectLegacyPluginRuntimeDepsStateRoots(params);
459
+
460
+ for (const linkPath of collectLegacyPluginRuntimeDepsSymlinkPaths(roots, params)) {
461
+ try {
462
+ unlinkPath(linkPath);
463
+ removedSymlinks.push(linkPath);
464
+ } catch (error) {
465
+ log.warn?.(
466
+ `[postinstall] could not prune legacy plugin runtime deps symlink ${linkPath}: ${String(error)}`,
467
+ );
468
+ }
469
+ }
470
+
471
+ for (const root of roots) {
472
+ if (!pathExists(root)) {
473
+ continue;
474
+ }
475
+ try {
476
+ removePath(root, { recursive: true, force: true, maxRetries: 2, retryDelay: 100 });
477
+ removed.push(root);
478
+ } catch (error) {
479
+ log.warn?.(
480
+ `[postinstall] could not prune legacy plugin runtime deps ${root}: ${String(error)}`,
481
+ );
482
+ }
483
+ }
484
+
485
+ if (removed.length > 0) {
486
+ log.log?.(`[postinstall] pruned legacy plugin runtime deps: ${removed.join(", ")}`);
487
+ }
488
+ if (removedSymlinks.length > 0) {
489
+ log.log?.(
490
+ `[postinstall] pruned legacy plugin runtime deps symlinks: ${removedSymlinks.join(", ")}`,
491
+ );
492
+ }
493
+
494
+ return removed;
495
+ }
496
+
497
+ export function pruneInstalledPackageDist(params = {}) {
498
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
499
+ const removeFile = params.unlinkSync ?? unlinkSync;
500
+ const log = params.log ?? console;
501
+ const distRoot = resolveInstalledDistRoot(params);
502
+ if (distRoot === null) {
503
+ return [];
504
+ }
505
+ const removedLegacyDependencyDirs = pruneLegacyInstalledPluginDependencyDirs({
506
+ packageRoot,
507
+ distDirReal: distRoot.distDirReal,
508
+ realpathSync: params.realpathSync,
509
+ readdirSync: params.readdirSync,
510
+ rmSync: params.rmSync,
511
+ });
512
+ let expectedFiles = params.expectedFiles ?? null;
513
+ if (expectedFiles === null) {
514
+ try {
515
+ expectedFiles = readInstalledDistInventory(params);
516
+ } catch (error) {
517
+ if (!isRecoverableInstalledDistInventoryError(error)) {
518
+ throw error;
519
+ }
520
+ log.warn?.(`[postinstall] skipping dist prune: ${error.message}`);
521
+ return [];
522
+ }
523
+ }
524
+ const installedFiles = listInstalledDistFiles(params);
525
+ const readFile = params.readFileSync ?? readFileSync;
526
+ expectedFiles = new Set(
527
+ expandPackageDistImportClosure({
528
+ files: installedFiles,
529
+ seedFiles: [...expectedFiles],
530
+ readText(relativePath) {
531
+ try {
532
+ return readFile(join(packageRoot, relativePath), "utf8");
533
+ } catch (error) {
534
+ if (error?.code === "ENOENT") {
535
+ return "";
536
+ }
537
+ throw error;
538
+ }
539
+ },
540
+ }),
541
+ );
542
+ const removed = [];
543
+
544
+ for (const relativePath of installedFiles) {
545
+ if (expectedFiles.has(relativePath)) {
546
+ continue;
547
+ }
548
+ removeFile(
549
+ assertSafeInstalledDistPath(relativePath, {
550
+ packageRoot,
551
+ distDirReal: distRoot.distDirReal,
552
+ realpathSync: params.realpathSync,
553
+ }),
554
+ );
555
+ removed.push(relativePath);
556
+ }
557
+
558
+ pruneEmptyDistDirectories(params);
559
+
560
+ if (removed.length > 0) {
561
+ log.log(`[postinstall] pruned stale dist files: ${removed.join(", ")}`);
562
+ }
563
+ if (removedLegacyDependencyDirs.length > 0) {
564
+ log.log(
565
+ `[postinstall] pruned legacy plugin dependency dirs: ${removedLegacyDependencyDirs.join(", ")}`,
566
+ );
567
+ }
568
+ return removed;
569
+ }
570
+
571
+ export function applyBaileysEncryptedStreamFinishHotfix(params = {}) {
572
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
573
+ const pathExists = params.existsSync ?? existsSync;
574
+ const pathLstat = params.lstatSync ?? lstatSync;
575
+ const readFile = params.readFileSync ?? readFileSync;
576
+ const resolveRealPath = params.realpathSync ?? realpathSync;
577
+ const chmodFile = params.chmodSync ?? chmodSync;
578
+ const openFile = params.openSync ?? openSync;
579
+ const closeFile = params.closeSync ?? closeSync;
580
+ const renameFile = params.renameSync ?? renameSync;
581
+ const removePath = params.rmSync ?? rmSync;
582
+ const createTempPath =
583
+ params.createTempPath ??
584
+ ((unsafeTargetPath) =>
585
+ join(
586
+ dirname(unsafeTargetPath),
587
+ `.${basename(unsafeTargetPath)}.nodmix-hotfix-${randomUUID()}`,
588
+ ));
589
+ const writeFile =
590
+ params.writeFileSync ?? ((filePath, value) => writeFileSync(filePath, value, "utf8"));
591
+ const targetPath = join(packageRoot, BAILEYS_MEDIA_FILE);
592
+ const nodeModulesRoot = join(packageRoot, "node_modules");
593
+
594
+ function validateTargetPath() {
595
+ if (!pathExists(targetPath)) {
596
+ return { ok: false, reason: "missing" };
597
+ }
598
+
599
+ const targetStats = pathLstat(targetPath);
600
+ if (!targetStats.isFile() || targetStats.isSymbolicLink()) {
601
+ return { ok: false, reason: "unsafe_target", targetPath };
602
+ }
603
+
604
+ const nodeModulesRootReal = resolveRealPath(nodeModulesRoot);
605
+ const targetPathReal = resolveRealPath(targetPath);
606
+ const relativeTargetPath = relative(nodeModulesRootReal, targetPathReal);
607
+ if (relativeTargetPath.startsWith("..") || isAbsolute(relativeTargetPath)) {
608
+ return { ok: false, reason: "path_escape", targetPath };
609
+ }
610
+
611
+ return { ok: true, targetPathReal, mode: targetStats.mode & 0o777 };
612
+ }
613
+
614
+ try {
615
+ const initialTargetValidation = validateTargetPath();
616
+ if (!initialTargetValidation.ok) {
617
+ return { applied: false, reason: initialTargetValidation.reason, targetPath };
618
+ }
619
+
620
+ const currentText = readFile(targetPath, "utf8");
621
+ let patchedText = currentText;
622
+ let applied = false;
623
+
624
+ const encryptedStreamAlreadyPatched =
625
+ patchedText.includes(BAILEYS_MEDIA_HOTFIX_REPLACEMENT) ||
626
+ patchedText.includes(BAILEYS_MEDIA_HOTFIX_SEQUENTIAL_REPLACEMENT) ||
627
+ (BAILEYS_MEDIA_HOTFIX_FINISH_PROMISES_RE.test(patchedText) &&
628
+ (BAILEYS_MEDIA_HOTFIX_PROMISE_ALL_RE.test(patchedText) ||
629
+ BAILEYS_MEDIA_HOTFIX_SEQUENTIAL_AWAITS_RE.test(patchedText)));
630
+ const encryptedStreamPatchable = patchedText.includes(BAILEYS_MEDIA_HOTFIX_NEEDLE);
631
+
632
+ let encryptedStreamResolved = encryptedStreamAlreadyPatched;
633
+ if (!encryptedStreamResolved && encryptedStreamPatchable) {
634
+ if (!BAILEYS_MEDIA_ONCE_IMPORT_RE.test(patchedText)) {
635
+ return { applied: false, reason: "missing_once_import", targetPath };
636
+ }
637
+ if (!BAILEYS_MEDIA_ASYNC_CONTEXT_RE.test(patchedText)) {
638
+ return { applied: false, reason: "not_async_context", targetPath };
639
+ }
640
+ patchedText = patchedText.replace(
641
+ BAILEYS_MEDIA_HOTFIX_NEEDLE,
642
+ BAILEYS_MEDIA_HOTFIX_REPLACEMENT,
643
+ );
644
+ applied = true;
645
+ encryptedStreamResolved = true;
646
+ }
647
+
648
+ const dispatcherAlreadyPatched =
649
+ patchedText.includes(
650
+ "...(typeof fetchAgent?.dispatch === 'function' ? { dispatcher: fetchAgent } : {}),",
651
+ ) ||
652
+ patchedText.includes(
653
+ "...(typeof agent?.dispatch === 'function' ? { dispatcher: agent } : {}),",
654
+ ) ||
655
+ (patchedText.includes(
656
+ "const dispatcher = typeof agent?.dispatch === 'function' ? agent : undefined;",
657
+ ) &&
658
+ patchedText.includes("...(dispatcher ? { dispatcher } : {}),"));
659
+ const legacyDispatcherPatchable =
660
+ patchedText.includes(BAILEYS_MEDIA_DISPATCHER_NEEDLE) &&
661
+ patchedText.includes(BAILEYS_MEDIA_DISPATCHER_HEADER_NEEDLE);
662
+ const uploadWithFetchDispatcherPatchable = patchedText.includes(
663
+ BAILEYS_MEDIA_UPLOAD_WITH_FETCH_DISPATCHER_NEEDLE,
664
+ );
665
+ let dispatcherResolved = dispatcherAlreadyPatched;
666
+
667
+ if (!dispatcherResolved && legacyDispatcherPatchable) {
668
+ patchedText = patchedText
669
+ .replace(BAILEYS_MEDIA_DISPATCHER_NEEDLE, BAILEYS_MEDIA_DISPATCHER_REPLACEMENT)
670
+ .replace(
671
+ BAILEYS_MEDIA_DISPATCHER_HEADER_NEEDLE,
672
+ BAILEYS_MEDIA_DISPATCHER_HEADER_REPLACEMENT,
673
+ );
674
+ applied = true;
675
+ dispatcherResolved = true;
676
+ }
677
+
678
+ if (!dispatcherResolved && uploadWithFetchDispatcherPatchable) {
679
+ patchedText = patchedText.replace(
680
+ BAILEYS_MEDIA_UPLOAD_WITH_FETCH_DISPATCHER_NEEDLE,
681
+ BAILEYS_MEDIA_UPLOAD_WITH_FETCH_DISPATCHER_REPLACEMENT,
682
+ );
683
+ applied = true;
684
+ dispatcherResolved = true;
685
+ }
686
+
687
+ if (!dispatcherResolved) {
688
+ return { applied: false, reason: "unexpected_content", targetPath };
689
+ }
690
+
691
+ if (!applied) {
692
+ return { applied: false, reason: "already_patched" };
693
+ }
694
+ const tempPath = createTempPath(targetPath);
695
+ const tempFd = openFile(tempPath, "wx", initialTargetValidation.mode);
696
+ let tempFdClosed = false;
697
+ try {
698
+ writeFile(tempFd, patchedText, "utf8");
699
+ closeFile(tempFd);
700
+ tempFdClosed = true;
701
+ const finalTargetValidation = validateTargetPath();
702
+ if (!finalTargetValidation.ok) {
703
+ return { applied: false, reason: finalTargetValidation.reason, targetPath };
704
+ }
705
+ renameFile(tempPath, targetPath);
706
+ chmodFile(targetPath, initialTargetValidation.mode);
707
+ } finally {
708
+ if (!tempFdClosed) {
709
+ try {
710
+ closeFile(tempFd);
711
+ } catch {
712
+ // ignore failed-open cleanup
713
+ }
714
+ }
715
+ removePath(tempPath, { force: true });
716
+ }
717
+ return { applied: true, reason: "patched", targetPath };
718
+ } catch (error) {
719
+ return {
720
+ applied: false,
721
+ reason: "error",
722
+ targetPath,
723
+ error: error instanceof Error ? error.message : String(error),
724
+ };
725
+ }
726
+ }
727
+
728
+ function applyBundledPluginRuntimeHotfixes(params = {}) {
729
+ const log = params.log ?? console;
730
+ const baileysResult = applyBaileysEncryptedStreamFinishHotfix(params);
731
+ if (baileysResult.applied) {
732
+ log.log("[postinstall] patched baileys runtime hotfixes");
733
+ return;
734
+ }
735
+ if (baileysResult.reason !== "missing" && baileysResult.reason !== "already_patched") {
736
+ log.warn(`[postinstall] could not patch baileys runtime hotfixes: ${baileysResult.reason}`);
737
+ }
738
+ }
739
+
740
+ function resolveDistModuleUrl(packageRoot, distPath) {
741
+ return pathToFileURL(join(packageRoot, distPath)).href;
742
+ }
743
+
744
+ async function importInstalledDistModule(params, distPath) {
745
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
746
+ const pathExists = params.existsSync ?? existsSync;
747
+ const modulePath = join(packageRoot, distPath);
748
+ if (!pathExists(modulePath)) {
749
+ return null;
750
+ }
751
+ const importModule = params.importModule ?? ((specifier) => import(specifier));
752
+ return await importModule(resolveDistModuleUrl(packageRoot, distPath));
753
+ }
754
+
755
+ export async function runPluginRegistryPostinstallMigration(params = {}) {
756
+ const log = params.log ?? console;
757
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
758
+ const env = params.env ?? process.env;
759
+
760
+ if (hasEnvFlag(env, DISABLE_PLUGIN_REGISTRY_MIGRATION_ENV)) {
761
+ return { status: "disabled", migrated: false, reason: "disabled-env" };
762
+ }
763
+
764
+ try {
765
+ const migrationModule = await importInstalledDistModule(
766
+ params,
767
+ "dist/commands/doctor/shared/plugin-registry-migration.js",
768
+ );
769
+ if (!migrationModule) {
770
+ return { status: "skipped", reason: "missing-dist-entry" };
771
+ }
772
+ if (typeof migrationModule.migratePluginRegistryForInstall !== "function") {
773
+ return { status: "skipped", reason: "missing-dist-contract" };
774
+ }
775
+
776
+ const result = await migrationModule.migratePluginRegistryForInstall({
777
+ env,
778
+ packageRoot,
779
+ });
780
+ for (const warning of result.preflight?.deprecationWarnings ?? []) {
781
+ log.warn(`[postinstall] ${warning}`);
782
+ }
783
+ if (result.migrated) {
784
+ log.log(
785
+ `[postinstall] migrated plugin registry: ${result.current.plugins.length} plugin(s) indexed`,
786
+ );
787
+ }
788
+ return result;
789
+ } catch (error) {
790
+ const message = error instanceof Error ? error.message : String(error);
791
+ log.warn(`[postinstall] could not migrate plugin registry: ${message}`);
792
+ return { status: "failed", error: message };
793
+ }
794
+ }
795
+
796
+ export function isSourceCheckoutRoot(params) {
797
+ const pathExists = params.existsSync ?? existsSync;
798
+ const hasPostinstallInventory = pathExists(join(params.packageRoot, DIST_INVENTORY_PATH));
799
+ return (
800
+ (pathExists(join(params.packageRoot, ".git")) ||
801
+ (pathExists(join(params.packageRoot, "pnpm-workspace.yaml")) && !hasPostinstallInventory)) &&
802
+ pathExists(join(params.packageRoot, "src")) &&
803
+ pathExists(join(params.packageRoot, "extensions"))
804
+ );
805
+ }
806
+
807
+ export function pruneBundledPluginSourceNodeModules(params = {}) {
808
+ const extensionsDir = params.extensionsDir ?? join(DEFAULT_PACKAGE_ROOT, "extensions");
809
+ const pathExists = params.existsSync ?? existsSync;
810
+ const readDir = params.readdirSync ?? readdirSync;
811
+ const removePath = params.rmSync ?? rmSync;
812
+
813
+ if (!pathExists(extensionsDir)) {
814
+ return;
815
+ }
816
+
817
+ for (const entry of readDir(extensionsDir, { withFileTypes: true })) {
818
+ if (!entry.isDirectory() || entry.isSymbolicLink()) {
819
+ continue;
820
+ }
821
+
822
+ const pluginDir = join(extensionsDir, entry.name);
823
+ if (!pathExists(join(pluginDir, "package.json"))) {
824
+ continue;
825
+ }
826
+
827
+ removePath(join(pluginDir, "node_modules"), { recursive: true, force: true });
828
+ }
829
+ }
830
+
831
+ function shouldRunBundledPluginPostinstall(params) {
832
+ if (params.env?.[DISABLE_POSTINSTALL_ENV]?.trim()) {
833
+ return false;
834
+ }
835
+ if (!params.existsSync(params.extensionsDir)) {
836
+ return false;
837
+ }
838
+ return true;
839
+ }
840
+
841
+ function isCompileCachePrunePermissionDenied(error) {
842
+ return error?.code === "EACCES" || error?.code === "EPERM";
843
+ }
844
+
845
+ export function pruneNodmixCompileCache(params = {}) {
846
+ const env = params.env ?? process.env;
847
+ const pathExists = params.existsSync ?? existsSync;
848
+ const readDir = params.readdirSync ?? readdirSync;
849
+ const remove = params.rmSync ?? rmSync;
850
+ const log = params.log ?? console;
851
+ const baseDirs = [
852
+ env.NODE_DISABLE_COMPILE_CACHE ? "" : env.NODE_COMPILE_CACHE,
853
+ join(tmpdir(), "node-compile-cache"),
854
+ ].filter((value, index, values) => value && values.indexOf(value) === index);
855
+
856
+ for (const baseDir of baseDirs) {
857
+ if (!pathExists(baseDir)) {
858
+ continue;
859
+ }
860
+ try {
861
+ for (const entry of readDir(baseDir, { withFileTypes: true })) {
862
+ if (!entry.isDirectory() || !NODE_COMPILE_CACHE_VERSION_DIR_RE.test(entry.name)) {
863
+ continue;
864
+ }
865
+ try {
866
+ remove(join(baseDir, entry.name), {
867
+ recursive: true,
868
+ force: true,
869
+ maxRetries: 2,
870
+ retryDelay: 100,
871
+ });
872
+ } catch (error) {
873
+ if (isCompileCachePrunePermissionDenied(error)) {
874
+ continue;
875
+ }
876
+ log.warn?.(`[postinstall] could not prune Nodmix compile cache: ${String(error)}`);
877
+ }
878
+ }
879
+ } catch (error) {
880
+ if (isCompileCachePrunePermissionDenied(error)) {
881
+ continue;
882
+ }
883
+ log.warn?.(`[postinstall] could not prune Nodmix compile cache: ${String(error)}`);
884
+ }
885
+ }
886
+ }
887
+
888
+ export function runBundledPluginPostinstall(params = {}) {
889
+ const env = params.env ?? process.env;
890
+ const packageRoot = params.packageRoot ?? DEFAULT_PACKAGE_ROOT;
891
+ const extensionsDir = params.extensionsDir ?? join(packageRoot, "dist", "extensions");
892
+ const pathExists = params.existsSync ?? existsSync;
893
+ const log = params.log ?? console;
894
+ if (env?.[DISABLE_POSTINSTALL_ENV]?.trim()) {
895
+ return;
896
+ }
897
+ pruneNodmixCompileCache({
898
+ env,
899
+ existsSync: pathExists,
900
+ rmSync: params.rmSync,
901
+ log,
902
+ });
903
+ if (isSourceCheckoutRoot({ packageRoot, existsSync: pathExists })) {
904
+ try {
905
+ pruneBundledPluginSourceNodeModules({
906
+ extensionsDir: join(packageRoot, "extensions"),
907
+ existsSync: pathExists,
908
+ readdirSync: params.readdirSync,
909
+ rmSync: params.rmSync,
910
+ });
911
+ } catch (e) {
912
+ log.warn(`[postinstall] could not prune bundled plugin source node_modules: ${String(e)}`);
913
+ }
914
+ applyBundledPluginRuntimeHotfixes({
915
+ packageRoot,
916
+ existsSync: pathExists,
917
+ readFileSync: params.readFileSync,
918
+ writeFileSync: params.writeFileSync,
919
+ log,
920
+ });
921
+ return;
922
+ }
923
+ pruneLegacyPluginRuntimeDepsState({
924
+ env,
925
+ packageRoot,
926
+ existsSync: pathExists,
927
+ lstatSync: params.lstatSync,
928
+ readlinkSync: params.readlinkSync,
929
+ rmSync: params.rmSync,
930
+ unlinkSync: params.unlinkSync,
931
+ log,
932
+ homedir: params.homedir,
933
+ });
934
+ pruneInstalledPackageDist({
935
+ packageRoot,
936
+ existsSync: pathExists,
937
+ readFileSync: params.readFileSync,
938
+ readdirSync: params.readdirSync,
939
+ rmSync: params.rmSync,
940
+ log,
941
+ });
942
+ if (
943
+ !shouldRunBundledPluginPostinstall({
944
+ env,
945
+ extensionsDir,
946
+ packageRoot,
947
+ existsSync: pathExists,
948
+ })
949
+ ) {
950
+ return;
951
+ }
952
+ applyBundledPluginRuntimeHotfixes({
953
+ packageRoot,
954
+ existsSync: pathExists,
955
+ readFileSync: params.readFileSync,
956
+ writeFileSync: params.writeFileSync,
957
+ log,
958
+ });
959
+ }
960
+
961
+ export function isDirectPostinstallInvocation(params = {}) {
962
+ const entryPath = params.entryPath ?? process.argv[1];
963
+ if (!entryPath) {
964
+ return false;
965
+ }
966
+ const modulePath = params.modulePath ?? fileURLToPath(import.meta.url);
967
+ const resolveRealPath = params.realpathSync ?? realpathSync;
968
+ try {
969
+ return resolveRealPath(entryPath) === resolveRealPath(modulePath);
970
+ } catch {
971
+ return pathToFileURL(entryPath).href === pathToFileURL(modulePath).href;
972
+ }
973
+ }
974
+
975
+ if (isDirectPostinstallInvocation()) {
976
+ runBundledPluginPostinstall();
977
+ await runPluginRegistryPostinstallMigration();
978
+ }