@geminilight/mindos 0.6.69 → 0.6.70

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 (496) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +22 -21
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +7 -7
  10. package/_standalone/.next/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/ask/route.js +13 -13
  48. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  59. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  61. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  65. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  122. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/changelog/page.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/changes/page.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/echo/page.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/explore/page.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/help/page.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app/login/page.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  156. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  157. package/_standalone/.next/server/app/page.js +1 -1
  158. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  159. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  160. package/_standalone/.next/server/app/setup/page.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  162. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/app/trash/page.js +3 -3
  164. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  165. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  167. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  168. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  169. package/_standalone/.next/server/app/wiki/page.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  171. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/app-paths-manifest.json +22 -21
  173. package/_standalone/.next/server/chunks/3437.js +2 -2
  174. package/_standalone/.next/server/chunks/5299.js +1 -0
  175. package/_standalone/.next/server/chunks/6022.js +42 -42
  176. package/_standalone/.next/server/chunks/6133.js +54 -0
  177. package/_standalone/.next/server/chunks/6539.js +1 -1
  178. package/_standalone/.next/server/chunks/8326.js +1 -0
  179. package/_standalone/.next/server/chunks/8388.js +5 -3
  180. package/_standalone/.next/server/chunks/953.js +6 -4
  181. package/_standalone/.next/server/chunks/9938.js +24 -0
  182. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  184. package/_standalone/.next/server/pages/500.html +2 -2
  185. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  186. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  187. package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
  188. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  189. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  190. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  191. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  192. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  193. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  194. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  195. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  196. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  197. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  198. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  201. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  269. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  270. package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
  271. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  272. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  273. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  274. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  276. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  281. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  282. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  283. package/_standalone/.next/trace +72 -71
  284. package/_standalone/.next/types/routes.d.ts +2 -1
  285. package/_standalone/.next/types/validator.ts +9 -0
  286. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  287. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  288. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  289. package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
  290. package/_standalone/__tests__/acp/session.test.ts +346 -167
  291. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  292. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  293. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  294. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  295. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  296. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  297. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  298. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  299. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  300. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  301. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  302. package/_standalone/components/Breadcrumb.tsx +11 -11
  303. package/_standalone/components/FindInPage.tsx +1 -1
  304. package/_standalone/components/MarkdownView.tsx +4 -0
  305. package/_standalone/components/Panel.tsx +17 -10
  306. package/_standalone/components/TableOfContents.tsx +9 -9
  307. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  308. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  309. package/_standalone/components/ask/AskContent.tsx +68 -28
  310. package/_standalone/components/ask/AskHeader.tsx +6 -2
  311. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  312. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  313. package/_standalone/components/settings/AiTab.tsx +5 -1
  314. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  315. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  316. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  317. package/_standalone/components/settings/McpTab.tsx +1 -5
  318. package/_standalone/components/settings/TestButton.tsx +1 -0
  319. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  320. package/_standalone/components/settings/types.ts +12 -0
  321. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  322. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  323. package/_standalone/hooks/useAcpDetection.ts +1 -1
  324. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  325. package/_standalone/hooks/useFileImport.ts +7 -2
  326. package/_standalone/hooks/useFileUpload.ts +17 -10
  327. package/_standalone/lib/acp/index.ts +3 -7
  328. package/_standalone/lib/acp/types.ts +0 -29
  329. package/_standalone/lib/im/platforms.ts +6 -2
  330. package/_standalone/lib/pdf-extract.ts +6 -2
  331. package/_standalone/package-lock.json +12 -2
  332. package/_standalone/package.json +2 -1
  333. package/_standalone/tsconfig.tsbuildinfo +1 -1
  334. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  335. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  336. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  337. package/app/app/api/channels/verify/route.ts +54 -0
  338. package/app/app/api/extract-pdf/route.ts +17 -3
  339. package/app/app/api/settings/list-models/route.ts +40 -44
  340. package/app/app/api/settings/route.ts +16 -0
  341. package/app/app/api/settings/test-key/route.ts +5 -2
  342. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  343. package/app/components/Breadcrumb.tsx +11 -11
  344. package/app/components/DirView.tsx +1 -1
  345. package/app/components/FindInPage.tsx +1 -1
  346. package/app/components/InboxView.tsx +2 -2
  347. package/app/components/MarkdownView.tsx +4 -0
  348. package/app/components/Panel.tsx +17 -10
  349. package/app/components/TableOfContents.tsx +9 -9
  350. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  351. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  352. package/app/components/ask/AskContent.tsx +68 -28
  353. package/app/components/ask/AskHeader.tsx +6 -2
  354. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  355. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  356. package/app/components/settings/AiTab.tsx +5 -1
  357. package/app/components/settings/KnowledgeTab.tsx +92 -1
  358. package/app/components/settings/McpConnectGuides.tsx +4 -0
  359. package/app/components/settings/McpPortSection.tsx +207 -0
  360. package/app/components/settings/McpTab.tsx +1 -5
  361. package/app/components/settings/TestButton.tsx +1 -0
  362. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  363. package/app/components/settings/types.ts +12 -0
  364. package/app/components/settings/useCustomProviderForm.ts +2 -2
  365. package/app/data/skills/mindos/SKILL.md +45 -1
  366. package/app/hooks/useAcpDetection.ts +1 -1
  367. package/app/hooks/useAcpRegistry.ts +1 -1
  368. package/app/hooks/useFileImport.ts +7 -2
  369. package/app/hooks/useFileUpload.ts +17 -10
  370. package/app/lib/acp/agent-descriptors.ts +18 -0
  371. package/app/lib/acp/index.ts +3 -7
  372. package/app/lib/acp/registry.ts +1 -1
  373. package/app/lib/acp/session.ts +237 -530
  374. package/app/lib/acp/subprocess.ts +224 -427
  375. package/app/lib/acp/types.ts +0 -29
  376. package/app/lib/agent/model.ts +20 -4
  377. package/app/lib/agent/non-streaming.ts +37 -20
  378. package/app/lib/agent/providers.ts +31 -0
  379. package/app/lib/agent/tools.ts +2 -1
  380. package/app/lib/core/embedding-index.ts +285 -0
  381. package/app/lib/core/embedding-provider.ts +164 -0
  382. package/app/lib/core/hybrid-search.ts +160 -0
  383. package/app/lib/core/search.ts +11 -21
  384. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  385. package/app/lib/i18n/modules/panels.ts +14 -0
  386. package/app/lib/i18n/modules/settings.ts +2 -0
  387. package/app/lib/im/platforms.ts +6 -2
  388. package/app/lib/im/verify.ts +94 -0
  389. package/app/lib/pdf-extract.ts +6 -2
  390. package/app/lib/settings.ts +23 -0
  391. package/app/package.json +2 -1
  392. package/bin/cli.js +3 -1
  393. package/bin/commands/channel.js +342 -0
  394. package/bin/commands/update.js +11 -4
  395. package/bin/lib/build.js +34 -16
  396. package/bin/lib/channel-config.js +168 -0
  397. package/bin/lib/channel-constants.js +88 -0
  398. package/bin/lib/channel-mgmt.js +244 -0
  399. package/bin/lib/channel-prompts.js +72 -0
  400. package/bin/lib/channel-validate.js +57 -0
  401. package/bin/lib/safe-rm.js +165 -0
  402. package/package.json +1 -1
  403. package/skills/mindos/SKILL.md +45 -1
  404. package/_standalone/.next/server/chunks/1750.js +0 -1
  405. package/_standalone/.next/server/chunks/7200.js +0 -52
  406. package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
  407. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  408. package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
  409. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  410. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  411. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  412. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  413. package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
  414. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  415. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  416. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  417. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  418. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  419. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  481. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
  483. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
  485. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  486. package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
  487. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  489. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  491. package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
  492. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  493. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  494. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  495. package/app/lib/core/synonym-dict.ts +0 -139
  496. /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -0,0 +1,342 @@
1
+ /**
2
+ * mindos channel — Manage IM platform configurations
3
+ *
4
+ * OpenClaw-inspired design:
5
+ * - verb-noun pattern (add, remove, list, verify)
6
+ * - Progressive disclosure (help → subcommand → details)
7
+ * - Platform abstraction layer
8
+ * - Secure credential handling
9
+ */
10
+
11
+ import { bold, dim, cyan, green, red, yellow } from '../lib/colors.js';
12
+ import {
13
+ channelList,
14
+ channelAdd,
15
+ channelRemove,
16
+ channelVerify,
17
+ formatPlatformStatus,
18
+ getPlatformEmoji,
19
+ } from '../lib/channel-mgmt.js';
20
+ import {
21
+ promptHidden,
22
+ promptConfirm,
23
+ closePrompts,
24
+ } from '../lib/channel-prompts.js';
25
+ import {
26
+ validateFieldFormat,
27
+ getRequiredFields,
28
+ getFieldHelp,
29
+ } from '../lib/channel-validate.js';
30
+ import { CHANNEL_PLATFORMS } from '../lib/channel-constants.js';
31
+
32
+ export const meta = {
33
+ name: 'channel',
34
+ group: 'IM Integration',
35
+ summary: 'Manage IM platform configurations',
36
+ usage: 'mindos channel [command]',
37
+ flags: {
38
+ '--skip-verify': 'Skip remote credential verification and only save/validate format',
39
+ },
40
+ examples: [
41
+ 'mindos channel list',
42
+ 'mindos channel add telegram',
43
+ 'mindos channel add telegram --skip-verify',
44
+ 'mindos channel verify discord',
45
+ 'mindos channel remove feishu',
46
+ ],
47
+ };
48
+
49
+ // ────────────────────────────────────────────────────────────────────────────
50
+ // MAIN ENTRY
51
+ // ────────────────────────────────────────────────────────────────────────────
52
+
53
+ export const run = async (args, flags) => {
54
+ const sub = args[0];
55
+
56
+ try {
57
+ switch (sub) {
58
+ case 'list':
59
+ await handleList(flags);
60
+ break;
61
+
62
+ case 'add':
63
+ await handleAdd(args[1], flags);
64
+ break;
65
+
66
+ case 'remove':
67
+ case 'rm':
68
+ await handleRemove(args[1], flags);
69
+ break;
70
+
71
+ case 'verify':
72
+ case 'test':
73
+ await handleVerify(args[1], flags);
74
+ break;
75
+
76
+ case undefined:
77
+ case 'help':
78
+ case '--help':
79
+ case '-h':
80
+ printHelp();
81
+ break;
82
+
83
+ default:
84
+ console.error(red(`Unknown subcommand: ${sub}`));
85
+ console.log();
86
+ printHelp();
87
+ process.exit(1);
88
+ }
89
+ } catch (err) {
90
+ const msg = err instanceof Error ? err.message : String(err);
91
+ console.error(red(`✗ Error: ${msg}`));
92
+ process.exit(1);
93
+ } finally {
94
+ closePrompts();
95
+ }
96
+ };
97
+
98
+ // ────────────────────────────────────────────────────────────────────────────
99
+ // SUBCOMMAND HANDLERS
100
+ // ────────────────────────────────────────────────────────────────────────────
101
+
102
+ /**
103
+ * Handler: list
104
+ */
105
+ async function handleList(flags) {
106
+ console.log();
107
+ console.log(bold('Configured IM Platforms'));
108
+ console.log();
109
+
110
+ const result = await channelList();
111
+
112
+ if (result.platforms.every((p) => p.status === 'not_configured')) {
113
+ console.log(dim('No IM platforms configured.'));
114
+ console.log();
115
+ console.log('Get started:');
116
+ console.log(` ${cyan('mindos channel add telegram')}`);
117
+ console.log(` ${cyan('mindos channel add discord')}`);
118
+ console.log(` ${cyan('mindos channel add feishu')}`);
119
+ console.log();
120
+ return;
121
+ }
122
+
123
+ // Display table
124
+ result.platforms.forEach((platform) => {
125
+ const emoji = getPlatformEmoji(platform.platform);
126
+ const status = formatPlatformStatus(platform.status);
127
+ const name = platform.platform.padEnd(12);
128
+
129
+ let statusStr = '';
130
+ if (platform.status === 'configured') {
131
+ statusStr = `${green(status)} configured`;
132
+ if (platform.botName) {
133
+ statusStr += ` (${platform.botName})`;
134
+ }
135
+ } else if (platform.status === 'incomplete') {
136
+ statusStr = `${yellow(status)} incomplete`;
137
+ if (platform.missingFields) {
138
+ statusStr += ` (missing ${platform.missingFields.join(', ')})`;
139
+ }
140
+ } else {
141
+ statusStr = `${dim(status)} not configured`;
142
+ }
143
+
144
+ console.log(` ${emoji} ${cyan(name)} ${statusStr}`);
145
+ });
146
+
147
+ console.log();
148
+ console.log(dim(`Run 'mindos channel add <platform>' to configure`));
149
+ console.log();
150
+ }
151
+
152
+ /**
153
+ * Handler: add <platform>
154
+ * @param {string} platform - Platform name
155
+ * @param {Object} flags - CLI flags
156
+ */
157
+ async function handleAdd(platform, flags) {
158
+ if (!platform) {
159
+ console.error(red('Usage: mindos channel add <platform>'));
160
+ console.log(dim(' Supported: telegram, discord, feishu, slack, wecom, dingtalk, wechat, qq'));
161
+ process.exit(1);
162
+ }
163
+
164
+ if (!CHANNEL_PLATFORMS.includes(platform)) {
165
+ console.error(red(`Unknown platform: ${platform}`));
166
+ console.log(dim(` Supported: ${CHANNEL_PLATFORMS.join(', ')}`));
167
+ process.exit(1);
168
+ }
169
+
170
+ console.log();
171
+ console.log(bold(`Configuring ${platform} platform`));
172
+ console.log();
173
+
174
+ // Prompt for credentials
175
+ /** @type {Record<string, string>} */
176
+ const credentials = {};
177
+ const requiredFields = getRequiredFields(platform);
178
+
179
+ for (const field of requiredFields) {
180
+ const help = getFieldHelp(platform, field);
181
+ if (help) {
182
+ console.log(dim(`Tip: ${help}`));
183
+ }
184
+
185
+ let attempts = 0;
186
+ const maxAttempts = 3;
187
+
188
+ while (attempts < maxAttempts) {
189
+ const prompt = field === 'bot_token' ? `Enter ${field} (hidden): ` : `Enter ${field}: `;
190
+ const value = await promptHidden(prompt);
191
+
192
+ const validation = validateFieldFormat(platform, field, value);
193
+ if (!validation.valid) {
194
+ console.log(red(`✗ ${validation.error}`));
195
+ attempts++;
196
+ continue;
197
+ }
198
+
199
+ credentials[field] = value;
200
+ break;
201
+ }
202
+
203
+ if (attempts >= maxAttempts) {
204
+ console.log(red(`✗ Too many invalid attempts for ${field}`));
205
+ console.log();
206
+ return;
207
+ }
208
+ }
209
+
210
+ // Verify and save
211
+ console.log();
212
+ console.log(`${yellow('⏳')} Verifying ${platform} credentials...`);
213
+
214
+ const result = await channelAdd(platform, credentials, { skipVerify: flags['skip-verify'] === true });
215
+
216
+ console.log();
217
+ if (result.ok) {
218
+ console.log(green(`✔ ${result.message}`));
219
+ if (result.details?.botName) {
220
+ console.log(` Bot name: ${result.details.botName}`);
221
+ }
222
+ if (result.details?.botId) {
223
+ console.log(` Bot ID: ${result.details.botId}`);
224
+ }
225
+ console.log();
226
+ console.log(dim(`You can now use ${platform} with MindOS agents.`));
227
+ } else {
228
+ console.log(red(`✗ ${result.message}`));
229
+ if (result.error) {
230
+ console.log(` Error: ${result.error}`);
231
+ }
232
+ }
233
+ console.log();
234
+ }
235
+
236
+ /**
237
+ * Handler: remove <platform>
238
+ * @param {string} platform - Platform name
239
+ * @param {Object} flags - CLI flags
240
+ */
241
+ async function handleRemove(platform, flags) {
242
+ if (!platform) {
243
+ console.error(red('Usage: mindos channel remove <platform>'));
244
+ process.exit(1);
245
+ }
246
+
247
+ console.log();
248
+ console.log(bold(`Remove ${platform} configuration`));
249
+ console.log(yellow(`⚠️ This action cannot be undone.`));
250
+ console.log();
251
+
252
+ const confirmed = await promptConfirm(`Remove ${platform} configuration?`);
253
+ if (!confirmed) {
254
+ console.log(dim('Aborted.'));
255
+ console.log();
256
+ return;
257
+ }
258
+
259
+ const result = await channelRemove(platform);
260
+
261
+ console.log();
262
+ if (result.ok) {
263
+ console.log(green(`✔ ${result.message}`));
264
+ } else {
265
+ console.log(red(`✗ ${result.message}`));
266
+ if (result.error) {
267
+ console.log(` Error: ${result.error}`);
268
+ }
269
+ }
270
+ console.log();
271
+ }
272
+
273
+ /**
274
+ * Handler: verify <platform>
275
+ * @param {string} platform - Platform name
276
+ * @param {Object} flags - CLI flags
277
+ */
278
+ async function handleVerify(platform, flags) {
279
+ if (!platform) {
280
+ console.error(red('Usage: mindos channel verify <platform>'));
281
+ process.exit(1);
282
+ }
283
+
284
+ console.log();
285
+ console.log(`${yellow('⏳')} Verifying ${platform} configuration...`);
286
+
287
+ const result = await channelVerify(platform, { skipVerify: flags['skip-verify'] === true });
288
+
289
+ console.log();
290
+ if (result.valid) {
291
+ console.log(green(`✔ ${result.message}`));
292
+ if (result.details?.botName) {
293
+ console.log(` Bot name: ${result.details.botName}`);
294
+ }
295
+ if (result.details?.botId) {
296
+ console.log(` Bot ID: ${result.details.botId}`);
297
+ }
298
+ if (result.details?.status) {
299
+ console.log(` Status: ${result.details.status}`);
300
+ }
301
+ } else {
302
+ console.log(red(`✗ ${result.message}`));
303
+ if (result.error) {
304
+ console.log(` Error: ${result.error}`);
305
+ }
306
+ }
307
+ console.log();
308
+ }
309
+
310
+ // ────────────────────────────────────────────────────────────────────────────
311
+ // HELP TEXT
312
+ // ────────────────────────────────────────────────────────────────────────────
313
+
314
+ function printHelp() {
315
+ const row = (c, d) => ` ${cyan(c.padEnd(32))}${dim(d)}`;
316
+
317
+ console.log(`
318
+ ${bold('mindos channel')} — Manage IM platform configurations
319
+
320
+ ${bold('USAGE')}
321
+ ${cyan('mindos channel [command]')}
322
+
323
+ ${bold('COMMANDS')}
324
+ ${row('mindos channel list', 'Show configured platforms')}
325
+ ${row('mindos channel add <platform>', 'Add/update platform config')}
326
+ ${row('mindos channel remove <platform>', 'Remove platform config')}
327
+ ${row('mindos channel verify <platform>', 'Test platform credentials')}
328
+
329
+ ${bold('PLATFORMS SUPPORTED')}
330
+ ${CHANNEL_PLATFORMS.join(', ')}
331
+
332
+ ${bold('EXAMPLES')}
333
+ ${dim('mindos channel list')}
334
+ ${dim('mindos channel add telegram')}
335
+ ${dim('mindos channel add telegram --skip-verify')}
336
+ ${dim('mindos channel verify discord')}
337
+ ${dim('mindos channel verify discord --skip-verify')}
338
+ ${dim('mindos channel remove feishu')}
339
+
340
+ ${dim('Run "mindos channel <command> --help" for details on any command.')}
341
+ `);
342
+ }
@@ -11,6 +11,7 @@ import { dirname, resolve } from 'node:path';
11
11
  import { ROOT, BUILD_STAMP, CONFIG_PATH, LOG_PATH, MINDOS_DIR } from '../lib/constants.js';
12
12
  import { bold, dim, cyan, green, red, yellow } from '../lib/colors.js';
13
13
  import { execInherited } from '../lib/shell.js';
14
+ import { safeRmSync, assertNotSymlink } from '../lib/safe-rm.js';
14
15
  import { EXIT } from '../lib/command.js';
15
16
  import { stopMindos } from '../lib/stop.js';
16
17
  import { getLocalIP } from '../lib/startup.js';
@@ -77,10 +78,16 @@ function buildIfNeeded(newRoot) {
77
78
  if (existsSync(appPkg)) {
78
79
  execInherited('npm install', resolve(newRoot, 'app'));
79
80
  }
80
- const nextDir = resolve(newRoot, 'app', '.next');
81
- if (existsSync(nextDir)) {
82
- rmSync(nextDir, { recursive: true, force: true });
83
- }
81
+ const nextDir = resolve(newRoot, 'app', '.next');
82
+ if (existsSync(nextDir)) {
83
+ try {
84
+ assertNotSymlink(nextDir);
85
+ safeRmSync(nextDir, { recursive: true, force: true });
86
+ } catch (err) {
87
+ console.error(red(`Failed to clean .next directory: ${err}`));
88
+ throw err;
89
+ }
90
+ }
84
91
  execInherited('node scripts/gen-renderer-index.js', newRoot);
85
92
  execInherited(`${newNextBin} build`, resolve(newRoot, 'app'));
86
93
  const version = JSON.parse(readFileSync(resolve(newRoot, 'package.json'), 'utf-8')).version;
package/bin/lib/build.js CHANGED
@@ -5,6 +5,7 @@ import { resolve } from 'node:path';
5
5
  import { ROOT, BUILD_STAMP, DEPS_STAMP, STANDALONE_SERVER, STANDALONE_STAMP } from './constants.js';
6
6
  import { red, dim, yellow } from './colors.js';
7
7
  import { execInherited as run, npmInstall } from './shell.js';
8
+ import { safeRmSync, assertNotSymlink } from './safe-rm.js';
8
9
 
9
10
  export function needsBuild() {
10
11
  // Prefer prebuilt standalone shipped with the npm package.
@@ -37,14 +38,25 @@ export function writeBuildStamp() {
37
38
  export function clearBuildLock() {
38
39
  const lockFile = resolve(ROOT, 'app', '.next', 'lock');
39
40
  if (existsSync(lockFile)) {
40
- rmSync(lockFile, { force: true });
41
+ try {
42
+ assertNotSymlink(lockFile);
43
+ rmSync(lockFile, { force: true });
44
+ } catch (err) {
45
+ console.warn(`Warning: Failed to clear build lock: ${err}`);
46
+ }
41
47
  }
42
48
  }
43
49
 
44
50
  export function cleanNextDir() {
45
51
  const nextDir = resolve(ROOT, 'app', '.next');
46
52
  if (existsSync(nextDir)) {
47
- rmSync(nextDir, { recursive: true, force: true });
53
+ try {
54
+ assertNotSymlink(nextDir);
55
+ safeRmSync(nextDir, { recursive: true, force: true });
56
+ } catch (err) {
57
+ console.error(red(`Failed to clean .next directory: ${err}`));
58
+ throw err;
59
+ }
48
60
  }
49
61
  }
50
62
 
@@ -140,23 +152,29 @@ export function ensureAppDeps({ force = false } = {}) {
140
152
  console.log(yellow(label));
141
153
  npmInstall(resolve(ROOT, 'app'), '--no-workspaces');
142
154
 
143
- // Verify critical deps — npm tar extraction can silently fail (ENOENT race)
144
- if (!verifyDeps()) {
145
- console.log(yellow('Some dependencies are incomplete, retrying with clean install...\n'));
146
- const nm = resolve(ROOT, 'app', 'node_modules');
147
- rmSync(nm, { recursive: true, force: true });
148
- run('npm install --no-workspaces', resolve(ROOT, 'app'));
155
+ // Verify critical deps — npm tar extraction can silently fail (ENOENT race)
149
156
  if (!verifyDeps()) {
150
- console.error(red('\n✘ Failed to install dependencies after retry.\n'));
151
- const appDir = resolve(ROOT, 'app');
152
- if (process.platform === 'win32') {
153
- console.error(` Try manually: cd "${appDir}" && rmdir /s /q node_modules && npm install`);
154
- } else {
155
- console.error(` Try manually: cd ${appDir} && rm -rf node_modules && npm install`);
157
+ console.log(yellow('Some dependencies are incomplete, retrying with clean install...\n'));
158
+ const nm = resolve(ROOT, 'app', 'node_modules');
159
+ try {
160
+ assertNotSymlink(nm);
161
+ safeRmSync(nm, { recursive: true, force: true });
162
+ } catch (err) {
163
+ console.error(red(`SECURITY: Failed to verify safe deletion of node_modules: ${err}`));
164
+ process.exit(1);
165
+ }
166
+ run('npm install --no-workspaces', resolve(ROOT, 'app'));
167
+ if (!verifyDeps()) {
168
+ console.error(red('\n✘ Failed to install dependencies after retry.\n'));
169
+ const appDir = resolve(ROOT, 'app');
170
+ if (process.platform === 'win32') {
171
+ console.error(` Try manually: cd "${appDir}" && rmdir /s /q node_modules && npm install`);
172
+ } else {
173
+ console.error(` Try manually: cd ${appDir} && rm -rf node_modules && npm install`);
174
+ }
175
+ process.exit(1);
156
176
  }
157
- process.exit(1);
158
177
  }
159
- }
160
178
 
161
179
  writeDepsStamp();
162
180
  }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Channel Configuration - Pure JavaScript
3
+ * Owns all read/write of ~/.mindos/im.json
4
+ * No TypeScript imports (CLI bootstrap safety)
5
+ */
6
+
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ import { CHANNEL_FIELD_PATTERNS, CHANNEL_REQUIRED_FIELDS } from './channel-constants.js';
11
+
12
+ const IM_CONFIG_DIR = path.join(os.homedir(), '.mindos');
13
+ const IM_CONFIG_PATH = path.join(IM_CONFIG_DIR, 'im.json');
14
+
15
+ const EMPTY_CONFIG = { providers: {} };
16
+
17
+ let cachedConfig = EMPTY_CONFIG;
18
+ let cachedMtime = 0;
19
+
20
+ /**
21
+ * Read IM config from ~/.mindos/im.json
22
+ * Implements mtime-based caching (same as app/lib/im/config.ts)
23
+ * @returns {Record<string, any>}
24
+ */
25
+ export function readChannelConfig() {
26
+ let mtime = 0;
27
+ try {
28
+ mtime = fs.statSync(IM_CONFIG_PATH).mtimeMs;
29
+ } catch {
30
+ return EMPTY_CONFIG;
31
+ }
32
+
33
+ if (mtime > 0 && mtime === cachedMtime) {
34
+ return cachedConfig;
35
+ }
36
+
37
+ if (!fs.existsSync(IM_CONFIG_PATH)) {
38
+ cachedConfig = EMPTY_CONFIG;
39
+ cachedMtime = 0;
40
+ return EMPTY_CONFIG;
41
+ }
42
+
43
+ try {
44
+ const raw = fs.readFileSync(IM_CONFIG_PATH, 'utf-8');
45
+ const parsed = JSON.parse(raw);
46
+ if (!parsed || typeof parsed !== 'object' || typeof parsed.providers !== 'object') {
47
+ console.warn('[channel] im.json has invalid structure, using empty config');
48
+ cachedConfig = EMPTY_CONFIG;
49
+ } else {
50
+ cachedConfig = parsed;
51
+ }
52
+ cachedMtime = mtime;
53
+ return cachedConfig;
54
+ } catch (err) {
55
+ console.warn('[channel] Failed to parse im.json:', err instanceof Error ? err.message : err);
56
+ cachedConfig = EMPTY_CONFIG;
57
+ cachedMtime = 0;
58
+ return EMPTY_CONFIG;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Write IM config atomically
64
+ * Sets 0o600 permissions on Unix
65
+ * @param {Record<string, any>} config
66
+ */
67
+ export function writeChannelConfig(config, options = {}) {
68
+ const expectedMtime = options.expectedMtime ?? null;
69
+ const currentMtime = getChannelConfigMtime();
70
+
71
+ if (expectedMtime !== null && currentMtime !== expectedMtime) {
72
+ throw new Error('Configuration changed on disk. Retry your command.');
73
+ }
74
+
75
+ fs.mkdirSync(IM_CONFIG_DIR, { recursive: true });
76
+ const content = JSON.stringify(config, null, 2) + '\n';
77
+ const tmpPath = IM_CONFIG_PATH + '.tmp';
78
+ fs.writeFileSync(tmpPath, content, 'utf-8');
79
+ fs.renameSync(tmpPath, IM_CONFIG_PATH);
80
+ if (process.platform !== 'win32') {
81
+ try {
82
+ fs.chmodSync(IM_CONFIG_PATH, 0o600);
83
+ } catch {
84
+ // best effort
85
+ }
86
+ }
87
+
88
+ const writtenRaw = fs.readFileSync(IM_CONFIG_PATH, 'utf-8');
89
+ const writtenConfig = JSON.parse(writtenRaw);
90
+ if (JSON.stringify(writtenConfig) !== JSON.stringify(config)) {
91
+ throw new Error('Config write validation failed. Retry your command.');
92
+ }
93
+
94
+ cachedConfig = config;
95
+ cachedMtime = fs.statSync(IM_CONFIG_PATH).mtimeMs;
96
+ }
97
+
98
+ /**
99
+ * Validate platform config (per-platform validation rules)
100
+ * Pure JavaScript implementation (mirrors app/lib/im/config.ts)
101
+ * @param {string} platform
102
+ * @param {Record<string, any>} config
103
+ * @returns {{valid: boolean, missing?: string[]}}
104
+ */
105
+ export function validateChannelConfig(platform, config) {
106
+ if (!config || typeof config !== 'object') {
107
+ return { valid: false, missing: ['(no config)'] };
108
+ }
109
+
110
+ const c = config;
111
+
112
+ const required = CHANNEL_REQUIRED_FIELDS[platform];
113
+
114
+ if (!required) {
115
+ return { valid: false, missing: ['(unknown platform)'] };
116
+ }
117
+
118
+ if (platform === 'wecom') {
119
+ if (typeof c.webhook_key === 'string' && c.webhook_key) return { valid: true };
120
+ const missing = ['corp_id', 'corp_secret'].filter((f) => typeof c[f] !== 'string' || !String(c[f]).trim());
121
+ return missing.length === 0 ? { valid: true } : { valid: false, missing };
122
+ }
123
+
124
+ if (platform === 'dingtalk') {
125
+ if (typeof c.webhook_url === 'string' && c.webhook_url) return { valid: true };
126
+ const missing = ['client_id', 'client_secret'].filter((f) => typeof c[f] !== 'string' || !String(c[f]).trim());
127
+ return missing.length === 0 ? { valid: true } : { valid: false, missing };
128
+ }
129
+
130
+ const platformPatterns = CHANNEL_FIELD_PATTERNS[platform] || {};
131
+ const missing = required.filter((f) => {
132
+ const val = c[f];
133
+ if (typeof val !== 'string' || !val.trim()) return true;
134
+ const pattern = platformPatterns[f];
135
+ if (pattern && !pattern.test(val)) return true;
136
+ return false;
137
+ });
138
+
139
+ return missing.length === 0 ? { valid: true } : { valid: false, missing };
140
+ }
141
+
142
+ /**
143
+ * Get list of configured platforms
144
+ * @returns {string[]}
145
+ */
146
+ export function getConfiguredPlatforms() {
147
+ const config = readChannelConfig();
148
+ return Object.keys(config.providers || {}).filter((platform) => {
149
+ const validation = validateChannelConfig(platform, config.providers[platform]);
150
+ return validation.valid;
151
+ });
152
+ }
153
+
154
+ export function getChannelConfigMtime() {
155
+ try {
156
+ return fs.statSync(IM_CONFIG_PATH).mtimeMs;
157
+ } catch {
158
+ return 0;
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Reset config cache (for testing)
164
+ */
165
+ export function _resetConfigCache() {
166
+ cachedConfig = EMPTY_CONFIG;
167
+ cachedMtime = 0;
168
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Shared channel CLI constants.
3
+ * Keep this file data-only so command/config/validation layers stay aligned.
4
+ */
5
+
6
+ export const CHANNEL_PLATFORMS = [
7
+ 'telegram',
8
+ 'discord',
9
+ 'feishu',
10
+ 'slack',
11
+ 'wecom',
12
+ 'dingtalk',
13
+ 'wechat',
14
+ 'qq',
15
+ ];
16
+
17
+ export const CHANNEL_REQUIRED_FIELDS = {
18
+ telegram: ['bot_token'],
19
+ discord: ['bot_token'],
20
+ feishu: ['app_id', 'app_secret'],
21
+ slack: ['bot_token'],
22
+ wecom: [],
23
+ dingtalk: [],
24
+ wechat: ['bot_token'],
25
+ qq: ['app_id', 'app_secret'],
26
+ };
27
+
28
+ export const CHANNEL_FIELD_PATTERNS = {
29
+ telegram: {
30
+ bot_token: /^\d+:[A-Za-z0-9_-]{25,}$/,
31
+ },
32
+ discord: {
33
+ bot_token: /^[A-Za-z0-9._-]{20,}$/,
34
+ },
35
+ slack: {
36
+ bot_token: /^xoxb-/,
37
+ },
38
+ };
39
+
40
+ export const CHANNEL_FIELD_EXAMPLES = {
41
+ telegram: {
42
+ bot_token: '123456789:ABCdefGHIjklMNOpqrSTUvwxYZ',
43
+ },
44
+ slack: {
45
+ bot_token: 'xoxb-1234567890-1234567890-abcdef',
46
+ },
47
+ };
48
+
49
+ export const CHANNEL_PLATFORM_HELP = {
50
+ telegram: {
51
+ bot_token: 'Get from @BotFather on Telegram (https://core.telegram.org/bots)',
52
+ },
53
+ discord: {
54
+ bot_token: 'Get from Discord Developer Portal (https://discord.com/developers)',
55
+ },
56
+ feishu: {
57
+ app_id: 'Get from Feishu Admin Console',
58
+ app_secret: 'Get from Feishu Admin Console',
59
+ },
60
+ slack: {
61
+ bot_token: 'Get from Slack API settings (https://api.slack.com/apps)',
62
+ },
63
+ wecom: {
64
+ webhook_key: 'Or use corp_id + corp_secret from WeCom admin',
65
+ },
66
+ dingtalk: {
67
+ client_id: 'Or use webhook_url from DingTalk Developer Console',
68
+ client_secret: 'Used with client_id when not using webhook_url',
69
+ },
70
+ wechat: {
71
+ bot_token: 'Get via ClawBot QR scan',
72
+ },
73
+ qq: {
74
+ app_id: 'Get from QQ Open Platform',
75
+ app_secret: 'Get from QQ Open Platform',
76
+ },
77
+ };
78
+
79
+ export const CHANNEL_PLATFORM_EMOJIS = {
80
+ telegram: '✈️',
81
+ discord: '🟣',
82
+ feishu: '🎎',
83
+ slack: '#️⃣',
84
+ wecom: '💼',
85
+ dingtalk: '🔔',
86
+ wechat: '💬',
87
+ qq: '🐧',
88
+ };