@hybridaione/hybridclaw 0.12.5 → 0.12.6

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 (344) hide show
  1. package/AGENTS.md +3 -2
  2. package/CHANGELOG.md +74 -1
  3. package/README.md +15 -6
  4. package/config.example.json +53 -0
  5. package/console/dist/assets/chat-BFZkUicV.js +93 -0
  6. package/console/dist/assets/chat-CKhyYUgY.css +1 -0
  7. package/console/dist/assets/cx-Dzb14TPi.js +1 -0
  8. package/console/dist/assets/index-BFbE8-iL.css +1 -0
  9. package/console/dist/assets/index-BLDth_j-.js +15 -0
  10. package/console/dist/assets/query-DYNohPrB.js +1 -0
  11. package/console/dist/assets/rolldown-runtime-DF2fYuay.js +1 -0
  12. package/console/dist/assets/router-CUFYqD1a.js +1 -0
  13. package/console/dist/assets/terminal-BQbAhdr-.js +1 -0
  14. package/console/dist/assets/{terminal-BZDT_b4f.js → terminal-CzORQPl2.js} +2 -2
  15. package/console/dist/assets/vendor-C4WPVvdh.js +9 -0
  16. package/console/dist/index.html +7 -2
  17. package/console/package.json +3 -0
  18. package/container/dist/approval-policy.js +402 -266
  19. package/container/dist/approval-policy.js.map +1 -1
  20. package/container/dist/index.js +7 -5
  21. package/container/dist/index.js.map +1 -1
  22. package/container/dist/model-retry.js +1 -1
  23. package/container/dist/model-retry.js.map +1 -1
  24. package/container/dist/providers/hybridai.js +2 -1
  25. package/container/dist/providers/hybridai.js.map +1 -1
  26. package/container/dist/providers/local-openai-compat.js +2 -1
  27. package/container/dist/providers/local-openai-compat.js.map +1 -1
  28. package/container/dist/providers/stream-utils.js +31 -0
  29. package/container/dist/providers/stream-utils.js.map +1 -0
  30. package/container/package-lock.json +17 -1
  31. package/container/package.json +3 -2
  32. package/container/shared/network-policy.d.ts +34 -0
  33. package/container/shared/network-policy.js +209 -0
  34. package/container/src/approval-policy.ts +511 -277
  35. package/container/src/index.ts +7 -0
  36. package/container/src/model-retry.ts +1 -1
  37. package/container/src/providers/hybridai.ts +5 -1
  38. package/container/src/providers/local-openai-compat.ts +5 -1
  39. package/container/src/providers/stream-utils.ts +37 -0
  40. package/dist/agent/prompt-hooks.d.ts.map +1 -1
  41. package/dist/agent/prompt-hooks.js +33 -0
  42. package/dist/agent/prompt-hooks.js.map +1 -1
  43. package/dist/approval-commands.d.ts +1 -1
  44. package/dist/approval-commands.d.ts.map +1 -1
  45. package/dist/approval-commands.js +0 -1
  46. package/dist/approval-commands.js.map +1 -1
  47. package/dist/channels/channel-registry.d.ts.map +1 -1
  48. package/dist/channels/channel-registry.js +5 -1
  49. package/dist/channels/channel-registry.js.map +1 -1
  50. package/dist/channels/channel.d.ts +3 -2
  51. package/dist/channels/channel.d.ts.map +1 -1
  52. package/dist/channels/channel.js +10 -0
  53. package/dist/channels/channel.js.map +1 -1
  54. package/dist/channels/msteams/runtime.d.ts.map +1 -1
  55. package/dist/channels/msteams/runtime.js +11 -1
  56. package/dist/channels/msteams/runtime.js.map +1 -1
  57. package/dist/channels/prompt-adapters.d.ts.map +1 -1
  58. package/dist/channels/prompt-adapters.js +9 -1
  59. package/dist/channels/prompt-adapters.js.map +1 -1
  60. package/dist/channels/voice/channel-id.d.ts +4 -0
  61. package/dist/channels/voice/channel-id.d.ts.map +1 -0
  62. package/dist/channels/voice/channel-id.js +23 -0
  63. package/dist/channels/voice/channel-id.js.map +1 -0
  64. package/dist/channels/voice/conversation-relay.d.ts +70 -0
  65. package/dist/channels/voice/conversation-relay.d.ts.map +1 -0
  66. package/dist/channels/voice/conversation-relay.js +196 -0
  67. package/dist/channels/voice/conversation-relay.js.map +1 -0
  68. package/dist/channels/voice/runtime.d.ts +22 -0
  69. package/dist/channels/voice/runtime.d.ts.map +1 -0
  70. package/dist/channels/voice/runtime.js +582 -0
  71. package/dist/channels/voice/runtime.js.map +1 -0
  72. package/dist/channels/voice/security.d.ts +20 -0
  73. package/dist/channels/voice/security.d.ts.map +1 -0
  74. package/dist/channels/voice/security.js +62 -0
  75. package/dist/channels/voice/security.js.map +1 -0
  76. package/dist/channels/voice/session.d.ts +57 -0
  77. package/dist/channels/voice/session.d.ts.map +1 -0
  78. package/dist/channels/voice/session.js +208 -0
  79. package/dist/channels/voice/session.js.map +1 -0
  80. package/dist/channels/voice/text.d.ts +7 -0
  81. package/dist/channels/voice/text.d.ts.map +1 -0
  82. package/dist/channels/voice/text.js +161 -0
  83. package/dist/channels/voice/text.js.map +1 -0
  84. package/dist/channels/voice/twilio-manager.d.ts +26 -0
  85. package/dist/channels/voice/twilio-manager.d.ts.map +1 -0
  86. package/dist/channels/voice/twilio-manager.js +120 -0
  87. package/dist/channels/voice/twilio-manager.js.map +1 -0
  88. package/dist/channels/voice/utils.d.ts +2 -0
  89. package/dist/channels/voice/utils.d.ts.map +1 -0
  90. package/dist/channels/voice/utils.js +4 -0
  91. package/dist/channels/voice/utils.js.map +1 -0
  92. package/dist/channels/voice/webhook.d.ts +13 -0
  93. package/dist/channels/voice/webhook.d.ts.map +1 -0
  94. package/dist/channels/voice/webhook.js +73 -0
  95. package/dist/channels/voice/webhook.js.map +1 -0
  96. package/dist/channels/whatsapp/connection.d.ts.map +1 -1
  97. package/dist/channels/whatsapp/connection.js +15 -2
  98. package/dist/channels/whatsapp/connection.js.map +1 -1
  99. package/dist/cli/help.d.ts +2 -0
  100. package/dist/cli/help.d.ts.map +1 -1
  101. package/dist/cli/help.js +64 -3
  102. package/dist/cli/help.js.map +1 -1
  103. package/dist/cli/secret-command.d.ts +2 -0
  104. package/dist/cli/secret-command.d.ts.map +1 -0
  105. package/dist/cli/secret-command.js +208 -0
  106. package/dist/cli/secret-command.js.map +1 -0
  107. package/dist/cli.d.ts.map +1 -1
  108. package/dist/cli.js +20 -1
  109. package/dist/cli.js.map +1 -1
  110. package/dist/command-registry.d.ts.map +1 -1
  111. package/dist/command-registry.js +343 -7
  112. package/dist/command-registry.js.map +1 -1
  113. package/dist/commands/policy-command.d.ts +9 -0
  114. package/dist/commands/policy-command.d.ts.map +1 -0
  115. package/dist/commands/policy-command.js +381 -0
  116. package/dist/commands/policy-command.js.map +1 -0
  117. package/dist/config/config.d.ts +13 -0
  118. package/dist/config/config.d.ts.map +1 -1
  119. package/dist/config/config.js +28 -0
  120. package/dist/config/config.js.map +1 -1
  121. package/dist/config/runtime-config.d.ts +37 -1
  122. package/dist/config/runtime-config.d.ts.map +1 -1
  123. package/dist/config/runtime-config.js +154 -1
  124. package/dist/config/runtime-config.js.map +1 -1
  125. package/dist/doctor/checks/index.d.ts.map +1 -1
  126. package/dist/doctor/checks/index.js +2 -0
  127. package/dist/doctor/checks/index.js.map +1 -1
  128. package/dist/doctor/checks/resource-hygiene.d.ts +43 -0
  129. package/dist/doctor/checks/resource-hygiene.d.ts.map +1 -0
  130. package/dist/doctor/checks/resource-hygiene.js +654 -0
  131. package/dist/doctor/checks/resource-hygiene.js.map +1 -0
  132. package/dist/doctor/resource-hygiene.d.ts +12 -0
  133. package/dist/doctor/resource-hygiene.d.ts.map +1 -0
  134. package/dist/doctor/resource-hygiene.js +126 -0
  135. package/dist/doctor/resource-hygiene.js.map +1 -0
  136. package/dist/doctor/types.d.ts +1 -0
  137. package/dist/doctor/types.d.ts.map +1 -1
  138. package/dist/doctor/utils.d.ts +3 -1
  139. package/dist/doctor/utils.d.ts.map +1 -1
  140. package/dist/doctor/utils.js +16 -0
  141. package/dist/doctor/utils.js.map +1 -1
  142. package/dist/doctor.d.ts.map +1 -1
  143. package/dist/doctor.js +15 -17
  144. package/dist/doctor.js.map +1 -1
  145. package/dist/errors/gateway-request-error.d.ts +5 -0
  146. package/dist/errors/gateway-request-error.d.ts.map +1 -0
  147. package/dist/errors/gateway-request-error.js +18 -0
  148. package/dist/errors/gateway-request-error.js.map +1 -0
  149. package/dist/gateway/gateway-chat-service.d.ts.map +1 -1
  150. package/dist/gateway/gateway-chat-service.js +4 -1
  151. package/dist/gateway/gateway-chat-service.js.map +1 -1
  152. package/dist/gateway/gateway-error-utils.d.ts.map +1 -1
  153. package/dist/gateway/gateway-error-utils.js +1 -0
  154. package/dist/gateway/gateway-error-utils.js.map +1 -1
  155. package/dist/gateway/gateway-http-proxy.d.ts +10 -0
  156. package/dist/gateway/gateway-http-proxy.d.ts.map +1 -0
  157. package/dist/gateway/gateway-http-proxy.js +479 -0
  158. package/dist/gateway/gateway-http-proxy.js.map +1 -0
  159. package/dist/gateway/gateway-http-server.d.ts.map +1 -1
  160. package/dist/gateway/gateway-http-server.js +289 -393
  161. package/dist/gateway/gateway-http-server.js.map +1 -1
  162. package/dist/gateway/gateway-http-utils.d.ts +11 -0
  163. package/dist/gateway/gateway-http-utils.d.ts.map +1 -0
  164. package/dist/gateway/gateway-http-utils.js +59 -0
  165. package/dist/gateway/gateway-http-utils.js.map +1 -0
  166. package/dist/gateway/gateway-plugin-service.d.ts.map +1 -1
  167. package/dist/gateway/gateway-plugin-service.js +4 -1
  168. package/dist/gateway/gateway-plugin-service.js.map +1 -1
  169. package/dist/gateway/gateway-service.d.ts +22 -5
  170. package/dist/gateway/gateway-service.d.ts.map +1 -1
  171. package/dist/gateway/gateway-service.js +312 -34
  172. package/dist/gateway/gateway-service.js.map +1 -1
  173. package/dist/gateway/gateway-types.d.ts +63 -0
  174. package/dist/gateway/gateway-types.d.ts.map +1 -1
  175. package/dist/gateway/gateway-types.js.map +1 -1
  176. package/dist/gateway/gateway.js +248 -22
  177. package/dist/gateway/gateway.js.map +1 -1
  178. package/dist/gateway/pending-approvals.d.ts +4 -0
  179. package/dist/gateway/pending-approvals.d.ts.map +1 -1
  180. package/dist/gateway/pending-approvals.js +17 -0
  181. package/dist/gateway/pending-approvals.js.map +1 -1
  182. package/dist/gateway/text-channel-commands.d.ts.map +1 -1
  183. package/dist/gateway/text-channel-commands.js +4 -10
  184. package/dist/gateway/text-channel-commands.js.map +1 -1
  185. package/dist/infra/container-runner.d.ts.map +1 -1
  186. package/dist/infra/container-runner.js +2 -0
  187. package/dist/infra/container-runner.js.map +1 -1
  188. package/dist/infra/host-runner.d.ts.map +1 -1
  189. package/dist/infra/host-runner.js +1 -0
  190. package/dist/infra/host-runner.js.map +1 -1
  191. package/dist/logger.js +23 -4
  192. package/dist/logger.js.map +1 -1
  193. package/dist/media/pdf-context.js +1 -1
  194. package/dist/media/pdf-context.js.map +1 -1
  195. package/dist/policy/network-policy.d.ts +3 -0
  196. package/dist/policy/network-policy.d.ts.map +1 -0
  197. package/dist/policy/network-policy.js +2 -0
  198. package/dist/policy/network-policy.js.map +1 -0
  199. package/dist/policy/policy-cli.d.ts +2 -0
  200. package/dist/policy/policy-cli.d.ts.map +1 -0
  201. package/dist/policy/policy-cli.js +12 -0
  202. package/dist/policy/policy-cli.js.map +1 -0
  203. package/dist/policy/policy-presets.d.ts +29 -0
  204. package/dist/policy/policy-presets.d.ts.map +1 -0
  205. package/dist/policy/policy-presets.js +155 -0
  206. package/dist/policy/policy-presets.js.map +1 -0
  207. package/dist/policy/policy-store.d.ts +31 -0
  208. package/dist/policy/policy-store.d.ts.map +1 -0
  209. package/dist/policy/policy-store.js +251 -0
  210. package/dist/policy/policy-store.js.map +1 -0
  211. package/dist/providers/anthropic.d.ts +1 -1
  212. package/dist/providers/anthropic.d.ts.map +1 -1
  213. package/dist/providers/anthropic.js +2 -7
  214. package/dist/providers/anthropic.js.map +1 -1
  215. package/dist/providers/huggingface.d.ts +1 -1
  216. package/dist/providers/huggingface.d.ts.map +1 -1
  217. package/dist/providers/huggingface.js +3 -8
  218. package/dist/providers/huggingface.js.map +1 -1
  219. package/dist/providers/local-ollama.js +2 -2
  220. package/dist/providers/local-ollama.js.map +1 -1
  221. package/dist/providers/mistral.d.ts +1 -1
  222. package/dist/providers/mistral.d.ts.map +1 -1
  223. package/dist/providers/mistral.js +3 -8
  224. package/dist/providers/mistral.js.map +1 -1
  225. package/dist/providers/openai.d.ts +1 -1
  226. package/dist/providers/openai.d.ts.map +1 -1
  227. package/dist/providers/openai.js +3 -8
  228. package/dist/providers/openai.js.map +1 -1
  229. package/dist/providers/openrouter.d.ts +1 -1
  230. package/dist/providers/openrouter.d.ts.map +1 -1
  231. package/dist/providers/openrouter.js +3 -8
  232. package/dist/providers/openrouter.js.map +1 -1
  233. package/dist/providers/provider-utils.d.ts +10 -0
  234. package/dist/providers/provider-utils.d.ts.map +1 -0
  235. package/dist/providers/provider-utils.js +21 -0
  236. package/dist/providers/provider-utils.js.map +1 -0
  237. package/dist/scheduler/scheduler.d.ts.map +1 -1
  238. package/dist/scheduler/scheduler.js +7 -0
  239. package/dist/scheduler/scheduler.js.map +1 -1
  240. package/dist/scheduler/system-jobs.d.ts +25 -0
  241. package/dist/scheduler/system-jobs.d.ts.map +1 -0
  242. package/dist/scheduler/system-jobs.js +27 -0
  243. package/dist/scheduler/system-jobs.js.map +1 -0
  244. package/dist/security/runtime-secrets.d.ts +1 -1
  245. package/dist/security/runtime-secrets.d.ts.map +1 -1
  246. package/dist/security/runtime-secrets.js +1 -0
  247. package/dist/security/runtime-secrets.js.map +1 -1
  248. package/dist/session/session-context.d.ts.map +1 -1
  249. package/dist/session/session-context.js +1 -0
  250. package/dist/session/session-context.js.map +1 -1
  251. package/dist/session/session-maintenance.d.ts.map +1 -1
  252. package/dist/session/session-maintenance.js +6 -1
  253. package/dist/session/session-maintenance.js.map +1 -1
  254. package/dist/session/session-reset.d.ts.map +1 -1
  255. package/dist/session/session-reset.js +3 -0
  256. package/dist/session/session-reset.js.map +1 -1
  257. package/dist/skills/skill-errors.d.ts +6 -0
  258. package/dist/skills/skill-errors.d.ts.map +1 -0
  259. package/dist/skills/skill-errors.js +9 -0
  260. package/dist/skills/skill-errors.js.map +1 -0
  261. package/dist/skills/skills-import-github.d.ts.map +1 -1
  262. package/dist/skills/skills-import-github.js +7 -10
  263. package/dist/skills/skills-import-github.js.map +1 -1
  264. package/dist/skills/skills-import-hubs.d.ts.map +1 -1
  265. package/dist/skills/skills-import-hubs.js +1 -2
  266. package/dist/skills/skills-import-hubs.js.map +1 -1
  267. package/dist/skills/skills-import.d.ts +1 -0
  268. package/dist/skills/skills-import.d.ts.map +1 -1
  269. package/dist/skills/skills-import.js +91 -14
  270. package/dist/skills/skills-import.js.map +1 -1
  271. package/dist/skills/skills.d.ts +9 -0
  272. package/dist/skills/skills.d.ts.map +1 -1
  273. package/dist/skills/skills.js +110 -2
  274. package/dist/skills/skills.js.map +1 -1
  275. package/dist/tui-approval.js +1 -1
  276. package/dist/tui-approval.js.map +1 -1
  277. package/dist/tui-banner.d.ts.map +1 -1
  278. package/dist/tui-banner.js +1 -0
  279. package/dist/tui-banner.js.map +1 -1
  280. package/dist/tui-skill-config.d.ts +1 -1
  281. package/dist/tui-skill-config.d.ts.map +1 -1
  282. package/dist/tui-slash-command.d.ts.map +1 -1
  283. package/dist/tui-slash-command.js +0 -3
  284. package/dist/tui-slash-command.js.map +1 -1
  285. package/dist/tui.d.ts.map +1 -1
  286. package/dist/tui.js +4 -6
  287. package/dist/tui.js.map +1 -1
  288. package/dist/workspace.d.ts.map +1 -1
  289. package/dist/workspace.js +11 -2
  290. package/dist/workspace.js.map +1 -1
  291. package/docs/content/agents.md +1 -0
  292. package/docs/content/channels/README.md +1 -0
  293. package/docs/content/channels/admin-console.md +20 -3
  294. package/docs/content/channels/overview.md +4 -1
  295. package/docs/content/developer-guide/README.md +2 -0
  296. package/docs/content/developer-guide/approvals.md +257 -0
  297. package/docs/content/developer-guide/memory.md +1 -1
  298. package/docs/content/developer-guide/runtime.md +2 -1
  299. package/docs/content/developer-guide/session-routing.md +1 -1
  300. package/docs/content/extensibility/skills.md +4 -0
  301. package/docs/content/getting-started/authentication.md +12 -2
  302. package/docs/content/getting-started/first-channel.md +3 -0
  303. package/docs/content/getting-started/quickstart.md +4 -3
  304. package/docs/content/guides/README.md +3 -1
  305. package/docs/content/guides/twilio-voice.md +453 -0
  306. package/docs/content/guides/voice-tts.md +4 -0
  307. package/docs/content/reference/commands.md +30 -4
  308. package/docs/content/reference/configuration.md +26 -7
  309. package/docs/content/reference/diagnostics.md +9 -0
  310. package/docs/development/agents.md +1 -0
  311. package/docs/development/getting-started/channels.md +12 -5
  312. package/docs/development/guides/README.md +3 -1
  313. package/docs/development/guides/twilio-voice.md +453 -0
  314. package/docs/development/guides/voice-tts.md +4 -0
  315. package/docs/development/internals/README.md +2 -0
  316. package/docs/development/internals/approvals.md +257 -0
  317. package/docs/development/internals/memory.md +1 -1
  318. package/docs/development/internals/runtime.md +2 -1
  319. package/docs/development/internals/session-routing.md +1 -1
  320. package/docs/development/reference/commands.md +12 -0
  321. package/docs/development/reference/configuration.md +18 -6
  322. package/docs/static/docs.js +2 -0
  323. package/package.json +2 -1
  324. package/presets/brave.yaml +13 -0
  325. package/presets/discord.yaml +13 -0
  326. package/presets/github.yaml +18 -0
  327. package/presets/huggingface.yaml +13 -0
  328. package/presets/jira.yaml +13 -0
  329. package/presets/npm.yaml +13 -0
  330. package/presets/outlook.yaml +13 -0
  331. package/presets/pypi.yaml +13 -0
  332. package/presets/slack.yaml +13 -0
  333. package/skills/pdf/SKILL.md +13 -0
  334. package/skills/pdf/reference.md +26 -0
  335. package/skills/pdf/scripts/create_pdf.mjs +127 -0
  336. package/skills/salesforce/SKILL.md +145 -0
  337. package/skills/salesforce/agents/openai.yaml +4 -0
  338. package/skills/salesforce/references/metadata-and-queries.md +109 -0
  339. package/skills/salesforce/scripts/__pycache__/salesforce_query.cpython-314.pyc +0 -0
  340. package/skills/salesforce/scripts/salesforce_query.py +892 -0
  341. package/skills/xlsx/SKILL.md +32 -3
  342. package/skills/xlsx/scripts/create_xlsx.cjs +251 -0
  343. package/console/dist/assets/index-B6FqEYWi.css +0 -1
  344. package/console/dist/assets/index-tnmE9Yuc.js +0 -23
package/AGENTS.md CHANGED
@@ -21,7 +21,7 @@ HybridClaw is a personal AI assistant bot for Discord, powered by HybridAI.
21
21
  Enterprise-grade Node.js 22 application with gateway service, TUI client, and
22
22
  Docker-sandboxed container runtime.
23
23
 
24
- **Version:** 0.9.7  |  **Package:** `@hybridaione/hybridclaw`
24
+ **Version:** 0.12.6  |  **Package:** `@hybridaione/hybridclaw`
25
25
   |  **License:** see `LICENSE`
26
26
 
27
27
  Architecture: gateway (core runtime, SQLite persistence, REST API, Discord
@@ -45,8 +45,9 @@ src/
45
45
  agent/ Agent execution: conversation loop, tool executor, prompt hooks, delegation
46
46
  audit/ Append-only audit trail, approval tracking, hash-chain integrity
47
47
  auth/ HybridAI and OpenAI Codex authentication flows
48
- channels/discord/ Discord integration and delivery logic
48
+ channels/ Channel transports (discord, slack, telegram, email, whatsapp, msteams, voice, imessage)
49
49
  config/ CLI flag parsing, runtime config management
50
+ doctor/ Doctor checks and resource hygiene maintenance
50
51
  gateway/ Core gateway service: HTTP APIs, health, session mgmt, approvals
51
52
  infra/ Container setup, IPC (file-based), worker signatures, runners
52
53
  memory/ SQLite database, semantic memory, compaction, consolidation, chunking
package/CHANGELOG.md CHANGED
@@ -1,6 +1,79 @@
1
1
  # Changelog
2
2
 
3
- ## [Coming up]
3
+ ## [0.12.6](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.6)
4
+
5
+ ### Added
6
+
7
+ - **Twilio voice channel**: Added a built-in Twilio ConversationRelay phone
8
+ channel with inbound webhook handling, outbound `hybridclaw gateway voice
9
+ call <number>` support, admin-console setup, and a dedicated setup and
10
+ troubleshooting guide.
11
+ - **Salesforce skill**: New bundled skill for enterprise CRM integration with
12
+ OAuth token binding, a dedicated `secret` CLI surface for credential
13
+ management, and hardened field-level configuration.
14
+ - **Local skill import**: `skill import` now accepts local filesystem
15
+ directories and `.zip` archives as sources, with persistent import-source
16
+ markers so locally-imported skills retain personal trust across restarts.
17
+ - **Admin approvals policy console**: New `/admin/approvals` interface for
18
+ viewing and managing approval policies from the browser.
19
+ - **Console chat UI**: Migrated the legacy standalone chat UI into the console
20
+ React app with unified channels selection and improved upstream error
21
+ handling.
22
+ - **Doctor resource hygiene**: `hybridclaw doctor` now includes a resource
23
+ hygiene maintenance pass that detects and cleans stale gateway artifacts,
24
+ with cached DB snapshots and disk-state diffing for efficient checks.
25
+ - **Fetch Email-Config button**: The admin email channel editor includes a
26
+ one-click button to fetch and validate HybridAI mailbox credentials.
27
+ - **XLSX skill creation script**: Bundled creation script prevents silent
28
+ generation failures when the xlsx skill produces spreadsheet output.
29
+ - **ToggleGroup component**: New `ToggleGroup` / `ToggleGroupItem` UI
30
+ primitive used across the admin console for binary-toggle controls.
31
+ - **Provider health panel**: Inline login action and inactive-provider
32
+ collapse in the admin console for quicker provider triage.
33
+
34
+ ### Changed
35
+
36
+ - **Per-channel instructions in `/admin/channels`**: The admin console now
37
+ lets operators edit transport-specific prompt guidance, and runtime config
38
+ exposes the same values under `channelInstructions.*` so channels such as
39
+ voice can enforce spoken-output rules without editing prompt files directly.
40
+ - **OAuth token domain binding**: Bearer tokens are now bound to their OAuth
41
+ issuer domain to prevent cross-domain exfiltration, and the gateway proxy
42
+ auto-captures tokens using config constants instead of raw environment
43
+ variables.
44
+ - **Secret CLI simplification**: Removed the `[--raw]` option from
45
+ `secret show` and `secret set`, streamlining the operator-facing surface.
46
+ - **CI pipeline split**: Unit tests now run as parallel lint and test jobs
47
+ with a shared `setup-node-workspace` composite action and PR-level
48
+ concurrency groups that cancel stale runs.
49
+ - **Security scanner hints**: Block messages now include actionable override
50
+ hints so operators understand how to respond to policy violations.
51
+ - **DRY provider utilities**: Refactored model-matching and `agentId`
52
+ normalization into shared provider utilities with prefix-aware matching.
53
+
54
+ ### Fixed
55
+
56
+ - **Voice approval and relay handling**: Spoken approval replies normalize more
57
+ reliably, voice turns skip the usual yellow implicit wait, and the Twilio
58
+ relay path handles disconnect, interrupt, and runtime-unavailable cases more
59
+ cleanly instead of dropping into noisier failure states.
60
+ - **Memory-flush pool slot leak**: Host processes spawned during memory-flush
61
+ no longer leak worker pool slots, and empty sessions are cleaned up
62
+ automatically.
63
+ - **Stream terminated retry**: Terminated stream errors are now retried
64
+ correctly, preserving PDF creation workflows across transport retries.
65
+ - **Skill scanning and promotion**: Runtime-created skills in agent workspace
66
+ directories now appear in `/skill list` and are promoted to the managed
67
+ directory on save.
68
+ - **Teams webhook resilience**: Missing Teams credentials on incoming webhook
69
+ requests are handled gracefully instead of crashing the handler.
70
+ - **AuthProvider callback stability**: Stabilized React `AuthProvider`
71
+ callbacks with memoized context values to prevent unnecessary re-renders.
72
+ - **Upstream error mapping**: Nested HybridAI error payloads are unwrapped
73
+ and mapped to `502` responses to avoid gateway auth confusion, with
74
+ `no-store` cache headers on error responses.
75
+ - **Skip-skill-scan persistence**: The `--skip-skill-scan` CLI decision is
76
+ now persisted so the runtime guard honors it across restarts.
4
77
 
5
78
  ## [0.12.5](https://github.com/HybridAIOne/hybridclaw/tree/v0.12.5)
6
79
 
package/README.md CHANGED
@@ -19,9 +19,9 @@ security, and operational visibility. It combines sandboxed execution, secure
19
19
  credentials, approvals, persistent memory, and admin surfaces behind a single
20
20
  gateway.
21
21
 
22
- Connect it to Discord, Slack, WhatsApp, Telegram, Microsoft Teams, email, or the web. Run it
23
- locally, deploy it for business workflows, and keep your agents, secrets, and
24
- data under your control.
22
+ Connect it to Discord, Slack, WhatsApp, Telegram, Microsoft Teams, email,
23
+ Twilio voice, or the web. Run it locally, deploy it for business workflows,
24
+ and keep your agents, secrets, and data under your control.
25
25
 
26
26
  [Quick Start](https://www.hybridclaw.io/docs/getting-started/quickstart) ·
27
27
  [Installation](https://www.hybridclaw.io/docs/getting-started/installation) ·
@@ -78,7 +78,7 @@ Open locally:
78
78
 
79
79
  - Chat UI: `http://127.0.0.1:9090/chat`
80
80
  - Admin UI: `http://127.0.0.1:9090/admin` for channels, versioned agent files,
81
- scheduler, audit, and config
81
+ scheduler, audit, config, and channel-specific instructions
82
82
  - Agents UI: `http://127.0.0.1:9090/agents`
83
83
  - OpenAI-compatible API: `http://127.0.0.1:9090/v1/models` and `http://127.0.0.1:9090/v1/chat/completions`
84
84
 
@@ -94,7 +94,7 @@ Once the gateway is running, open HybridClaw locally:
94
94
 
95
95
  - Web Chat: `http://127.0.0.1:9090/chat`
96
96
  - Admin Console: `http://127.0.0.1:9090/admin` for channels, versioned agent files,
97
- scheduler, audit, and config
97
+ scheduler, audit, config, and channel-specific instructions
98
98
  - Agent Dashboard: `http://127.0.0.1:9090/agents`
99
99
  - or connect Slack, WhatsApp, Telegram, Discord, Microsoft Teams, Email
100
100
 
@@ -103,11 +103,19 @@ Once the gateway is running, open HybridClaw locally:
103
103
  - `/admin/agents` edits allowlisted bootstrap markdown files such as
104
104
  `AGENTS.md`, keeps saved revisions, and restores earlier versions from the
105
105
  browser.
106
+ - `/admin/channels` edits transport config, encrypted channel credentials,
107
+ Twilio voice settings, and per-channel instructions that are injected into
108
+ prompts at runtime.
109
+ - `/admin/approvals` manages approval policies from the browser.
106
110
  - `hybridclaw tui` includes a keyboard-driven approval picker and prints a
107
111
  ready-to-run `hybridclaw tui --resume <sessionId>` command on exit.
112
+ - `hybridclaw doctor` checks runtime health including resource hygiene
113
+ maintenance for stale gateway artifacts.
108
114
  - `hybridclaw onboarding` and related local setup flows can restore the last
109
115
  known-good saved config snapshot or roll back to a tracked revision when
110
116
  `config.json` becomes invalid.
117
+ - `hybridclaw skill import` supports community sources, local directories,
118
+ and `.zip` archives.
111
119
  - Channel delivery stays predictable: email seeds its first mailbox cursor from
112
120
  the current head instead of replaying old inbox mail, retry-aware transports
113
121
  honor server `Retry-After` backoff, and WhatsApp startup avoids intermittent
@@ -161,7 +169,7 @@ Once the gateway is running, open HybridClaw locally:
161
169
 
162
170
  ## Architecture
163
171
 
164
- - **Gateway service** (Node.js) — shared message/command handlers, SQLite persistence (KV + semantic + knowledge graph + canonical sessions + usage events), scheduler, heartbeat, web/API, loopback OpenAI-compatible API, and channel integrations for Discord, Slack, Microsoft Teams, Telegram, iMessage, WhatsApp, and email
172
+ - **Gateway service** (Node.js) — shared message/command handlers, SQLite persistence (KV + semantic + knowledge graph + canonical sessions + usage events), scheduler, heartbeat, web/API, loopback OpenAI-compatible API, and channel integrations for Discord, Slack, Microsoft Teams, Telegram, iMessage, WhatsApp, Twilio voice, and email
165
173
  - **TUI client** — thin client over HTTP (`/api/chat`, `/api/command`) with
166
174
  a structured startup banner that surfaces model, sandbox, gateway, and
167
175
  chatbot context before the first prompt, an interactive approval picker for
@@ -191,6 +199,7 @@ Browse the full manual at
191
199
  - Channels:
192
200
  [Connect Your First Channel](https://www.hybridclaw.io/docs/getting-started/first-channel),
193
201
  [Overview](https://www.hybridclaw.io/docs/channels/overview),
202
+ [Twilio Voice](https://www.hybridclaw.io/docs/guides/twilio-voice),
194
203
  [Discord](https://www.hybridclaw.io/docs/channels/discord),
195
204
  [Slack](https://www.hybridclaw.io/docs/channels/slack),
196
205
  [Telegram](https://www.hybridclaw.io/docs/channels/telegram),
@@ -14,6 +14,7 @@
14
14
  "msteams": [],
15
15
  "slack": [],
16
16
  "telegram": [],
17
+ "voice": [],
17
18
  "whatsapp": [],
18
19
  "email": []
19
20
  }
@@ -21,6 +22,16 @@
21
22
  "tools": {
22
23
  "disabled": []
23
24
  },
25
+ "channelInstructions": {
26
+ "discord": "",
27
+ "msteams": "",
28
+ "slack": "",
29
+ "telegram": "",
30
+ "voice": "This is a live phone call. Produce plain spoken text only.\nKeep each reply short and conversational, usually one or two short sentences.\nAbsolutely no markdown, bullets, numbered lists, headings, code fences, tables, JSON, or decorative formatting.\nDo not narrate internal reasoning, planning, tool usage, or stage directions. Say only what the caller should hear.\nDo not spell punctuation, formatting marks, or raw URLs unless the caller explicitly asks for exact characters.",
31
+ "whatsapp": "",
32
+ "email": "",
33
+ "imessage": ""
34
+ },
24
35
  "adaptiveSkills": {
25
36
  "enabled": false,
26
37
  "observationEnabled": true,
@@ -157,6 +168,25 @@
157
168
  "ackReaction": "👀",
158
169
  "mediaMaxMb": 20
159
170
  },
171
+ "voice": {
172
+ "enabled": false,
173
+ "provider": "twilio",
174
+ "twilio": {
175
+ "accountSid": "",
176
+ "authToken": "",
177
+ "fromNumber": ""
178
+ },
179
+ "relay": {
180
+ "ttsProvider": "default",
181
+ "voice": "",
182
+ "transcriptionProvider": "default",
183
+ "language": "en-US",
184
+ "interruptible": true,
185
+ "welcomeGreeting": "Hello! How can I help you today?"
186
+ },
187
+ "webhookPath": "/voice",
188
+ "maxConcurrentCalls": 8
189
+ },
160
190
  "imessage": {
161
191
  "enabled": false,
162
192
  "backend": "local",
@@ -459,6 +489,29 @@
459
489
  },
460
490
  "scheduler": {
461
491
  "jobs": [
492
+ {
493
+ "id": "resource-hygiene",
494
+ "name": "Resource Hygiene",
495
+ "description": "Runs conservative doctor-based resource hygiene twice daily and auto-applies only safe cleanup.",
496
+ "schedule": {
497
+ "kind": "every",
498
+ "at": null,
499
+ "everyMs": 43200000,
500
+ "expr": null,
501
+ "tz": "UTC"
502
+ },
503
+ "action": {
504
+ "kind": "system_event",
505
+ "message": "resource_hygiene_maintenance"
506
+ },
507
+ "delivery": {
508
+ "kind": "last-channel",
509
+ "channel": "",
510
+ "to": "",
511
+ "webhookUrl": ""
512
+ },
513
+ "enabled": true
514
+ },
462
515
  {
463
516
  "id": "morning-standup",
464
517
  "name": "Daily Standup Report",