durar-ai 2026.4.4

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 (571) hide show
  1. package/CHANGELOG.md +5497 -0
  2. package/LICENSE +21 -0
  3. package/README.md +614 -0
  4. package/assets/avatar-placeholder.svg +19 -0
  5. package/assets/chrome-extension/icons/icon128.png +0 -0
  6. package/assets/chrome-extension/icons/icon16.png +0 -0
  7. package/assets/chrome-extension/icons/icon32.png +0 -0
  8. package/assets/chrome-extension/icons/icon48.png +0 -0
  9. package/assets/dmg-background-small.png +0 -0
  10. package/assets/dmg-background.png +0 -0
  11. package/docs/.i18n/README.md +72 -0
  12. package/docs/.i18n/ar-navigation.json +18 -0
  13. package/docs/.i18n/de-navigation.json +18 -0
  14. package/docs/.i18n/es-navigation.json +18 -0
  15. package/docs/.i18n/fr-navigation.json +18 -0
  16. package/docs/.i18n/glossary.ar.json +5 -0
  17. package/docs/.i18n/glossary.de.json +5 -0
  18. package/docs/.i18n/glossary.es.json +5 -0
  19. package/docs/.i18n/glossary.fr.json +5 -0
  20. package/docs/.i18n/glossary.id.json +5 -0
  21. package/docs/.i18n/glossary.it.json +5 -0
  22. package/docs/.i18n/glossary.ja-JP.json +14 -0
  23. package/docs/.i18n/glossary.ko.json +5 -0
  24. package/docs/.i18n/glossary.pl.json +5 -0
  25. package/docs/.i18n/glossary.pt-BR.json +5 -0
  26. package/docs/.i18n/glossary.tr.json +5 -0
  27. package/docs/.i18n/glossary.zh-CN.json +358 -0
  28. package/docs/.i18n/id-navigation.json +18 -0
  29. package/docs/.i18n/it-navigation.json +18 -0
  30. package/docs/.i18n/ja-navigation.json +18 -0
  31. package/docs/.i18n/ko-navigation.json +18 -0
  32. package/docs/.i18n/pl-navigation.json +18 -0
  33. package/docs/.i18n/pt-BR-navigation.json +18 -0
  34. package/docs/.i18n/tr-navigation.json +18 -0
  35. package/docs/.i18n/zh-Hans-navigation.json +544 -0
  36. package/docs/assets/install-script.svg +1 -0
  37. package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
  38. package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
  39. package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
  40. package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
  41. package/docs/assets/macos-onboarding/05-permissions.png +0 -0
  42. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  43. package/docs/assets/openclaw-logo-text-dark.svg +418 -0
  44. package/docs/assets/openclaw-logo-text.png +0 -0
  45. package/docs/assets/openclaw-logo-text.svg +418 -0
  46. package/docs/assets/pixel-lobster.svg +60 -0
  47. package/docs/assets/showcase/agents-ui.jpg +0 -0
  48. package/docs/assets/showcase/bambu-cli.png +0 -0
  49. package/docs/assets/showcase/codexmonitor.png +0 -0
  50. package/docs/assets/showcase/gohome-grafana.png +0 -0
  51. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  52. package/docs/assets/showcase/oura-health.png +0 -0
  53. package/docs/assets/showcase/padel-cli.svg +11 -0
  54. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  55. package/docs/assets/showcase/papla-tts.jpg +0 -0
  56. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  57. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  58. package/docs/assets/showcase/roborock-status.svg +13 -0
  59. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  60. package/docs/assets/showcase/snag.png +0 -0
  61. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  62. package/docs/assets/showcase/wienerlinien.png +0 -0
  63. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  64. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  65. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  66. package/docs/assets/sponsors/blacksmith-light.svg +14 -0
  67. package/docs/assets/sponsors/blacksmith.svg +14 -0
  68. package/docs/assets/sponsors/convex-light.svg +16 -0
  69. package/docs/assets/sponsors/convex.svg +16 -0
  70. package/docs/assets/sponsors/github-light.svg +3 -0
  71. package/docs/assets/sponsors/github.svg +3 -0
  72. package/docs/assets/sponsors/nvidia-dark.svg +9 -0
  73. package/docs/assets/sponsors/nvidia.svg +9 -0
  74. package/docs/assets/sponsors/openai-light.svg +3 -0
  75. package/docs/assets/sponsors/openai.svg +3 -0
  76. package/docs/assets/sponsors/vercel-light.svg +5 -0
  77. package/docs/assets/sponsors/vercel.svg +5 -0
  78. package/docs/auth-credential-semantics.md +80 -0
  79. package/docs/automation/auth-monitoring.md +8 -0
  80. package/docs/automation/clawflow.md +8 -0
  81. package/docs/automation/cron-jobs.md +410 -0
  82. package/docs/automation/cron-vs-heartbeat.md +8 -0
  83. package/docs/automation/gmail-pubsub.md +8 -0
  84. package/docs/automation/hooks.md +303 -0
  85. package/docs/automation/index.md +115 -0
  86. package/docs/automation/poll.md +8 -0
  87. package/docs/automation/standing-orders.md +254 -0
  88. package/docs/automation/taskflow.md +82 -0
  89. package/docs/automation/tasks.md +323 -0
  90. package/docs/automation/troubleshooting.md +8 -0
  91. package/docs/automation/webhook.md +8 -0
  92. package/docs/brave-search.md +103 -0
  93. package/docs/channels/bluebubbles.md +435 -0
  94. package/docs/channels/broadcast-groups.md +442 -0
  95. package/docs/channels/channel-routing.md +139 -0
  96. package/docs/channels/discord.md +1254 -0
  97. package/docs/channels/feishu.md +793 -0
  98. package/docs/channels/googlechat.md +270 -0
  99. package/docs/channels/group-messages.md +84 -0
  100. package/docs/channels/groups.md +410 -0
  101. package/docs/channels/imessage.md +427 -0
  102. package/docs/channels/index.md +50 -0
  103. package/docs/channels/irc.md +252 -0
  104. package/docs/channels/line.md +225 -0
  105. package/docs/channels/location.md +56 -0
  106. package/docs/channels/matrix.md +869 -0
  107. package/docs/channels/mattermost.md +472 -0
  108. package/docs/channels/msteams.md +805 -0
  109. package/docs/channels/nextcloud-talk.md +149 -0
  110. package/docs/channels/nostr.md +252 -0
  111. package/docs/channels/pairing.md +129 -0
  112. package/docs/channels/qqbot.md +193 -0
  113. package/docs/channels/signal.md +337 -0
  114. package/docs/channels/slack.md +681 -0
  115. package/docs/channels/synology-chat.md +185 -0
  116. package/docs/channels/telegram.md +1072 -0
  117. package/docs/channels/tlon.md +290 -0
  118. package/docs/channels/troubleshooting.md +133 -0
  119. package/docs/channels/twitch.md +394 -0
  120. package/docs/channels/whatsapp.md +488 -0
  121. package/docs/channels/zalo.md +254 -0
  122. package/docs/channels/zalouser.md +195 -0
  123. package/docs/ci.md +66 -0
  124. package/docs/cli/acp.md +316 -0
  125. package/docs/cli/agent.md +57 -0
  126. package/docs/cli/agents.md +220 -0
  127. package/docs/cli/approvals.md +136 -0
  128. package/docs/cli/backup.md +84 -0
  129. package/docs/cli/browser.md +233 -0
  130. package/docs/cli/channels.md +131 -0
  131. package/docs/cli/clawbot.md +21 -0
  132. package/docs/cli/completion.md +35 -0
  133. package/docs/cli/config.md +353 -0
  134. package/docs/cli/configure.md +70 -0
  135. package/docs/cli/cron.md +167 -0
  136. package/docs/cli/daemon.md +57 -0
  137. package/docs/cli/dashboard.md +22 -0
  138. package/docs/cli/devices.md +171 -0
  139. package/docs/cli/directory.md +63 -0
  140. package/docs/cli/dns.md +48 -0
  141. package/docs/cli/docs.md +28 -0
  142. package/docs/cli/doctor.md +63 -0
  143. package/docs/cli/flows.md +18 -0
  144. package/docs/cli/gateway.md +307 -0
  145. package/docs/cli/health.md +36 -0
  146. package/docs/cli/hooks.md +337 -0
  147. package/docs/cli/index.md +1836 -0
  148. package/docs/cli/logs.md +59 -0
  149. package/docs/cli/mcp.md +505 -0
  150. package/docs/cli/memory.md +139 -0
  151. package/docs/cli/message.md +300 -0
  152. package/docs/cli/models.md +136 -0
  153. package/docs/cli/node.md +137 -0
  154. package/docs/cli/nodes.md +66 -0
  155. package/docs/cli/onboard.md +171 -0
  156. package/docs/cli/pairing.md +65 -0
  157. package/docs/cli/plugins.md +305 -0
  158. package/docs/cli/qr.md +52 -0
  159. package/docs/cli/reset.md +35 -0
  160. package/docs/cli/sandbox.md +197 -0
  161. package/docs/cli/secrets.md +197 -0
  162. package/docs/cli/security.md +86 -0
  163. package/docs/cli/sessions.md +113 -0
  164. package/docs/cli/setup.md +45 -0
  165. package/docs/cli/skills.md +59 -0
  166. package/docs/cli/status.md +35 -0
  167. package/docs/cli/system.md +71 -0
  168. package/docs/cli/tui.md +30 -0
  169. package/docs/cli/uninstall.md +39 -0
  170. package/docs/cli/update.md +113 -0
  171. package/docs/cli/voicecall.md +34 -0
  172. package/docs/cli/webhooks.md +91 -0
  173. package/docs/concepts/agent-loop.md +168 -0
  174. package/docs/concepts/agent-workspace.md +246 -0
  175. package/docs/concepts/agent.md +129 -0
  176. package/docs/concepts/architecture.md +156 -0
  177. package/docs/concepts/compaction.md +122 -0
  178. package/docs/concepts/context-engine.md +274 -0
  179. package/docs/concepts/context.md +179 -0
  180. package/docs/concepts/delegate-architecture.md +307 -0
  181. package/docs/concepts/dreaming.md +173 -0
  182. package/docs/concepts/features.md +76 -0
  183. package/docs/concepts/markdown-formatting.md +130 -0
  184. package/docs/concepts/memory-builtin.md +105 -0
  185. package/docs/concepts/memory-honcho.md +140 -0
  186. package/docs/concepts/memory-qmd.md +163 -0
  187. package/docs/concepts/memory-search.md +141 -0
  188. package/docs/concepts/memory.md +121 -0
  189. package/docs/concepts/messages.md +161 -0
  190. package/docs/concepts/model-failover.md +349 -0
  191. package/docs/concepts/model-providers.md +799 -0
  192. package/docs/concepts/models.md +255 -0
  193. package/docs/concepts/multi-agent.md +615 -0
  194. package/docs/concepts/oauth.md +225 -0
  195. package/docs/concepts/presence.md +102 -0
  196. package/docs/concepts/queue.md +89 -0
  197. package/docs/concepts/retry.md +69 -0
  198. package/docs/concepts/session-pruning.md +92 -0
  199. package/docs/concepts/session-tool.md +141 -0
  200. package/docs/concepts/session.md +116 -0
  201. package/docs/concepts/soul.md +110 -0
  202. package/docs/concepts/streaming.md +161 -0
  203. package/docs/concepts/system-prompt.md +182 -0
  204. package/docs/concepts/timezone.md +97 -0
  205. package/docs/concepts/typebox.md +307 -0
  206. package/docs/concepts/typing-indicators.md +69 -0
  207. package/docs/concepts/usage-tracking.md +59 -0
  208. package/docs/date-time.md +128 -0
  209. package/docs/debug/node-issue.md +85 -0
  210. package/docs/diagnostics/flags.md +91 -0
  211. package/docs/docs.json +1601 -0
  212. package/docs/gateway/authentication.md +218 -0
  213. package/docs/gateway/background-process.md +131 -0
  214. package/docs/gateway/bonjour.md +179 -0
  215. package/docs/gateway/bridge-protocol.md +89 -0
  216. package/docs/gateway/cli-backends.md +310 -0
  217. package/docs/gateway/configuration-examples.md +631 -0
  218. package/docs/gateway/configuration-reference.md +3618 -0
  219. package/docs/gateway/configuration.md +698 -0
  220. package/docs/gateway/discovery.md +141 -0
  221. package/docs/gateway/doctor.md +494 -0
  222. package/docs/gateway/gateway-lock.md +37 -0
  223. package/docs/gateway/health.md +61 -0
  224. package/docs/gateway/heartbeat.md +443 -0
  225. package/docs/gateway/index.md +367 -0
  226. package/docs/gateway/local-models.md +163 -0
  227. package/docs/gateway/logging.md +113 -0
  228. package/docs/gateway/multiple-gateways.md +120 -0
  229. package/docs/gateway/network-model.md +25 -0
  230. package/docs/gateway/openai-http-api.md +280 -0
  231. package/docs/gateway/openresponses-http-api.md +340 -0
  232. package/docs/gateway/openshell.md +307 -0
  233. package/docs/gateway/pairing.md +138 -0
  234. package/docs/gateway/protocol.md +588 -0
  235. package/docs/gateway/remote-gateway-readme.md +164 -0
  236. package/docs/gateway/remote.md +251 -0
  237. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +141 -0
  238. package/docs/gateway/sandboxing.md +473 -0
  239. package/docs/gateway/secrets-plan-contract.md +116 -0
  240. package/docs/gateway/secrets.md +541 -0
  241. package/docs/gateway/security/index.md +1362 -0
  242. package/docs/gateway/tailscale.md +136 -0
  243. package/docs/gateway/tools-invoke-http-api.md +161 -0
  244. package/docs/gateway/troubleshooting.md +451 -0
  245. package/docs/gateway/trusted-proxy-auth.md +399 -0
  246. package/docs/help/debugging.md +168 -0
  247. package/docs/help/environment.md +165 -0
  248. package/docs/help/faq.md +3244 -0
  249. package/docs/help/index.md +28 -0
  250. package/docs/help/scripts.md +27 -0
  251. package/docs/help/testing.md +640 -0
  252. package/docs/help/troubleshooting.md +372 -0
  253. package/docs/images/configure-model-picker-unsearchable.png +0 -0
  254. package/docs/images/feishu-step2-create-app.png +0 -0
  255. package/docs/images/feishu-step3-credentials.png +0 -0
  256. package/docs/images/feishu-step4-permissions.png +0 -0
  257. package/docs/images/feishu-step5-bot-capability.png +0 -0
  258. package/docs/images/feishu-step6-event-subscription.png +0 -0
  259. package/docs/images/feishu-verification-token.png +0 -0
  260. package/docs/images/groups-flow.svg +52 -0
  261. package/docs/images/mobile-ui-screenshot.png +0 -0
  262. package/docs/index.md +196 -0
  263. package/docs/install/ansible.md +230 -0
  264. package/docs/install/azure.md +311 -0
  265. package/docs/install/bun.md +55 -0
  266. package/docs/install/clawdock.md +106 -0
  267. package/docs/install/development-channels.md +131 -0
  268. package/docs/install/digitalocean.md +129 -0
  269. package/docs/install/docker-vm-runtime.md +142 -0
  270. package/docs/install/docker.md +412 -0
  271. package/docs/install/exe-dev.md +133 -0
  272. package/docs/install/fly.md +504 -0
  273. package/docs/install/gcp.md +412 -0
  274. package/docs/install/hetzner.md +259 -0
  275. package/docs/install/index.md +212 -0
  276. package/docs/install/installer.md +443 -0
  277. package/docs/install/kubernetes.md +192 -0
  278. package/docs/install/macos-vm.md +281 -0
  279. package/docs/install/migrating-matrix.md +349 -0
  280. package/docs/install/migrating.md +112 -0
  281. package/docs/install/nix.md +89 -0
  282. package/docs/install/node.md +144 -0
  283. package/docs/install/northflank.mdx +42 -0
  284. package/docs/install/oracle.md +158 -0
  285. package/docs/install/podman.md +210 -0
  286. package/docs/install/railway.mdx +90 -0
  287. package/docs/install/raspberry-pi.md +159 -0
  288. package/docs/install/render.mdx +165 -0
  289. package/docs/install/uninstall.md +128 -0
  290. package/docs/install/updating.md +142 -0
  291. package/docs/logging.md +389 -0
  292. package/docs/nav-tabs-underline.js +100 -0
  293. package/docs/network.md +69 -0
  294. package/docs/nodes/audio.md +191 -0
  295. package/docs/nodes/camera.md +162 -0
  296. package/docs/nodes/images.md +73 -0
  297. package/docs/nodes/index.md +408 -0
  298. package/docs/nodes/location-command.md +98 -0
  299. package/docs/nodes/media-understanding.md +432 -0
  300. package/docs/nodes/talk.md +92 -0
  301. package/docs/nodes/troubleshooting.md +123 -0
  302. package/docs/nodes/voicewake.md +66 -0
  303. package/docs/perplexity.md +181 -0
  304. package/docs/pi-dev.md +80 -0
  305. package/docs/pi.md +570 -0
  306. package/docs/platforms/android.md +244 -0
  307. package/docs/platforms/digitalocean.md +266 -0
  308. package/docs/platforms/index.md +55 -0
  309. package/docs/platforms/ios.md +223 -0
  310. package/docs/platforms/linux.md +100 -0
  311. package/docs/platforms/mac/bundled-gateway.md +75 -0
  312. package/docs/platforms/mac/canvas.md +125 -0
  313. package/docs/platforms/mac/child-process.md +69 -0
  314. package/docs/platforms/mac/dev-setup.md +107 -0
  315. package/docs/platforms/mac/health.md +34 -0
  316. package/docs/platforms/mac/icon.md +31 -0
  317. package/docs/platforms/mac/logging.md +57 -0
  318. package/docs/platforms/mac/menu-bar.md +81 -0
  319. package/docs/platforms/mac/peekaboo.md +65 -0
  320. package/docs/platforms/mac/permissions.md +50 -0
  321. package/docs/platforms/mac/remote.md +84 -0
  322. package/docs/platforms/mac/signing.md +47 -0
  323. package/docs/platforms/mac/skills.md +40 -0
  324. package/docs/platforms/mac/voice-overlay.md +60 -0
  325. package/docs/platforms/mac/voicewake.md +67 -0
  326. package/docs/platforms/mac/webchat.md +51 -0
  327. package/docs/platforms/mac/xpc.md +61 -0
  328. package/docs/platforms/macos.md +229 -0
  329. package/docs/platforms/oracle.md +305 -0
  330. package/docs/platforms/raspberry-pi.md +420 -0
  331. package/docs/platforms/windows.md +241 -0
  332. package/docs/plugins/agent-tools.md +10 -0
  333. package/docs/plugins/architecture.md +1609 -0
  334. package/docs/plugins/building-extensions.md +10 -0
  335. package/docs/plugins/building-plugins.md +319 -0
  336. package/docs/plugins/bundles.md +292 -0
  337. package/docs/plugins/community.md +149 -0
  338. package/docs/plugins/manifest.md +412 -0
  339. package/docs/plugins/sdk-channel-plugins.md +508 -0
  340. package/docs/plugins/sdk-entrypoints.md +210 -0
  341. package/docs/plugins/sdk-migration.md +359 -0
  342. package/docs/plugins/sdk-overview.md +475 -0
  343. package/docs/plugins/sdk-provider-plugins.md +712 -0
  344. package/docs/plugins/sdk-runtime.md +381 -0
  345. package/docs/plugins/sdk-setup.md +516 -0
  346. package/docs/plugins/sdk-testing.md +263 -0
  347. package/docs/plugins/voice-call.md +466 -0
  348. package/docs/plugins/zalouser.md +78 -0
  349. package/docs/prose.md +134 -0
  350. package/docs/providers/anthropic.md +402 -0
  351. package/docs/providers/bedrock-mantle.md +91 -0
  352. package/docs/providers/bedrock.md +273 -0
  353. package/docs/providers/chutes.md +103 -0
  354. package/docs/providers/claude-max-api-proxy.md +163 -0
  355. package/docs/providers/cloudflare-ai-gateway.md +71 -0
  356. package/docs/providers/deepgram.md +93 -0
  357. package/docs/providers/deepseek.md +53 -0
  358. package/docs/providers/fireworks.md +69 -0
  359. package/docs/providers/github-copilot.md +80 -0
  360. package/docs/providers/glm.md +68 -0
  361. package/docs/providers/google.md +149 -0
  362. package/docs/providers/groq.md +105 -0
  363. package/docs/providers/huggingface.md +193 -0
  364. package/docs/providers/index.md +81 -0
  365. package/docs/providers/kilocode.md +89 -0
  366. package/docs/providers/litellm.md +159 -0
  367. package/docs/providers/minimax.md +281 -0
  368. package/docs/providers/mistral.md +68 -0
  369. package/docs/providers/models.md +56 -0
  370. package/docs/providers/moonshot.md +224 -0
  371. package/docs/providers/nvidia.md +58 -0
  372. package/docs/providers/ollama.md +379 -0
  373. package/docs/providers/openai.md +472 -0
  374. package/docs/providers/opencode-go.md +45 -0
  375. package/docs/providers/opencode.md +68 -0
  376. package/docs/providers/openrouter.md +59 -0
  377. package/docs/providers/perplexity-provider.md +62 -0
  378. package/docs/providers/qianfan.md +90 -0
  379. package/docs/providers/qwen.md +128 -0
  380. package/docs/providers/qwen_modelstudio.md +137 -0
  381. package/docs/providers/sglang.md +115 -0
  382. package/docs/providers/stepfun.md +152 -0
  383. package/docs/providers/synthetic.md +101 -0
  384. package/docs/providers/together.md +70 -0
  385. package/docs/providers/venice.md +282 -0
  386. package/docs/providers/vercel-ai-gateway.md +60 -0
  387. package/docs/providers/vllm.md +103 -0
  388. package/docs/providers/volcengine.md +94 -0
  389. package/docs/providers/xai.md +94 -0
  390. package/docs/providers/xiaomi.md +89 -0
  391. package/docs/providers/zai.md +75 -0
  392. package/docs/reference/AGENTS.default.md +126 -0
  393. package/docs/reference/RELEASING.md +138 -0
  394. package/docs/reference/api-usage-costs.md +198 -0
  395. package/docs/reference/credits.md +30 -0
  396. package/docs/reference/device-models.md +47 -0
  397. package/docs/reference/memory-config.md +421 -0
  398. package/docs/reference/prompt-caching.md +344 -0
  399. package/docs/reference/rpc.md +43 -0
  400. package/docs/reference/secretref-credential-surface.md +148 -0
  401. package/docs/reference/secretref-user-supplied-credentials-matrix.json +607 -0
  402. package/docs/reference/session-management-compaction.md +352 -0
  403. package/docs/reference/templates/AGENTS.dev.md +84 -0
  404. package/docs/reference/templates/AGENTS.md +219 -0
  405. package/docs/reference/templates/BOOT.md +12 -0
  406. package/docs/reference/templates/BOOTSTRAP.md +62 -0
  407. package/docs/reference/templates/CLAUDE.md +1 -0
  408. package/docs/reference/templates/HEARTBEAT.md +14 -0
  409. package/docs/reference/templates/IDENTITY.dev.md +48 -0
  410. package/docs/reference/templates/IDENTITY.md +30 -0
  411. package/docs/reference/templates/SOUL.dev.md +77 -0
  412. package/docs/reference/templates/SOUL.md +45 -0
  413. package/docs/reference/templates/TOOLS.dev.md +25 -0
  414. package/docs/reference/templates/TOOLS.md +47 -0
  415. package/docs/reference/templates/USER.dev.md +19 -0
  416. package/docs/reference/templates/USER.md +24 -0
  417. package/docs/reference/test.md +119 -0
  418. package/docs/reference/token-use.md +197 -0
  419. package/docs/reference/transcript-hygiene.md +151 -0
  420. package/docs/reference/wizard.md +245 -0
  421. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +98 -0
  422. package/docs/security/THREAT-MODEL-ATLAS.md +608 -0
  423. package/docs/security/formal-verification.md +167 -0
  424. package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +9 -0
  425. package/docs/snippets/plugin-publish/minimal-package.json +16 -0
  426. package/docs/start/bootstrapping.md +41 -0
  427. package/docs/start/docs-directory.md +67 -0
  428. package/docs/start/getting-started.md +148 -0
  429. package/docs/start/hubs.md +199 -0
  430. package/docs/start/lore.md +219 -0
  431. package/docs/start/onboarding-overview.md +69 -0
  432. package/docs/start/onboarding.md +92 -0
  433. package/docs/start/openclaw.md +225 -0
  434. package/docs/start/quickstart.md +22 -0
  435. package/docs/start/setup.md +172 -0
  436. package/docs/start/showcase.md +418 -0
  437. package/docs/start/wizard-cli-automation.md +233 -0
  438. package/docs/start/wizard-cli-reference.md +324 -0
  439. package/docs/start/wizard.md +127 -0
  440. package/docs/style.css +37 -0
  441. package/docs/tools/acp-agents.md +837 -0
  442. package/docs/tools/agent-send.md +100 -0
  443. package/docs/tools/apply-patch.md +52 -0
  444. package/docs/tools/brave-search.md +107 -0
  445. package/docs/tools/browser-linux-troubleshooting.md +145 -0
  446. package/docs/tools/browser-login.md +73 -0
  447. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +221 -0
  448. package/docs/tools/browser.md +890 -0
  449. package/docs/tools/btw.md +142 -0
  450. package/docs/tools/capability-cookbook.md +119 -0
  451. package/docs/tools/clawhub.md +348 -0
  452. package/docs/tools/code-execution.md +90 -0
  453. package/docs/tools/creating-skills.md +119 -0
  454. package/docs/tools/diffs.md +434 -0
  455. package/docs/tools/duckduckgo-search.md +102 -0
  456. package/docs/tools/elevated.md +116 -0
  457. package/docs/tools/exa-search.md +127 -0
  458. package/docs/tools/exec-approvals.md +635 -0
  459. package/docs/tools/exec.md +237 -0
  460. package/docs/tools/firecrawl.md +147 -0
  461. package/docs/tools/gemini-search.md +98 -0
  462. package/docs/tools/grok-search.md +102 -0
  463. package/docs/tools/image-generation.md +139 -0
  464. package/docs/tools/index.md +174 -0
  465. package/docs/tools/kimi-search.md +98 -0
  466. package/docs/tools/llm-task.md +119 -0
  467. package/docs/tools/lobster.md +348 -0
  468. package/docs/tools/loop-detection.md +100 -0
  469. package/docs/tools/minimax-search.md +99 -0
  470. package/docs/tools/multi-agent-sandbox-tools.md +373 -0
  471. package/docs/tools/ollama-search.md +100 -0
  472. package/docs/tools/pdf.md +176 -0
  473. package/docs/tools/perplexity-search.md +185 -0
  474. package/docs/tools/plugin.md +348 -0
  475. package/docs/tools/reactions.md +78 -0
  476. package/docs/tools/searxng-search.md +132 -0
  477. package/docs/tools/skills-config.md +133 -0
  478. package/docs/tools/skills.md +377 -0
  479. package/docs/tools/slash-commands.md +322 -0
  480. package/docs/tools/subagents.md +341 -0
  481. package/docs/tools/tavily.md +129 -0
  482. package/docs/tools/thinking.md +102 -0
  483. package/docs/tools/tts.md +452 -0
  484. package/docs/tools/web-fetch.md +159 -0
  485. package/docs/tools/web.md +417 -0
  486. package/docs/tts.md +452 -0
  487. package/docs/vps.md +115 -0
  488. package/docs/web/control-ui.md +318 -0
  489. package/docs/web/dashboard.md +93 -0
  490. package/docs/web/index.md +126 -0
  491. package/docs/web/tui.md +176 -0
  492. package/docs/web/webchat.md +77 -0
  493. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  494. package/docs/whatsapp-openclaw.jpg +0 -0
  495. package/durar.mjs +180 -0
  496. package/package.json +1259 -0
  497. package/scripts/npm-runner.mjs +111 -0
  498. package/scripts/postinstall-bundled-plugins.mjs +188 -0
  499. package/skills/1password/SKILL.md +70 -0
  500. package/skills/1password/references/cli-examples.md +29 -0
  501. package/skills/1password/references/get-started.md +17 -0
  502. package/skills/apple-notes/SKILL.md +77 -0
  503. package/skills/apple-reminders/SKILL.md +118 -0
  504. package/skills/bear-notes/SKILL.md +107 -0
  505. package/skills/blogwatcher/SKILL.md +69 -0
  506. package/skills/blucli/SKILL.md +47 -0
  507. package/skills/bluebubbles/SKILL.md +131 -0
  508. package/skills/camsnap/SKILL.md +45 -0
  509. package/skills/canvas/SKILL.md +199 -0
  510. package/skills/clawhub/SKILL.md +77 -0
  511. package/skills/coding-agent/SKILL.md +316 -0
  512. package/skills/discord/SKILL.md +197 -0
  513. package/skills/eightctl/SKILL.md +50 -0
  514. package/skills/gemini/SKILL.md +43 -0
  515. package/skills/gh-issues/SKILL.md +885 -0
  516. package/skills/gifgrep/SKILL.md +79 -0
  517. package/skills/github/SKILL.md +163 -0
  518. package/skills/gog/SKILL.md +116 -0
  519. package/skills/goplaces/SKILL.md +52 -0
  520. package/skills/healthcheck/SKILL.md +245 -0
  521. package/skills/himalaya/SKILL.md +257 -0
  522. package/skills/himalaya/references/configuration.md +184 -0
  523. package/skills/himalaya/references/message-composition.md +199 -0
  524. package/skills/imsg/SKILL.md +122 -0
  525. package/skills/mcporter/SKILL.md +61 -0
  526. package/skills/model-usage/SKILL.md +69 -0
  527. package/skills/model-usage/references/codexbar-cli.md +33 -0
  528. package/skills/model-usage/scripts/model_usage.py +320 -0
  529. package/skills/model-usage/scripts/test_model_usage.py +40 -0
  530. package/skills/nano-pdf/SKILL.md +38 -0
  531. package/skills/node-connect/SKILL.md +142 -0
  532. package/skills/notion/SKILL.md +174 -0
  533. package/skills/obsidian/SKILL.md +81 -0
  534. package/skills/openai-whisper/SKILL.md +38 -0
  535. package/skills/openai-whisper-api/SKILL.md +62 -0
  536. package/skills/openai-whisper-api/scripts/transcribe.sh +88 -0
  537. package/skills/openhue/SKILL.md +112 -0
  538. package/skills/oracle/SKILL.md +125 -0
  539. package/skills/ordercli/SKILL.md +78 -0
  540. package/skills/peekaboo/SKILL.md +190 -0
  541. package/skills/sag/SKILL.md +87 -0
  542. package/skills/session-logs/SKILL.md +151 -0
  543. package/skills/sherpa-onnx-tts/SKILL.md +109 -0
  544. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  545. package/skills/skill-creator/SKILL.md +372 -0
  546. package/skills/skill-creator/license.txt +202 -0
  547. package/skills/skill-creator/scripts/init_skill.py +378 -0
  548. package/skills/skill-creator/scripts/package_skill.py +139 -0
  549. package/skills/skill-creator/scripts/quick_validate.py +159 -0
  550. package/skills/skill-creator/scripts/test_package_skill.py +160 -0
  551. package/skills/skill-creator/scripts/test_quick_validate.py +72 -0
  552. package/skills/slack/SKILL.md +144 -0
  553. package/skills/songsee/SKILL.md +49 -0
  554. package/skills/sonoscli/SKILL.md +65 -0
  555. package/skills/spotify-player/SKILL.md +64 -0
  556. package/skills/summarize/SKILL.md +87 -0
  557. package/skills/taskflow/SKILL.md +149 -0
  558. package/skills/taskflow/examples/inbox-triage.lobster +33 -0
  559. package/skills/taskflow/examples/pr-intake.lobster +32 -0
  560. package/skills/taskflow-inbox-triage/SKILL.md +119 -0
  561. package/skills/things-mac/SKILL.md +86 -0
  562. package/skills/tmux/SKILL.md +170 -0
  563. package/skills/tmux/scripts/find-sessions.sh +112 -0
  564. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  565. package/skills/trello/SKILL.md +108 -0
  566. package/skills/video-frames/SKILL.md +46 -0
  567. package/skills/video-frames/scripts/frame.sh +81 -0
  568. package/skills/voice-call/SKILL.md +45 -0
  569. package/skills/wacli/SKILL.md +72 -0
  570. package/skills/weather/SKILL.md +129 -0
  571. package/skills/xurl/SKILL.md +461 -0
package/docs/pi.md ADDED
@@ -0,0 +1,570 @@
1
+ ---
2
+ title: "Pi Integration Architecture"
3
+ summary: "Architecture of Durar's embedded Pi agent integration and session lifecycle"
4
+ read_when:
5
+ - Understanding Pi SDK integration design in Durar
6
+ - Modifying agent session lifecycle, tooling, or provider wiring for Pi
7
+ ---
8
+
9
+ # Pi Integration Architecture
10
+
11
+ This document describes how Durar integrates with [pi-coding-agent](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent) and its sibling packages (`pi-ai`, `pi-agent-core`, `pi-tui`) to power its AI agent capabilities.
12
+
13
+ ## Overview
14
+
15
+ Durar uses the pi SDK to embed an AI coding agent into its messaging gateway architecture. Instead of spawning pi as a subprocess or using RPC mode, Durar directly imports and instantiates pi's `AgentSession` via `createAgentSession()`. This embedded approach provides:
16
+
17
+ - Full control over session lifecycle and event handling
18
+ - Custom tool injection (messaging, sandbox, channel-specific actions)
19
+ - System prompt customization per channel/context
20
+ - Session persistence with branching/compaction support
21
+ - Multi-account auth profile rotation with failover
22
+ - Provider-agnostic model switching
23
+
24
+ ## Package Dependencies
25
+
26
+ ```json
27
+ {
28
+ "@mariozechner/pi-agent-core": "0.64.0",
29
+ "@mariozechner/pi-ai": "0.64.0",
30
+ "@mariozechner/pi-coding-agent": "0.64.0",
31
+ "@mariozechner/pi-tui": "0.64.0"
32
+ }
33
+ ```
34
+
35
+ | Package | Purpose |
36
+ | ----------------- | ------------------------------------------------------------------------------------------------------ |
37
+ | `pi-ai` | Core LLM abstractions: `Model`, `streamSimple`, message types, provider APIs |
38
+ | `pi-agent-core` | Agent loop, tool execution, `AgentMessage` types |
39
+ | `pi-coding-agent` | High-level SDK: `createAgentSession`, `SessionManager`, `AuthStorage`, `ModelRegistry`, built-in tools |
40
+ | `pi-tui` | Terminal UI components (used in Durar's local TUI mode) |
41
+
42
+ ## File Structure
43
+
44
+ ```
45
+ src/agents/
46
+ ├── pi-embedded-runner.ts # Re-exports from pi-embedded-runner/
47
+ ├── pi-embedded-runner/
48
+ │ ├── run.ts # Main entry: runEmbeddedPiAgent()
49
+ │ ├── run/
50
+ │ │ ├── attempt.ts # Single attempt logic with session setup
51
+ │ │ ├── params.ts # RunEmbeddedPiAgentParams type
52
+ │ │ ├── payloads.ts # Build response payloads from run results
53
+ │ │ ├── images.ts # Vision model image injection
54
+ │ │ └── types.ts # EmbeddedRunAttemptResult
55
+ │ ├── abort.ts # Abort error detection
56
+ │ ├── cache-ttl.ts # Cache TTL tracking for context pruning
57
+ │ ├── compact.ts # Manual/auto compaction logic
58
+ │ ├── extensions.ts # Load pi extensions for embedded runs
59
+ │ ├── extra-params.ts # Provider-specific stream params
60
+ │ ├── google.ts # Google/Gemini turn ordering fixes
61
+ │ ├── history.ts # History limiting (DM vs group)
62
+ │ ├── lanes.ts # Session/global command lanes
63
+ │ ├── logger.ts # Subsystem logger
64
+ │ ├── model.ts # Model resolution via ModelRegistry
65
+ │ ├── runs.ts # Active run tracking, abort, queue
66
+ │ ├── sandbox-info.ts # Sandbox info for system prompt
67
+ │ ├── session-manager-cache.ts # SessionManager instance caching
68
+ │ ├── session-manager-init.ts # Session file initialization
69
+ │ ├── system-prompt.ts # System prompt builder
70
+ │ ├── tool-split.ts # Split tools into builtIn vs custom
71
+ │ ├── types.ts # EmbeddedPiAgentMeta, EmbeddedPiRunResult
72
+ │ └── utils.ts # ThinkLevel mapping, error description
73
+ ├── pi-embedded-subscribe.ts # Session event subscription/dispatch
74
+ ├── pi-embedded-subscribe.types.ts # SubscribeEmbeddedPiSessionParams
75
+ ├── pi-embedded-subscribe.handlers.ts # Event handler factory
76
+ ├── pi-embedded-subscribe.handlers.lifecycle.ts
77
+ ├── pi-embedded-subscribe.handlers.types.ts
78
+ ├── pi-embedded-block-chunker.ts # Streaming block reply chunking
79
+ ├── pi-embedded-messaging.ts # Messaging tool sent tracking
80
+ ├── pi-embedded-helpers.ts # Error classification, turn validation
81
+ ├── pi-embedded-helpers/ # Helper modules
82
+ ├── pi-embedded-utils.ts # Formatting utilities
83
+ ├── pi-tools.ts # createDurarCodingTools()
84
+ ├── pi-tools.abort.ts # AbortSignal wrapping for tools
85
+ ├── pi-tools.policy.ts # Tool allowlist/denylist policy
86
+ ├── pi-tools.read.ts # Read tool customizations
87
+ ├── pi-tools.schema.ts # Tool schema normalization
88
+ ├── pi-tools.types.ts # AnyAgentTool type alias
89
+ ├── pi-tool-definition-adapter.ts # AgentTool -> ToolDefinition adapter
90
+ ├── pi-settings.ts # Settings overrides
91
+ ├── pi-hooks/ # Custom pi hooks
92
+ │ ├── compaction-safeguard.ts # Safeguard extension
93
+ │ ├── compaction-safeguard-runtime.ts
94
+ │ ├── context-pruning.ts # Cache-TTL context pruning extension
95
+ │ └── context-pruning/
96
+ ├── model-auth.ts # Auth profile resolution
97
+ ├── auth-profiles.ts # Profile store, cooldown, failover
98
+ ├── model-selection.ts # Default model resolution
99
+ ├── models-config.ts # models.json generation
100
+ ├── model-catalog.ts # Model catalog cache
101
+ ├── context-window-guard.ts # Context window validation
102
+ ├── failover-error.ts # FailoverError class
103
+ ├── defaults.ts # DEFAULT_PROVIDER, DEFAULT_MODEL
104
+ ├── system-prompt.ts # buildAgentSystemPrompt()
105
+ ├── system-prompt-params.ts # System prompt parameter resolution
106
+ ├── system-prompt-report.ts # Debug report generation
107
+ ├── tool-summaries.ts # Tool description summaries
108
+ ├── tool-policy.ts # Tool policy resolution
109
+ ├── transcript-policy.ts # Transcript validation policy
110
+ ├── skills.ts # Skill snapshot/prompt building
111
+ ├── skills/ # Skill subsystem
112
+ ├── sandbox.ts # Sandbox context resolution
113
+ ├── sandbox/ # Sandbox subsystem
114
+ ├── channel-tools.ts # Channel-specific tool injection
115
+ ├── Durar-tools.ts # Durar-specific tools
116
+ ├── bash-tools.ts # exec/process tools
117
+ ├── apply-patch.ts # apply_patch tool (OpenAI)
118
+ ├── tools/ # Individual tool implementations
119
+ │ ├── browser-tool.ts
120
+ │ ├── canvas-tool.ts
121
+ │ ├── cron-tool.ts
122
+ │ ├── gateway-tool.ts
123
+ │ ├── image-tool.ts
124
+ │ ├── message-tool.ts
125
+ │ ├── nodes-tool.ts
126
+ │ ├── session*.ts
127
+ │ ├── web-*.ts
128
+ │ └── ...
129
+ └── ...
130
+ ```
131
+
132
+ Channel-specific message action runtimes now live in the plugin-owned extension
133
+ directories instead of under `src/agents/tools`, for example:
134
+
135
+ - the Discord plugin action runtime files
136
+ - the Slack plugin action runtime file
137
+ - the Telegram plugin action runtime file
138
+ - the WhatsApp plugin action runtime file
139
+
140
+ ## Core Integration Flow
141
+
142
+ ### 1. Running an Embedded Agent
143
+
144
+ The main entry point is `runEmbeddedPiAgent()` in `pi-embedded-runner/run.ts`:
145
+
146
+ ```typescript
147
+ import { runEmbeddedPiAgent } from "./agents/pi-embedded-runner.js";
148
+
149
+ const result = await runEmbeddedPiAgent({
150
+ sessionId: "user-123",
151
+ sessionKey: "main:whatsapp:+1234567890",
152
+ sessionFile: "/path/to/session.jsonl",
153
+ workspaceDir: "/path/to/workspace",
154
+ config: DurarConfig,
155
+ prompt: "Hello, how are you?",
156
+ provider: "anthropic",
157
+ model: "claude-sonnet-4-6",
158
+ timeoutMs: 120_000,
159
+ runId: "run-abc",
160
+ onBlockReply: async (payload) => {
161
+ await sendToChannel(payload.text, payload.mediaUrls);
162
+ },
163
+ });
164
+ ```
165
+
166
+ ### 2. Session Creation
167
+
168
+ Inside `runEmbeddedAttempt()` (called by `runEmbeddedPiAgent()`), the pi SDK is used:
169
+
170
+ ```typescript
171
+ import {
172
+ createAgentSession,
173
+ DefaultResourceLoader,
174
+ SessionManager,
175
+ SettingsManager,
176
+ } from "@mariozechner/pi-coding-agent";
177
+
178
+ const resourceLoader = new DefaultResourceLoader({
179
+ cwd: resolvedWorkspace,
180
+ agentDir,
181
+ settingsManager,
182
+ additionalExtensionPaths,
183
+ });
184
+ await resourceLoader.reload();
185
+
186
+ const { session } = await createAgentSession({
187
+ cwd: resolvedWorkspace,
188
+ agentDir,
189
+ authStorage: params.authStorage,
190
+ modelRegistry: params.modelRegistry,
191
+ model: params.model,
192
+ thinkingLevel: mapThinkingLevel(params.thinkLevel),
193
+ tools: builtInTools,
194
+ customTools: allCustomTools,
195
+ sessionManager,
196
+ settingsManager,
197
+ resourceLoader,
198
+ });
199
+
200
+ applySystemPromptOverrideToSession(session, systemPromptOverride);
201
+ ```
202
+
203
+ ### 3. Event Subscription
204
+
205
+ `subscribeEmbeddedPiSession()` subscribes to pi's `AgentSession` events:
206
+
207
+ ```typescript
208
+ const subscription = subscribeEmbeddedPiSession({
209
+ session: activeSession,
210
+ runId: params.runId,
211
+ verboseLevel: params.verboseLevel,
212
+ reasoningMode: params.reasoningLevel,
213
+ toolResultFormat: params.toolResultFormat,
214
+ onToolResult: params.onToolResult,
215
+ onReasoningStream: params.onReasoningStream,
216
+ onBlockReply: params.onBlockReply,
217
+ onPartialReply: params.onPartialReply,
218
+ onAgentEvent: params.onAgentEvent,
219
+ });
220
+ ```
221
+
222
+ Events handled include:
223
+
224
+ - `message_start` / `message_end` / `message_update` (streaming text/thinking)
225
+ - `tool_execution_start` / `tool_execution_update` / `tool_execution_end`
226
+ - `turn_start` / `turn_end`
227
+ - `agent_start` / `agent_end`
228
+ - `auto_compaction_start` / `auto_compaction_end`
229
+
230
+ ### 4. Prompting
231
+
232
+ After setup, the session is prompted:
233
+
234
+ ```typescript
235
+ await session.prompt(effectivePrompt, { images: imageResult.images });
236
+ ```
237
+
238
+ The SDK handles the full agent loop: sending to LLM, executing tool calls, streaming responses.
239
+
240
+ Image injection is prompt-local: Durar loads image refs from the current prompt and
241
+ passes them via `images` for that turn only. It does not re-scan older history turns
242
+ to re-inject image payloads.
243
+
244
+ ## Tool Architecture
245
+
246
+ ### Tool Pipeline
247
+
248
+ 1. **Base Tools**: pi's `codingTools` (read, bash, edit, write)
249
+ 2. **Custom Replacements**: Durar replaces bash with `exec`/`process`, customizes read/edit/write for sandbox
250
+ 3. **Durar Tools**: messaging, browser, canvas, sessions, cron, gateway, etc.
251
+ 4. **Channel Tools**: Discord/Telegram/Slack/WhatsApp-specific action tools
252
+ 5. **Policy Filtering**: Tools filtered by profile, provider, agent, group, sandbox policies
253
+ 6. **Schema Normalization**: Schemas cleaned for Gemini/OpenAI quirks
254
+ 7. **AbortSignal Wrapping**: Tools wrapped to respect abort signals
255
+
256
+ ### Tool Definition Adapter
257
+
258
+ pi-agent-core's `AgentTool` has a different `execute` signature than pi-coding-agent's `ToolDefinition`. The adapter in `pi-tool-definition-adapter.ts` bridges this:
259
+
260
+ ```typescript
261
+ export function toToolDefinitions(tools: AnyAgentTool[]): ToolDefinition[] {
262
+ return tools.map((tool) => ({
263
+ name: tool.name,
264
+ label: tool.label ?? name,
265
+ description: tool.description ?? "",
266
+ parameters: tool.parameters,
267
+ execute: async (toolCallId, params, onUpdate, _ctx, signal) => {
268
+ // pi-coding-agent signature differs from pi-agent-core
269
+ return await tool.execute(toolCallId, params, signal, onUpdate);
270
+ },
271
+ }));
272
+ }
273
+ ```
274
+
275
+ ### Tool Split Strategy
276
+
277
+ `splitSdkTools()` passes all tools via `customTools`:
278
+
279
+ ```typescript
280
+ export function splitSdkTools(options: { tools: AnyAgentTool[]; sandboxEnabled: boolean }) {
281
+ return {
282
+ builtInTools: [], // Empty. We override everything
283
+ customTools: toToolDefinitions(options.tools),
284
+ };
285
+ }
286
+ ```
287
+
288
+ This ensures Durar's policy filtering, sandbox integration, and extended toolset remain consistent across providers.
289
+
290
+ ## System Prompt Construction
291
+
292
+ The system prompt is built in `buildAgentSystemPrompt()` (`system-prompt.ts`). It assembles a full prompt with sections including Tooling, Tool Call Style, Safety guardrails, Durar CLI reference, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metadata, plus Memory and Reactions when enabled, and optional context files and extra system prompt content. Sections are trimmed for minimal prompt mode used by subagents.
293
+
294
+ The prompt is applied after session creation via `applySystemPromptOverrideToSession()`:
295
+
296
+ ```typescript
297
+ const systemPromptOverride = createSystemPromptOverride(appendPrompt);
298
+ applySystemPromptOverrideToSession(session, systemPromptOverride);
299
+ ```
300
+
301
+ ## Session Management
302
+
303
+ ### Session Files
304
+
305
+ Sessions are JSONL files with tree structure (id/parentId linking). Pi's `SessionManager` handles persistence:
306
+
307
+ ```typescript
308
+ const sessionManager = SessionManager.open(params.sessionFile);
309
+ ```
310
+
311
+ Durar wraps this with `guardSessionManager()` for tool result safety.
312
+
313
+ ### Session Caching
314
+
315
+ `session-manager-cache.ts` caches SessionManager instances to avoid repeated file parsing:
316
+
317
+ ```typescript
318
+ await prewarmSessionFile(params.sessionFile);
319
+ sessionManager = SessionManager.open(params.sessionFile);
320
+ trackSessionManagerAccess(params.sessionFile);
321
+ ```
322
+
323
+ ### History Limiting
324
+
325
+ `limitHistoryTurns()` trims conversation history based on channel type (DM vs group).
326
+
327
+ ### Compaction
328
+
329
+ Auto-compaction triggers on context overflow. Common overflow signatures
330
+ include `request_too_large`, `context length exceeded`, `input exceeds the
331
+ maximum number of tokens`, `input token count exceeds the maximum number of
332
+ input tokens`, `input is too long for the model`, and `ollama error: context
333
+ length exceeded`. `compactEmbeddedPiSessionDirect()` handles manual
334
+ compaction:
335
+
336
+ ```typescript
337
+ const compactResult = await compactEmbeddedPiSessionDirect({
338
+ sessionId, sessionFile, provider, model, ...
339
+ });
340
+ ```
341
+
342
+ ## Authentication & Model Resolution
343
+
344
+ ### Auth Profiles
345
+
346
+ Durar maintains an auth profile store with multiple API keys per provider:
347
+
348
+ ```typescript
349
+ const authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
350
+ const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });
351
+ ```
352
+
353
+ Profiles rotate on failures with cooldown tracking:
354
+
355
+ ```typescript
356
+ await markAuthProfileFailure({ store, profileId, reason, cfg, agentDir });
357
+ const rotated = await advanceAuthProfile();
358
+ ```
359
+
360
+ ### Model Resolution
361
+
362
+ ```typescript
363
+ import { resolveModel } from "./pi-embedded-runner/model.js";
364
+
365
+ const { model, error, authStorage, modelRegistry } = resolveModel(
366
+ provider,
367
+ modelId,
368
+ agentDir,
369
+ config,
370
+ );
371
+
372
+ // Uses pi's ModelRegistry and AuthStorage
373
+ authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
374
+ ```
375
+
376
+ ### Failover
377
+
378
+ `FailoverError` triggers model fallback when configured:
379
+
380
+ ```typescript
381
+ if (fallbackConfigured && isFailoverErrorMessage(errorText)) {
382
+ throw new FailoverError(errorText, {
383
+ reason: promptFailoverReason ?? "unknown",
384
+ provider,
385
+ model: modelId,
386
+ profileId,
387
+ status: resolveFailoverStatus(promptFailoverReason),
388
+ });
389
+ }
390
+ ```
391
+
392
+ ## Pi Extensions
393
+
394
+ Durar loads custom pi extensions for specialized behavior:
395
+
396
+ ### Compaction Safeguard
397
+
398
+ `src/agents/pi-hooks/compaction-safeguard.ts` adds guardrails to compaction, including adaptive token budgeting plus tool failure and file operation summaries:
399
+
400
+ ```typescript
401
+ if (resolveCompactionMode(params.cfg) === "safeguard") {
402
+ setCompactionSafeguardRuntime(params.sessionManager, { maxHistoryShare });
403
+ paths.push(resolvePiExtensionPath("compaction-safeguard"));
404
+ }
405
+ ```
406
+
407
+ ### Context Pruning
408
+
409
+ `src/agents/pi-hooks/context-pruning.ts` implements cache-TTL based context pruning:
410
+
411
+ ```typescript
412
+ if (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") {
413
+ setContextPruningRuntime(params.sessionManager, {
414
+ settings,
415
+ contextWindowTokens,
416
+ isToolPrunable,
417
+ lastCacheTouchAt,
418
+ });
419
+ paths.push(resolvePiExtensionPath("context-pruning"));
420
+ }
421
+ ```
422
+
423
+ ## Streaming & Block Replies
424
+
425
+ ### Block Chunking
426
+
427
+ `EmbeddedBlockChunker` manages streaming text into discrete reply blocks:
428
+
429
+ ```typescript
430
+ const blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;
431
+ ```
432
+
433
+ ### Thinking/Final Tag Stripping
434
+
435
+ Streaming output is processed to strip `<think>`/`<thinking>` blocks and extract `<final>` content:
436
+
437
+ ```typescript
438
+ const stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => {
439
+ // Strip <think>...</think> content
440
+ // If enforceFinalTag, only return <final>...</final> content
441
+ };
442
+ ```
443
+
444
+ ### Reply Directives
445
+
446
+ Reply directives like `[[media:url]]`, `[[voice]]`, `[[reply:id]]` are parsed and extracted:
447
+
448
+ ```typescript
449
+ const { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);
450
+ ```
451
+
452
+ ## Error Handling
453
+
454
+ ### Error Classification
455
+
456
+ `pi-embedded-helpers.ts` classifies errors for appropriate handling:
457
+
458
+ ```typescript
459
+ isContextOverflowError(errorText) // Context too large
460
+ isCompactionFailureError(errorText) // Compaction failed
461
+ isAuthAssistantError(lastAssistant) // Auth failure
462
+ isRateLimitAssistantError(...) // Rate limited
463
+ isFailoverAssistantError(...) // Should failover
464
+ classifyFailoverReason(errorText) // "auth" | "rate_limit" | "quota" | "timeout" | ...
465
+ ```
466
+
467
+ ### Thinking Level Fallback
468
+
469
+ If a thinking level is unsupported, it falls back:
470
+
471
+ ```typescript
472
+ const fallbackThinking = pickFallbackThinkingLevel({
473
+ message: errorText,
474
+ attempted: attemptedThinking,
475
+ });
476
+ if (fallbackThinking) {
477
+ thinkLevel = fallbackThinking;
478
+ continue;
479
+ }
480
+ ```
481
+
482
+ ## Sandbox Integration
483
+
484
+ When sandbox mode is enabled, tools and paths are constrained:
485
+
486
+ ```typescript
487
+ const sandbox = await resolveSandboxContext({
488
+ config: params.config,
489
+ sessionKey: sandboxSessionKey,
490
+ workspaceDir: resolvedWorkspace,
491
+ });
492
+
493
+ if (sandboxRoot) {
494
+ // Use sandboxed read/edit/write tools
495
+ // Exec runs in container
496
+ // Browser uses bridge URL
497
+ }
498
+ ```
499
+
500
+ ## Provider-Specific Handling
501
+
502
+ ### Anthropic
503
+
504
+ - Refusal magic string scrubbing
505
+ - Turn validation for consecutive roles
506
+ - Claude Code parameter compatibility
507
+
508
+ ### Google/Gemini
509
+
510
+ - Plugin-owned tool schema sanitization
511
+
512
+ ### OpenAI
513
+
514
+ - `apply_patch` tool for Codex models
515
+ - Thinking level downgrade handling
516
+
517
+ ## TUI Integration
518
+
519
+ Durar also has a local TUI mode that uses pi-tui components directly:
520
+
521
+ ```typescript
522
+ // src/tui/tui.ts
523
+ import { ... } from "@mariozechner/pi-tui";
524
+ ```
525
+
526
+ This provides the interactive terminal experience similar to pi's native mode.
527
+
528
+ ## Key Differences from Pi CLI
529
+
530
+ | Aspect | Pi CLI | Durar Embedded |
531
+ | --------------- | ----------------------- | ---------------------------------------------------------------------------------------------- |
532
+ | Invocation | `pi` command / RPC | SDK via `createAgentSession()` |
533
+ | Tools | Default coding tools | Custom Durar tool suite |
534
+ | System prompt | AGENTS.md + prompts | Dynamic per-channel/context |
535
+ | Session storage | `~/.pi/agent/sessions/` | `~/.Durar/agents/<agentId>/sessions/` (or `$Durar_STATE_DIR/agents/<agentId>/sessions/`) |
536
+ | Auth | Single credential | Multi-profile with rotation |
537
+ | Extensions | Loaded from disk | Programmatic + disk paths |
538
+ | Event handling | TUI rendering | Callback-based (onBlockReply, etc.) |
539
+
540
+ ## Future Considerations
541
+
542
+ Areas for potential rework:
543
+
544
+ 1. **Tool signature alignment**: Currently adapting between pi-agent-core and pi-coding-agent signatures
545
+ 2. **Session manager wrapping**: `guardSessionManager` adds safety but increases complexity
546
+ 3. **Extension loading**: Could use pi's `ResourceLoader` more directly
547
+ 4. **Streaming handler complexity**: `subscribeEmbeddedPiSession` has grown large
548
+ 5. **Provider quirks**: Many provider-specific codepaths that pi could potentially handle
549
+
550
+ ## Tests
551
+
552
+ Pi integration coverage spans these suites:
553
+
554
+ - `src/agents/pi-*.test.ts`
555
+ - `src/agents/pi-auth-json.test.ts`
556
+ - `src/agents/pi-embedded-*.test.ts`
557
+ - `src/agents/pi-embedded-helpers*.test.ts`
558
+ - `src/agents/pi-embedded-runner*.test.ts`
559
+ - `src/agents/pi-embedded-runner/**/*.test.ts`
560
+ - `src/agents/pi-embedded-subscribe*.test.ts`
561
+ - `src/agents/pi-tools*.test.ts`
562
+ - `src/agents/pi-tool-definition-adapter*.test.ts`
563
+ - `src/agents/pi-settings.test.ts`
564
+ - `src/agents/pi-hooks/**/*.test.ts`
565
+
566
+ Live/opt-in:
567
+
568
+ - `src/agents/pi-embedded-runner-extraparams.live.test.ts` (enable `Durar_LIVE_TEST=1`)
569
+
570
+ For current run commands, see [Pi Development Workflow](/pi-dev).