@geminilight/mindos 0.6.76 → 0.6.77

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 (425) 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 +30 -28
  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 +4 -4
  10. package/_standalone/.next/required-server-files.json +2 -1
  11. package/_standalone/.next/routes-manifest.json +12 -0
  12. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  14. package/_standalone/.next/server/app/_global-error.html +2 -2
  15. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  23. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  24. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  27. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js +1 -1
  29. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  30. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  43. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/ask/route.js +2 -2
  47. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  48. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/embedding/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  61. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/im/activity/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/im/feishu/long-connection/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/im/feishu/long-connection/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/im/status/route.js.nft.json +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/im/webhook/feishu/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/im/webhook/feishu/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/im/webhook-status/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/im/webhook-status/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  94. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  96. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  105. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/obsidian/compat-report/route.js +1 -0
  107. package/_standalone/.next/server/app/api/obsidian/compat-report/route.js.nft.json +1 -0
  108. package/_standalone/.next/server/app/api/obsidian/compat-report/route_client-reference-manifest.js +1 -0
  109. package/_standalone/.next/server/app/api/obsidian/import/route.js +1 -0
  110. package/_standalone/.next/server/app/api/obsidian/import/route.js.nft.json +1 -0
  111. package/_standalone/.next/server/app/api/obsidian/import/route_client-reference-manifest.js +1 -0
  112. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/api/setup/check-path/route.js +1 -1
  123. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/api/setup/ls/route.js +1 -1
  127. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  129. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  137. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/changelog/page.js +1 -1
  143. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/changes/page.js +1 -1
  146. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  149. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/echo/page.js +1 -1
  152. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app/explore/page.js +1 -1
  155. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  156. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  157. package/_standalone/.next/server/app/help/page.js +1 -1
  158. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  159. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  160. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  161. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  162. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/app/login/page.js +1 -1
  164. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  165. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/app/page.js +1 -1
  167. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  168. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  169. package/_standalone/.next/server/app/setup/page.js +2 -2
  170. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  171. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/app/trash/page.js +3 -3
  173. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  174. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  175. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  176. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  177. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  178. package/_standalone/.next/server/app-paths-manifest.json +30 -28
  179. package/_standalone/.next/server/chunks/4802.js +16 -16
  180. package/_standalone/.next/server/chunks/5299.js +1 -1
  181. package/_standalone/.next/server/chunks/{7686.js → 5913.js} +3 -3
  182. package/_standalone/.next/server/chunks/7531.js +1 -0
  183. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  184. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  185. package/_standalone/.next/server/pages/500.html +2 -2
  186. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  187. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  188. package/_standalone/.next/static/chunks/{5358-15ceeb8c1cd9889d.js → 5358-ac2733e1433981be.js} +2 -2
  189. package/_standalone/.next/static/chunks/{5581-c3be891101a3e511.js → 5581-c29703cc06a6c8dc.js} +2 -2
  190. package/_standalone/.next/static/chunks/{5484.a70877a2667d0779.js → 7011.223941e5ce187180.js} +2 -2
  191. package/_standalone/.next/static/chunks/{4878.ad1f431d34ff03fc.js → 8954.b927d1b38b3c3878.js} +1 -1
  192. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-6359573cc0d7ff3b.js +1 -0
  193. package/_standalone/.next/static/chunks/app/_global-error/page-6359573cc0d7ff3b.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-6359573cc0d7ff3b.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-6359573cc0d7ff3b.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-6359573cc0d7ff3b.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/a2a/route-6359573cc0d7ff3b.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/acp/config/route-6359573cc0d7ff3b.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/acp/detect/route-6359573cc0d7ff3b.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/acp/install/route-6359573cc0d7ff3b.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/acp/registry/route-6359573cc0d7ff3b.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/acp/session/route-6359573cc0d7ff3b.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/agent-activity/route-6359573cc0d7ff3b.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-6359573cc0d7ff3b.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-6359573cc0d7ff3b.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/agents/custom/route-6359573cc0d7ff3b.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/ask/route-6359573cc0d7ff3b.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-6359573cc0d7ff3b.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/auth/route-6359573cc0d7ff3b.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/backlinks/route-6359573cc0d7ff3b.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/bootstrap/route-6359573cc0d7ff3b.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/changes/route-6359573cc0d7ff3b.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/channels/verify/route-6359573cc0d7ff3b.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/connect/route-6359573cc0d7ff3b.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/embedding/route-6359573cc0d7ff3b.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/export/route-6359573cc0d7ff3b.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-6359573cc0d7ff3b.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/file/import/route-6359573cc0d7ff3b.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/file/raw/route-6359573cc0d7ff3b.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/file/route-6359573cc0d7ff3b.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/files/route-6359573cc0d7ff3b.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/git/route-6359573cc0d7ff3b.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/graph/route-6359573cc0d7ff3b.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/health/route-6359573cc0d7ff3b.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/im/activity/route-6359573cc0d7ff3b.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/im/config/route-6359573cc0d7ff3b.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/im/feishu/long-connection/route-6359573cc0d7ff3b.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/im/status/route-6359573cc0d7ff3b.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/im/test/route-6359573cc0d7ff3b.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/im/webhook/feishu/route-6359573cc0d7ff3b.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/webhook-status/route-6359573cc0d7ff3b.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-6359573cc0d7ff3b.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/inbox/route-6359573cc0d7ff3b.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/init/route-6359573cc0d7ff3b.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/lint/route-6359573cc0d7ff3b.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-6359573cc0d7ff3b.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-6359573cc0d7ff3b.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/install/route-6359573cc0d7ff3b.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-6359573cc0d7ff3b.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-6359573cc0d7ff3b.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/status/route-6359573cc0d7ff3b.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-6359573cc0d7ff3b.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-6359573cc0d7ff3b.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/monitoring/route-6359573cc0d7ff3b.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/obsidian/compat-report/route-6359573cc0d7ff3b.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/obsidian/import/route-6359573cc0d7ff3b.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/recent-files/route-6359573cc0d7ff3b.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/restart/route-6359573cc0d7ff3b.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/search/route-6359573cc0d7ff3b.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-6359573cc0d7ff3b.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-6359573cc0d7ff3b.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/route-6359573cc0d7ff3b.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-6359573cc0d7ff3b.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-6359573cc0d7ff3b.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-6359573cc0d7ff3b.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-6359573cc0d7ff3b.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/ls/route-6359573cc0d7ff3b.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/setup/route-6359573cc0d7ff3b.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/skills/route-6359573cc0d7ff3b.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/space-overview/route-6359573cc0d7ff3b.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/sync/route-6359573cc0d7ff3b.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/tree-version/route-6359573cc0d7ff3b.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/uninstall/route-6359573cc0d7ff3b.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update/route-6359573cc0d7ff3b.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-check/route-6359573cc0d7ff3b.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/update-status/route-6359573cc0d7ff3b.js +1 -0
  267. package/_standalone/.next/static/chunks/app/api/workflows/route-6359573cc0d7ff3b.js +1 -0
  268. package/_standalone/.next/static/chunks/app/changes/page-6359573cc0d7ff3b.js +1 -0
  269. package/_standalone/.next/static/chunks/app/echo/page-6359573cc0d7ff3b.js +1 -0
  270. package/_standalone/.next/static/chunks/app/{layout-55af7e1870f7d59b.js → layout-d17d1ec3d728ab91.js} +15 -15
  271. package/_standalone/.next/static/chunks/app/loading-6359573cc0d7ff3b.js +1 -0
  272. package/_standalone/.next/static/chunks/app/setup/page-6135642c48cbf4e8.js +1 -0
  273. package/_standalone/.next/static/chunks/app/trash/page-9b2798b1cd1c53e3.js +1 -0
  274. package/_standalone/.next/static/chunks/app/view/[...path]/loading-6359573cc0d7ff3b.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/{page-6791166d03535cb7.js → page-283e9e8b07c8949e.js} +2 -2
  276. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-6359573cc0d7ff3b.js +1 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-6359573cc0d7ff3b.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-6359573cc0d7ff3b.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6359573cc0d7ff3b.js +1 -0
  280. package/_standalone/.next/static/chunks/webpack-8cda3cd172a0535c.js +1 -0
  281. package/_standalone/.next/static/xTjrONxqaI_ZUUPRRKA_X/_buildManifest.js +1 -0
  282. package/_standalone/.next/trace +72 -72
  283. package/_standalone/.next/types/routes.d.ts +3 -1
  284. package/_standalone/.next/types/validator.ts +18 -0
  285. package/_standalone/__tests__/acp/subprocess.test.ts +80 -0
  286. package/_standalone/__tests__/api/acp-detect.test.ts +4 -3
  287. package/_standalone/__tests__/api/obsidian-compat-report.test.ts +62 -0
  288. package/_standalone/__tests__/api/obsidian-import.test.ts +89 -0
  289. package/_standalone/__tests__/api/setup-path-utils.test.ts +188 -0
  290. package/_standalone/__tests__/ask/agent-selector-capsule.test.tsx +34 -0
  291. package/_standalone/__tests__/ask/ask-content-agent-capsule-visibility.test.tsx +195 -0
  292. package/_standalone/__tests__/fixtures/obsidian-community-fixtures.ts +92 -0
  293. package/_standalone/__tests__/obsidian-compat/community-smoke.test.ts +62 -0
  294. package/_standalone/__tests__/obsidian-compat/obsidian-import.test.ts +126 -0
  295. package/_standalone/__tests__/obsidian-compat/plugin-manager.test.ts +28 -0
  296. package/_standalone/__tests__/scripts/extract-pdf-runtime.test.ts +139 -0
  297. package/_standalone/components/ask/AgentSelectorCapsule.tsx +5 -4
  298. package/_standalone/components/ask/AskContent.tsx +1 -1
  299. package/_standalone/components/setup/StepKB.tsx +66 -17
  300. package/_standalone/lib/obsidian-compat/index.ts +1 -0
  301. package/_standalone/lib/obsidian-compat/plugin-manager.ts +13 -0
  302. package/_standalone/next.config.ts +2 -0
  303. package/_standalone/package-lock.json +2 -2
  304. package/_standalone/package.json +1 -1
  305. package/_standalone/server.js +1 -1
  306. package/_standalone/tsconfig.tsbuildinfo +1 -1
  307. package/app/__tests__/acp/subprocess.test.ts +80 -0
  308. package/app/__tests__/api/acp-detect.test.ts +4 -3
  309. package/app/__tests__/api/obsidian-compat-report.test.ts +62 -0
  310. package/app/__tests__/api/obsidian-import.test.ts +89 -0
  311. package/app/__tests__/api/setup-path-utils.test.ts +188 -0
  312. package/app/__tests__/ask/agent-selector-capsule.test.tsx +34 -0
  313. package/app/__tests__/ask/ask-content-agent-capsule-visibility.test.tsx +195 -0
  314. package/app/__tests__/fixtures/obsidian-community-fixtures.ts +92 -0
  315. package/app/__tests__/obsidian-compat/community-smoke.test.ts +62 -0
  316. package/app/__tests__/obsidian-compat/obsidian-import.test.ts +126 -0
  317. package/app/__tests__/obsidian-compat/plugin-manager.test.ts +28 -0
  318. package/app/__tests__/scripts/extract-pdf-runtime.test.ts +139 -0
  319. package/app/app/api/obsidian/compat-report/route.ts +33 -0
  320. package/app/app/api/obsidian/import/route.ts +37 -0
  321. package/app/app/api/setup/check-path/route.ts +16 -2
  322. package/app/app/api/setup/path-utils.ts +123 -1
  323. package/app/app/api/setup/route.ts +11 -1
  324. package/app/components/ask/AgentSelectorCapsule.tsx +5 -4
  325. package/app/components/ask/AskContent.tsx +1 -1
  326. package/app/components/setup/StepKB.tsx +66 -17
  327. package/app/components/setup/index.tsx +19 -1
  328. package/app/lib/acp/detect-local.ts +105 -24
  329. package/app/lib/acp/subprocess.ts +2 -1
  330. package/app/lib/i18n/modules/onboarding.ts +2 -0
  331. package/app/lib/obsidian-compat/index.ts +1 -0
  332. package/app/lib/obsidian-compat/obsidian-import.ts +118 -0
  333. package/app/lib/obsidian-compat/plugin-manager.ts +13 -0
  334. package/app/next.config.ts +2 -0
  335. package/app/package.json +1 -1
  336. package/package.json +1 -1
  337. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-6d0a0465c7af74d1.js +0 -1
  338. package/_standalone/.next/static/chunks/app/_global-error/page-6d0a0465c7af74d1.js +0 -1
  339. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-6d0a0465c7af74d1.js +0 -1
  340. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-6d0a0465c7af74d1.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-6d0a0465c7af74d1.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/a2a/route-6d0a0465c7af74d1.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/acp/config/route-6d0a0465c7af74d1.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/acp/detect/route-6d0a0465c7af74d1.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/acp/install/route-6d0a0465c7af74d1.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/acp/registry/route-6d0a0465c7af74d1.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/acp/session/route-6d0a0465c7af74d1.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/agent-activity/route-6d0a0465c7af74d1.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-6d0a0465c7af74d1.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-6d0a0465c7af74d1.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/agents/custom/route-6d0a0465c7af74d1.js +0 -1
  352. package/_standalone/.next/static/chunks/app/api/ask/route-6d0a0465c7af74d1.js +0 -1
  353. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-6d0a0465c7af74d1.js +0 -1
  354. package/_standalone/.next/static/chunks/app/api/auth/route-6d0a0465c7af74d1.js +0 -1
  355. package/_standalone/.next/static/chunks/app/api/backlinks/route-6d0a0465c7af74d1.js +0 -1
  356. package/_standalone/.next/static/chunks/app/api/bootstrap/route-6d0a0465c7af74d1.js +0 -1
  357. package/_standalone/.next/static/chunks/app/api/changes/route-6d0a0465c7af74d1.js +0 -1
  358. package/_standalone/.next/static/chunks/app/api/channels/verify/route-6d0a0465c7af74d1.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/connect/route-6d0a0465c7af74d1.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/embedding/route-6d0a0465c7af74d1.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/export/route-6d0a0465c7af74d1.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-6d0a0465c7af74d1.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/file/import/route-6d0a0465c7af74d1.js +0 -1
  364. package/_standalone/.next/static/chunks/app/api/file/raw/route-6d0a0465c7af74d1.js +0 -1
  365. package/_standalone/.next/static/chunks/app/api/file/route-6d0a0465c7af74d1.js +0 -1
  366. package/_standalone/.next/static/chunks/app/api/files/route-6d0a0465c7af74d1.js +0 -1
  367. package/_standalone/.next/static/chunks/app/api/git/route-6d0a0465c7af74d1.js +0 -1
  368. package/_standalone/.next/static/chunks/app/api/graph/route-6d0a0465c7af74d1.js +0 -1
  369. package/_standalone/.next/static/chunks/app/api/health/route-6d0a0465c7af74d1.js +0 -1
  370. package/_standalone/.next/static/chunks/app/api/im/activity/route-6d0a0465c7af74d1.js +0 -1
  371. package/_standalone/.next/static/chunks/app/api/im/config/route-6d0a0465c7af74d1.js +0 -1
  372. package/_standalone/.next/static/chunks/app/api/im/feishu/long-connection/route-6d0a0465c7af74d1.js +0 -1
  373. package/_standalone/.next/static/chunks/app/api/im/status/route-6d0a0465c7af74d1.js +0 -1
  374. package/_standalone/.next/static/chunks/app/api/im/test/route-6d0a0465c7af74d1.js +0 -1
  375. package/_standalone/.next/static/chunks/app/api/im/webhook/feishu/route-6d0a0465c7af74d1.js +0 -1
  376. package/_standalone/.next/static/chunks/app/api/im/webhook-status/route-6d0a0465c7af74d1.js +0 -1
  377. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-6d0a0465c7af74d1.js +0 -1
  378. package/_standalone/.next/static/chunks/app/api/inbox/route-6d0a0465c7af74d1.js +0 -1
  379. package/_standalone/.next/static/chunks/app/api/init/route-6d0a0465c7af74d1.js +0 -1
  380. package/_standalone/.next/static/chunks/app/api/lint/route-6d0a0465c7af74d1.js +0 -1
  381. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-6d0a0465c7af74d1.js +0 -1
  382. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-6d0a0465c7af74d1.js +0 -1
  383. package/_standalone/.next/static/chunks/app/api/mcp/install/route-6d0a0465c7af74d1.js +0 -1
  384. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-6d0a0465c7af74d1.js +0 -1
  385. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-6d0a0465c7af74d1.js +0 -1
  386. package/_standalone/.next/static/chunks/app/api/mcp/status/route-6d0a0465c7af74d1.js +0 -1
  387. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-6d0a0465c7af74d1.js +0 -1
  388. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-6d0a0465c7af74d1.js +0 -1
  389. package/_standalone/.next/static/chunks/app/api/monitoring/route-6d0a0465c7af74d1.js +0 -1
  390. package/_standalone/.next/static/chunks/app/api/recent-files/route-6d0a0465c7af74d1.js +0 -1
  391. package/_standalone/.next/static/chunks/app/api/restart/route-6d0a0465c7af74d1.js +0 -1
  392. package/_standalone/.next/static/chunks/app/api/search/route-6d0a0465c7af74d1.js +0 -1
  393. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-6d0a0465c7af74d1.js +0 -1
  394. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-6d0a0465c7af74d1.js +0 -1
  395. package/_standalone/.next/static/chunks/app/api/settings/route-6d0a0465c7af74d1.js +0 -1
  396. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-6d0a0465c7af74d1.js +0 -1
  397. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-6d0a0465c7af74d1.js +0 -1
  398. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-6d0a0465c7af74d1.js +0 -1
  399. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-6d0a0465c7af74d1.js +0 -1
  400. package/_standalone/.next/static/chunks/app/api/setup/ls/route-6d0a0465c7af74d1.js +0 -1
  401. package/_standalone/.next/static/chunks/app/api/setup/route-6d0a0465c7af74d1.js +0 -1
  402. package/_standalone/.next/static/chunks/app/api/skills/route-6d0a0465c7af74d1.js +0 -1
  403. package/_standalone/.next/static/chunks/app/api/space-overview/route-6d0a0465c7af74d1.js +0 -1
  404. package/_standalone/.next/static/chunks/app/api/sync/route-6d0a0465c7af74d1.js +0 -1
  405. package/_standalone/.next/static/chunks/app/api/tree-version/route-6d0a0465c7af74d1.js +0 -1
  406. package/_standalone/.next/static/chunks/app/api/uninstall/route-6d0a0465c7af74d1.js +0 -1
  407. package/_standalone/.next/static/chunks/app/api/update/route-6d0a0465c7af74d1.js +0 -1
  408. package/_standalone/.next/static/chunks/app/api/update-check/route-6d0a0465c7af74d1.js +0 -1
  409. package/_standalone/.next/static/chunks/app/api/update-status/route-6d0a0465c7af74d1.js +0 -1
  410. package/_standalone/.next/static/chunks/app/api/workflows/route-6d0a0465c7af74d1.js +0 -1
  411. package/_standalone/.next/static/chunks/app/changes/page-6d0a0465c7af74d1.js +0 -1
  412. package/_standalone/.next/static/chunks/app/echo/page-6d0a0465c7af74d1.js +0 -1
  413. package/_standalone/.next/static/chunks/app/loading-6d0a0465c7af74d1.js +0 -1
  414. package/_standalone/.next/static/chunks/app/setup/page-64d7fa097ef3f367.js +0 -1
  415. package/_standalone/.next/static/chunks/app/trash/page-77dfe3df94abafb4.js +0 -1
  416. package/_standalone/.next/static/chunks/app/view/[...path]/loading-6d0a0465c7af74d1.js +0 -1
  417. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-6d0a0465c7af74d1.js +0 -1
  418. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-6d0a0465c7af74d1.js +0 -1
  419. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-6d0a0465c7af74d1.js +0 -1
  420. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6d0a0465c7af74d1.js +0 -1
  421. package/_standalone/.next/static/chunks/webpack-aeeb4e3ebba9ef3c.js +0 -1
  422. package/_standalone/.next/static/f4SL2Rxm_VRCg6oVg9EuX/_buildManifest.js +0 -1
  423. package/_standalone/lib/obsidian-compat/compatibility-report.ts +0 -131
  424. package/_standalone/lib/obsidian-compat/manifest.ts +0 -90
  425. /package/_standalone/.next/static/{f4SL2Rxm_VRCg6oVg9EuX → xTjrONxqaI_ZUUPRRKA_X}/_ssgManifest.js +0 -0
@@ -0,0 +1,80 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { execFileSync, spawn } from 'child_process';
3
+ import { spawnAcpAgent } from '../../lib/acp/subprocess';
4
+
5
+ vi.mock('child_process', () => ({
6
+ spawn: vi.fn(),
7
+ execFile: vi.fn(),
8
+ execFileSync: vi.fn(),
9
+ }));
10
+
11
+ const mockSpawn = vi.mocked(spawn);
12
+ const mockExecFileSync = vi.mocked(execFileSync);
13
+
14
+ function makeChildProcess() {
15
+ return {
16
+ pid: 4321,
17
+ stdin: {},
18
+ stdout: {},
19
+ stderr: { on: vi.fn() },
20
+ on: vi.fn(),
21
+ } as any;
22
+ }
23
+
24
+ describe('spawnAcpAgent', () => {
25
+ const originalPlatform = process.platform;
26
+ const originalShell = process.env.SHELL;
27
+
28
+ beforeEach(() => {
29
+ mockExecFileSync.mockReset();
30
+ mockSpawn.mockReset();
31
+ mockSpawn.mockReturnValue(makeChildProcess());
32
+ });
33
+
34
+ afterEach(() => {
35
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
36
+ process.env.SHELL = originalShell;
37
+ });
38
+
39
+ it('spawns with the absolute executable resolved from the login shell on macOS', () => {
40
+ Object.defineProperty(process, 'platform', { value: 'darwin' });
41
+ process.env.SHELL = '/bin/zsh';
42
+
43
+ mockExecFileSync.mockImplementation((command, args) => {
44
+ if (command === 'which') throw new Error('not found');
45
+ if (command === '/bin/zsh' && Array.isArray(args) && String(args[1]).includes("command -v -- 'gemini'")) {
46
+ return '/Users/test/bin/gemini\n' as any;
47
+ }
48
+ throw new Error(`unexpected command: ${String(command)}`);
49
+ });
50
+
51
+ spawnAcpAgent({ id: 'gemini' } as any);
52
+
53
+ expect(mockSpawn).toHaveBeenCalledWith(
54
+ '/Users/test/bin/gemini',
55
+ ['--experimental-acp'],
56
+ expect.objectContaining({ shell: false }),
57
+ );
58
+ });
59
+
60
+ it('spawns Claude via the resolved npx executable instead of a bare command', () => {
61
+ Object.defineProperty(process, 'platform', { value: 'darwin' });
62
+ process.env.SHELL = '/bin/zsh';
63
+
64
+ mockExecFileSync.mockImplementation((command, args) => {
65
+ if (command === 'which') throw new Error('not found');
66
+ if (command === '/bin/zsh' && Array.isArray(args) && String(args[1]).includes("command -v -- 'npx'")) {
67
+ return '/Users/test/bin/npx\n' as any;
68
+ }
69
+ throw new Error(`unexpected command: ${String(command)}`);
70
+ });
71
+
72
+ spawnAcpAgent({ id: 'claude' } as any);
73
+
74
+ expect(mockSpawn).toHaveBeenCalledWith(
75
+ '/Users/test/bin/npx',
76
+ ['--yes', '@agentclientprotocol/claude-agent-acp'],
77
+ expect.objectContaining({ shell: false }),
78
+ );
79
+ });
80
+ });
@@ -36,7 +36,7 @@ describe('detectLocalAcpAgents', () => {
36
36
  expect(result.installed.some((agent) => agent.id === 'gemini' && agent.binaryPath === '/usr/local/bin/gemini')).toBe(true);
37
37
  });
38
38
 
39
- it('falls back to presence directories when PATH lookup fails', async () => {
39
+ it('does not mark directory-only detections as runnable when the launch command is unavailable', async () => {
40
40
  mockExecFile.mockImplementation((_command, _args, _options, callback) => {
41
41
  callback?.(new Error('not found'), '', '');
42
42
  return {} as never;
@@ -45,7 +45,8 @@ describe('detectLocalAcpAgents', () => {
45
45
 
46
46
  const result = await detectLocalAcpAgents({ acpAgents: {} } as any);
47
47
 
48
- expect(result.installed.some((agent) => agent.id === 'cursor' && agent.binaryPath.includes('.cursor/extensions'))).toBe(true);
48
+ expect(result.installed.some((agent) => agent.id === 'cursor')).toBe(false);
49
+ expect(result.notInstalled.some((agent) => agent.id === 'cursor')).toBe(true);
49
50
  });
50
51
 
51
52
  it('treats an override command path as installed even when it is outside PATH', async () => {
@@ -81,7 +82,7 @@ describe('detectLocalAcpAgents', () => {
81
82
  expect(result.installed.some((agent) => agent.id === 'gemini' && agent.binaryPath === 'C:\\Tools\\gemini.cmd')).toBe(true);
82
83
  });
83
84
 
84
- it('probes alternate command names such as qwen when the canonical binary is different', async () => {
85
+ it('can launch from an alternate detected executable when it matches the agent command family', async () => {
85
86
  mockExecFile.mockImplementation((_command, args, _options, callback) => {
86
87
  const binary = String(args?.[0] ?? '');
87
88
  const stdout = binary === 'qwen' ? '/usr/local/bin/qwen\n' : '';
@@ -0,0 +1,62 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { NextRequest } from 'next/server';
3
+
4
+ const scanObsidianVaultPlugins = vi.fn();
5
+
6
+ vi.mock('@/lib/obsidian-compat/obsidian-import', () => ({
7
+ scanObsidianVaultPlugins,
8
+ }));
9
+
10
+ async function importRoute() {
11
+ return import('../../app/api/obsidian/compat-report/route');
12
+ }
13
+
14
+ describe('GET /api/obsidian/compat-report', () => {
15
+ beforeEach(() => {
16
+ vi.clearAllMocks();
17
+ });
18
+
19
+ it('rejects missing vaultRoot', async () => {
20
+ const { GET } = await importRoute();
21
+ const req = new NextRequest('http://localhost/api/obsidian/compat-report');
22
+ const res = await GET(req);
23
+
24
+ expect(res.status).toBe(400);
25
+ expect(await res.json()).toEqual({ ok: false, error: 'Missing vaultRoot' });
26
+ });
27
+
28
+ it('expands ~/ paths and returns compatibility summary', async () => {
29
+ scanObsidianVaultPlugins.mockResolvedValue([
30
+ {
31
+ id: 'style-settings-like',
32
+ manifest: { id: 'style-settings-like', name: 'Style Settings', version: '1.0.0' },
33
+ sourceDir: '/tmp/vault/.obsidian/plugins/style-settings-like',
34
+ compatibilityLevel: 'compatible',
35
+ compatibility: { obsidianApis: ['PluginSettingTab'], nodeModules: [], supportedApis: ['PluginSettingTab'], partialApis: [], blockers: [] },
36
+ hasStyles: true,
37
+ hasData: true,
38
+ },
39
+ {
40
+ id: 'desktop-only-like',
41
+ manifest: { id: 'desktop-only-like', name: 'Desktop Only', version: '1.0.0' },
42
+ sourceDir: '/tmp/vault/.obsidian/plugins/desktop-only-like',
43
+ compatibilityLevel: 'blocked',
44
+ compatibility: { obsidianApis: ['Plugin'], nodeModules: ['electron'], supportedApis: ['Plugin'], partialApis: [], blockers: ['Requires unsupported runtime module: electron'] },
45
+ hasStyles: false,
46
+ hasData: false,
47
+ },
48
+ ]);
49
+
50
+ const { GET } = await importRoute();
51
+ const req = new NextRequest('http://localhost/api/obsidian/compat-report?vaultRoot=~/vault');
52
+ const res = await GET(req);
53
+ const json = await res.json();
54
+
55
+ expect(res.status).toBe(200);
56
+ expect(json.ok).toBe(true);
57
+ expect(json.summary).toEqual({ total: 2, compatible: 1, partial: 0, blocked: 1 });
58
+ expect(json.plugins).toHaveLength(2);
59
+ expect(scanObsidianVaultPlugins).toHaveBeenCalledTimes(1);
60
+ expect(scanObsidianVaultPlugins.mock.calls[0][0]).not.toContain('~/');
61
+ });
62
+ });
@@ -0,0 +1,89 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { NextRequest } from 'next/server';
3
+
4
+ const importObsidianPlugin = vi.fn();
5
+ const scanObsidianVaultPlugins = vi.fn();
6
+
7
+ vi.mock('@/lib/obsidian-compat/obsidian-import', () => ({
8
+ importObsidianPlugin,
9
+ scanObsidianVaultPlugins,
10
+ }));
11
+
12
+ async function importRoute() {
13
+ return import('../../app/api/obsidian/import/route');
14
+ }
15
+
16
+ describe('POST /api/obsidian/import', () => {
17
+ beforeEach(() => {
18
+ vi.clearAllMocks();
19
+ });
20
+
21
+ it('rejects missing vaultRoot or pluginId', async () => {
22
+ const { POST } = await importRoute();
23
+ const req = new NextRequest('http://localhost/api/obsidian/import', {
24
+ method: 'POST',
25
+ body: JSON.stringify({ vaultRoot: '~/vault' }),
26
+ headers: { 'content-type': 'application/json' },
27
+ });
28
+
29
+ const res = await POST(req);
30
+ expect(res.status).toBe(400);
31
+ expect(await res.json()).toEqual({ ok: false, error: 'Missing vaultRoot or pluginId' });
32
+ });
33
+
34
+ it('imports a plugin and returns compatibility details', async () => {
35
+ scanObsidianVaultPlugins.mockResolvedValue([
36
+ {
37
+ id: 'quickadd-like',
38
+ manifest: { id: 'quickadd-like', name: 'QuickAdd', version: '1.0.0' },
39
+ sourceDir: '/tmp/vault/.obsidian/plugins/quickadd-like',
40
+ compatibilityLevel: 'compatible',
41
+ compatibility: {
42
+ obsidianApis: ['Plugin', 'Modal', 'Notice', 'addCommand'],
43
+ nodeModules: [],
44
+ supportedApis: ['Plugin', 'Modal', 'Notice', 'addCommand'],
45
+ partialApis: [],
46
+ blockers: [],
47
+ },
48
+ hasStyles: false,
49
+ hasData: true,
50
+ },
51
+ ]);
52
+ importObsidianPlugin.mockResolvedValue({
53
+ pluginId: 'quickadd-like',
54
+ targetDir: '/tmp/mindRoot/.plugins/quickadd-like',
55
+ });
56
+
57
+ const { POST } = await importRoute();
58
+ const req = new NextRequest('http://localhost/api/obsidian/import', {
59
+ method: 'POST',
60
+ body: JSON.stringify({ vaultRoot: '~/vault', pluginId: 'quickadd-like', targetMindRoot: '~/mindRoot' }),
61
+ headers: { 'content-type': 'application/json' },
62
+ });
63
+
64
+ const res = await POST(req);
65
+ const json = await res.json();
66
+
67
+ expect(res.status).toBe(200);
68
+ expect(json.ok).toBe(true);
69
+ expect(json.plugin.id).toBe('quickadd-like');
70
+ expect(json.plugin.compatibilityLevel).toBe('compatible');
71
+ expect(json.imported.targetDir).not.toContain('~/');
72
+ expect(importObsidianPlugin).toHaveBeenCalledTimes(1);
73
+ expect(scanObsidianVaultPlugins).toHaveBeenCalledTimes(1);
74
+ });
75
+
76
+ it('returns 404 when plugin is not found in the scanned vault', async () => {
77
+ scanObsidianVaultPlugins.mockResolvedValue([]);
78
+ const { POST } = await importRoute();
79
+ const req = new NextRequest('http://localhost/api/obsidian/import', {
80
+ method: 'POST',
81
+ body: JSON.stringify({ vaultRoot: '~/vault', pluginId: 'missing-plugin', targetMindRoot: '~/mindRoot' }),
82
+ headers: { 'content-type': 'application/json' },
83
+ });
84
+
85
+ const res = await POST(req);
86
+ expect(res.status).toBe(404);
87
+ expect(await res.json()).toEqual({ ok: false, error: 'Plugin not found in Obsidian vault' });
88
+ });
89
+ });
@@ -0,0 +1,188 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { validateMindRootPath, expandSetupPathHome } from '@/app/api/setup/path-utils';
3
+ import { homedir } from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ describe('path-utils', () => {
7
+ describe('expandSetupPathHome', () => {
8
+ it('expands ~ to home directory', () => {
9
+ expect(expandSetupPathHome('~')).toBe(homedir());
10
+ });
11
+
12
+ it('expands ~/path to home/path', () => {
13
+ expect(expandSetupPathHome('~/MindOS/mind')).toBe(path.resolve(homedir(), 'MindOS', 'mind'));
14
+ });
15
+
16
+ it('returns absolute paths unchanged', () => {
17
+ expect(expandSetupPathHome('/usr/local/share')).toBe('/usr/local/share');
18
+ });
19
+ });
20
+
21
+ describe('validateMindRootPath', () => {
22
+ const originalPlatform = process.platform;
23
+ const originalEnv = { ...process.env };
24
+
25
+ afterEach(() => {
26
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
27
+ process.env = { ...originalEnv };
28
+ });
29
+
30
+ describe('cross-platform: ~/.mindos/', () => {
31
+ it('rejects ~/.mindos directory', () => {
32
+ const result = validateMindRootPath(path.join(homedir(), '.mindos'));
33
+ expect(result.safe).toBe(false);
34
+ expect(result.reason).toContain('system directory');
35
+ });
36
+
37
+ it('rejects ~/.mindos/runtime', () => {
38
+ const result = validateMindRootPath(path.join(homedir(), '.mindos', 'runtime'));
39
+ expect(result.safe).toBe(false);
40
+ });
41
+
42
+ it('rejects ~/.mindos/config.json subdirectory', () => {
43
+ const result = validateMindRootPath(path.join(homedir(), '.mindos', 'config', 'kb'));
44
+ expect(result.safe).toBe(false);
45
+ });
46
+ });
47
+
48
+ describe('Windows-specific', () => {
49
+ beforeEach(() => {
50
+ Object.defineProperty(process, 'platform', { value: 'win32' });
51
+ process.env.APPDATA = 'C:/Users/Test/AppData/Roaming';
52
+ process.env.LOCALAPPDATA = 'C:/Users/Test/AppData/Local';
53
+ process.env.ProgramFiles = 'C:/Program Files';
54
+ process.env['ProgramFiles(x86)'] = 'C:/Program Files (x86)';
55
+ });
56
+
57
+ it('rejects AppData/MindOS', () => {
58
+ const result = validateMindRootPath('C:/Users/Test/AppData/Roaming/mindos/kb');
59
+ expect(result.safe).toBe(false);
60
+ expect(result.reason).toContain('Electron app data');
61
+ });
62
+
63
+ it('rejects LocalAppData/MindOS', () => {
64
+ const result = validateMindRootPath('C:/Users/Test/AppData/Local/mindos/data');
65
+ expect(result.safe).toBe(false);
66
+ });
67
+
68
+ it('rejects Program Files', () => {
69
+ const result = validateMindRootPath('C:/Program Files/MindOS/data');
70
+ expect(result.safe).toBe(false);
71
+ expect(result.reason).toContain('Program Files');
72
+ });
73
+
74
+ it('rejects Program Files (x86)', () => {
75
+ const result = validateMindRootPath('C:/Program Files (x86)/MindOS/kb');
76
+ expect(result.safe).toBe(false);
77
+ });
78
+
79
+ it('allows D:/MindOS/mind', () => {
80
+ const result = validateMindRootPath('D:/MindOS/mind');
81
+ expect(result.safe).toBe(true);
82
+ });
83
+
84
+ it('allows C:/Users/Test/Documents/MindOS', () => {
85
+ const result = validateMindRootPath('C:/Users/Test/Documents/MindOS');
86
+ expect(result.safe).toBe(true);
87
+ });
88
+ });
89
+
90
+ describe('macOS-specific', () => {
91
+ beforeEach(() => {
92
+ Object.defineProperty(process, 'platform', { value: 'darwin' });
93
+ });
94
+
95
+ it('rejects paths inside .app bundles', () => {
96
+ const result = validateMindRootPath('/Applications/MindOS.app/Contents/Resources/kb');
97
+ expect(result.safe).toBe(false);
98
+ expect(result.reason).toContain('.app bundle');
99
+ });
100
+
101
+ it('rejects /Applications/MindOS', () => {
102
+ const result = validateMindRootPath('/Applications/MindOS/data');
103
+ expect(result.safe).toBe(false);
104
+ });
105
+
106
+ it('allows ~/MindOS/mind', () => {
107
+ const result = validateMindRootPath(path.join(homedir(), 'MindOS', 'mind'));
108
+ expect(result.safe).toBe(true);
109
+ });
110
+
111
+ it('allows ~/Documents/MindOS', () => {
112
+ const result = validateMindRootPath(path.join(homedir(), 'Documents', 'MindOS'));
113
+ expect(result.safe).toBe(true);
114
+ });
115
+ });
116
+
117
+ describe('Linux-specific', () => {
118
+ beforeEach(() => {
119
+ Object.defineProperty(process, 'platform', { value: 'linux' });
120
+ });
121
+
122
+ it('rejects /opt/MindOS', () => {
123
+ const result = validateMindRootPath('/opt/mindos/data');
124
+ expect(result.safe).toBe(false);
125
+ });
126
+
127
+ it('rejects /usr/share/MindOS', () => {
128
+ const result = validateMindRootPath('/usr/share/mindos/kb');
129
+ expect(result.safe).toBe(false);
130
+ });
131
+
132
+ it('allows ~/MindOS/mind', () => {
133
+ const result = validateMindRootPath(path.join(homedir(), 'MindOS', 'mind'));
134
+ expect(result.safe).toBe(true);
135
+ });
136
+ });
137
+
138
+ describe('dynamic Desktop install directory', () => {
139
+ afterEach(() => {
140
+ delete process.env.MINDOS_INSTALL_DIR;
141
+ });
142
+
143
+ it('rejects install directory itself', () => {
144
+ process.env.MINDOS_INSTALL_DIR = 'D:/MindOS';
145
+ const result = validateMindRootPath('D:/MindOS');
146
+ expect(result.safe).toBe(false);
147
+ expect(result.reason).toContain('installation directory');
148
+ });
149
+
150
+ it('rejects paths inside install directory', () => {
151
+ process.env.MINDOS_INSTALL_DIR = 'D:/MindOS';
152
+ const result = validateMindRootPath('D:/MindOS/data/kb');
153
+ expect(result.safe).toBe(false);
154
+ expect(result.reason).toContain('reinstalling or uninstalling');
155
+ });
156
+
157
+ it('allows sibling paths outside install directory', () => {
158
+ process.env.MINDOS_INSTALL_DIR = 'D:/MindOS';
159
+ const result = validateMindRootPath('D:/MindOS-Data/kb');
160
+ expect(result.safe).toBe(true);
161
+ });
162
+
163
+ it('allows safe user data paths when install dir is set', () => {
164
+ process.env.MINDOS_INSTALL_DIR = 'D:/MindOS';
165
+ const result = validateMindRootPath('D:/MyNotes/MindOS');
166
+ expect(result.safe).toBe(true);
167
+ });
168
+ });
169
+
170
+ describe('safe paths', () => {
171
+ it('allows default ~/MindOS/mind', () => {
172
+ const result = validateMindRootPath(path.join(homedir(), 'MindOS', 'mind'));
173
+ expect(result.safe).toBe(true);
174
+ });
175
+
176
+ it('allows ~/Documents/notes', () => {
177
+ const result = validateMindRootPath(path.join(homedir(), 'Documents', 'notes'));
178
+ expect(result.safe).toBe(true);
179
+ });
180
+
181
+ it('allows /data/kb on Linux', () => {
182
+ Object.defineProperty(process, 'platform', { value: 'linux' });
183
+ const result = validateMindRootPath('/data/kb');
184
+ expect(result.safe).toBe(true);
185
+ });
186
+ });
187
+ });
188
+ });
@@ -0,0 +1,34 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ import React from 'react';
4
+ import { renderToStaticMarkup } from 'react-dom/server';
5
+ import AgentSelectorCapsule from '@/components/ask/AgentSelectorCapsule';
6
+
7
+ vi.mock('@/lib/stores/locale-store', () => ({
8
+ useLocale: () => ({
9
+ t: {
10
+ panels: {
11
+ agents: {
12
+ acpDefaultAgent: 'MindOS',
13
+ acpSelectAgent: 'Select Agent',
14
+ acpChangeAgent: 'Change agent',
15
+ },
16
+ },
17
+ },
18
+ }),
19
+ }));
20
+
21
+ describe('AgentSelectorCapsule', () => {
22
+ it('renders the default MindOS capsule even when no ACP agents are installed', () => {
23
+ const html = renderToStaticMarkup(
24
+ <AgentSelectorCapsule
25
+ selectedAgent={null}
26
+ onSelect={vi.fn()}
27
+ installedAgents={[]}
28
+ loading={false}
29
+ />,
30
+ );
31
+
32
+ expect(html).toContain('MindOS');
33
+ });
34
+ });
@@ -0,0 +1,195 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import React, { act } from 'react';
4
+ import { createRoot } from 'react-dom/client';
5
+ import AskContent from '@/components/ask/AskContent';
6
+
7
+ const mockInstalledAgents: Array<{ id: string; name: string; binaryPath: string }> = [];
8
+
9
+ vi.mock('@/lib/stores/locale-store', () => ({
10
+ useLocale: () => ({
11
+ t: {
12
+ ask: {
13
+ title: 'MindOS',
14
+ placeholder: 'Ask a question...',
15
+ send: 'send',
16
+ newlineHint: 'new line',
17
+ panelComposerResize: 'Resize input',
18
+ panelComposerResetHint: 'Double click reset',
19
+ panelComposerKeyboard: 'Arrow keys',
20
+ attachFile: 'attach file',
21
+ attachFileLabel: 'Document',
22
+ attachImageLabel: 'Image',
23
+ stopTitle: 'Stop',
24
+ cancelReconnect: 'Cancel reconnect',
25
+ connecting: 'connecting',
26
+ thinking: 'thinking',
27
+ generating: 'generating',
28
+ reconnecting: (attempt: number, max: number) => `retry ${attempt}/${max}`,
29
+ stopped: 'stopped',
30
+ errorNoResponse: 'no response',
31
+ emptyPrompt: 'empty',
32
+ suggestions: [],
33
+ copyMessage: 'Copy',
34
+ },
35
+ search: { close: 'close' },
36
+ hints: {
37
+ typeMessage: 'Type a message',
38
+ mentionInProgress: 'Mention or command in progress',
39
+ sessionHistory: 'Session history',
40
+ newSession: 'New session',
41
+ attachFile: 'Attach local file',
42
+ maximizePanel: 'Maximize panel',
43
+ restorePanel: 'Restore panel',
44
+ dockToSide: 'Dock to side panel',
45
+ openAsPopup: 'Open as popup',
46
+ closePanel: 'Close',
47
+ },
48
+ fileImport: { unsupported: 'Unsupported file type' },
49
+ panels: { agents: { acpDefaultAgent: 'MindOS' } },
50
+ },
51
+ }),
52
+ }));
53
+
54
+ vi.mock('@/hooks/useAskSession', () => ({
55
+ useAskSession: () => ({
56
+ messages: [],
57
+ sessions: [],
58
+ activeSession: null,
59
+ activeSessionId: 's1',
60
+ initSessions: vi.fn(),
61
+ persistSession: vi.fn(),
62
+ clearPersistTimer: vi.fn(),
63
+ setMessages: vi.fn(),
64
+ setSessionDefaultAcpAgent: vi.fn(),
65
+ resetSession: vi.fn(),
66
+ loadSession: vi.fn(),
67
+ deleteSession: vi.fn(),
68
+ renameSession: vi.fn(),
69
+ togglePinSession: vi.fn(),
70
+ clearAllSessions: vi.fn(),
71
+ }),
72
+ }));
73
+
74
+ vi.mock('@/hooks/useFileUpload', () => ({
75
+ useFileUpload: () => ({
76
+ localAttachments: [],
77
+ uploadError: '',
78
+ uploadInputRef: { current: null },
79
+ clearAttachments: vi.fn(),
80
+ removeAttachment: vi.fn(),
81
+ pickFiles: vi.fn(),
82
+ injectFiles: vi.fn(),
83
+ }),
84
+ }));
85
+
86
+ vi.mock('@/hooks/useImageUpload', () => ({
87
+ useImageUpload: () => ({
88
+ images: [],
89
+ imageError: '',
90
+ clearImages: vi.fn(),
91
+ removeImage: vi.fn(),
92
+ handlePaste: vi.fn(),
93
+ handleDrop: vi.fn(),
94
+ handleFileSelect: vi.fn(),
95
+ addImages: vi.fn(),
96
+ }),
97
+ }));
98
+
99
+ vi.mock('@/hooks/useMention', () => ({
100
+ useMention: () => ({
101
+ mentionQuery: null,
102
+ mentionResults: [],
103
+ mentionIndex: 0,
104
+ resetMention: vi.fn(),
105
+ updateMentionFromInput: vi.fn(),
106
+ navigateMention: vi.fn(),
107
+ }),
108
+ }));
109
+
110
+ vi.mock('@/hooks/useSlashCommand', () => ({
111
+ useSlashCommand: () => ({
112
+ slashQuery: null,
113
+ slashResults: [],
114
+ slashIndex: 0,
115
+ resetSlash: vi.fn(),
116
+ updateSlashFromInput: vi.fn(),
117
+ navigateSlash: vi.fn(),
118
+ }),
119
+ }));
120
+
121
+ vi.mock('@/hooks/useAcpDetection', () => ({
122
+ useAcpDetection: () => ({
123
+ installedAgents: mockInstalledAgents,
124
+ notInstalledAgents: [],
125
+ loading: false,
126
+ error: null,
127
+ refresh: vi.fn(),
128
+ }),
129
+ }));
130
+
131
+ vi.mock('@/hooks/useAskChat', () => ({
132
+ useAskChat: () => ({
133
+ isLoading: false,
134
+ isLoadingRef: { current: false },
135
+ loadingPhase: 'connecting',
136
+ reconnectAttempt: 0,
137
+ reconnectMaxRef: { current: 3 },
138
+ abortRef: { current: null },
139
+ firstMessageFired: { current: false },
140
+ submit: (e: Event) => e.preventDefault(),
141
+ stop: vi.fn(),
142
+ }),
143
+ }));
144
+
145
+ vi.mock('@/components/ask/MessageList', () => ({ default: () => <div /> }));
146
+ vi.mock('@/components/ask/MentionPopover', () => ({ default: () => null }));
147
+ vi.mock('@/components/ask/SlashCommandPopover', () => ({ default: () => null }));
148
+ vi.mock('@/components/ask/SessionHistory', () => ({ default: () => null }));
149
+ vi.mock('@/components/ask/SessionHistoryPanel', () => ({ default: () => null }));
150
+ vi.mock('@/components/ask/AskHeader', () => ({ default: () => <div /> }));
151
+ vi.mock('@/components/ask/FileChip', () => ({ default: () => null }));
152
+ vi.mock('@/components/ask/ModeCapsule', () => ({
153
+ default: () => <div data-testid="mode-capsule">mode</div>,
154
+ getPersistedMode: () => 'agent',
155
+ }));
156
+ vi.mock('@/components/ask/ProviderModelCapsule', () => ({
157
+ default: () => <div data-testid="provider-capsule">provider</div>,
158
+ getPersistedProviderModel: () => ({ provider: null, model: null }),
159
+ }));
160
+ vi.mock('@/components/ask/AgentSelectorCapsule', () => ({
161
+ default: ({ selectedAgent }: { selectedAgent: { id: string; name: string } | null }) => (
162
+ <div data-testid="agent-selector">{selectedAgent?.name ?? 'MindOS'}</div>
163
+ ),
164
+ }));
165
+ vi.mock('@/lib/utils', () => ({ cn: (...parts: Array<string | false | null | undefined>) => parts.filter(Boolean).join(' ') }));
166
+
167
+ describe('AskContent agent selector capsule visibility', () => {
168
+ beforeEach(() => {
169
+ vi.clearAllMocks();
170
+ mockInstalledAgents.length = 0;
171
+ (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true;
172
+ });
173
+
174
+ it('keeps the agent selector capsule visible in panel mode even with no detected ACP agents', async () => {
175
+ const host = document.createElement('div');
176
+ document.body.appendChild(host);
177
+ const root = createRoot(host);
178
+
179
+ await act(async () => {
180
+ root.render(<AskContent visible variant="panel" />);
181
+ });
182
+
183
+ await act(async () => {
184
+ await Promise.resolve();
185
+ });
186
+
187
+ expect(host.querySelector('[data-testid="mode-capsule"]')).toBeTruthy();
188
+ expect(host.querySelector('[data-testid="provider-capsule"]')).toBeTruthy();
189
+ expect(host.querySelector('[data-testid="agent-selector"]')?.textContent).toBe('MindOS');
190
+
191
+ await act(async () => {
192
+ root.unmount();
193
+ });
194
+ });
195
+ });