@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,92 @@
1
+ export interface ObsidianCommunityFixture {
2
+ pluginId: string;
3
+ displayName: string;
4
+ source: string;
5
+ code: string;
6
+ styles?: string;
7
+ expectedCompatibilityLevel: 'compatible' | 'partial' | 'blocked';
8
+ }
9
+
10
+ export const OBSIDIAN_COMMUNITY_FIXTURES: ObsidianCommunityFixture[] = [
11
+ {
12
+ pluginId: 'style-settings-like',
13
+ displayName: 'Style Settings-like',
14
+ source: 'https://github.com/obsidian-community/obsidian-style-settings',
15
+ expectedCompatibilityLevel: 'compatible',
16
+ styles: '.theme-accent { color: var(--amber); }',
17
+ code: `
18
+ const { Plugin, PluginSettingTab, Setting } = require('obsidian');
19
+ class StyleSettingsTab extends PluginSettingTab {
20
+ display() {
21
+ new Setting(this)
22
+ .setName('Theme accent')
23
+ .addDropdown((dropdown) => dropdown.addOption('amber', 'Amber').setValue('amber'));
24
+ }
25
+ }
26
+ module.exports = class StyleSettingsLike extends Plugin {
27
+ onload() {
28
+ this.addSettingTab(new StyleSettingsTab(this.app));
29
+ }
30
+ };
31
+ `,
32
+ },
33
+ {
34
+ pluginId: 'quickadd-like',
35
+ displayName: 'QuickAdd-like',
36
+ source: 'https://publish.obsidian.md/quickadd/ManualInstallation',
37
+ expectedCompatibilityLevel: 'compatible',
38
+ code: `
39
+ const { Plugin, Modal, Notice } = require('obsidian');
40
+ class CaptureModal extends Modal {}
41
+ module.exports = class QuickAddLike extends Plugin {
42
+ async onload() {
43
+ await this.saveData({ macros: [] });
44
+ this.addCommand({
45
+ id: 'capture',
46
+ name: 'Capture',
47
+ callback: () => new Notice('captured')
48
+ });
49
+ }
50
+ };
51
+ `,
52
+ },
53
+ {
54
+ pluginId: 'tag-wrangler-like',
55
+ displayName: 'Tag Wrangler-like',
56
+ source: 'https://publish.obsidian.md/hub/02+-+Community+Expansions/02.05+All+Community+Expansions/Plugins/tag-wrangler',
57
+ expectedCompatibilityLevel: 'compatible',
58
+ code: `
59
+ const { Plugin, Notice } = require('obsidian');
60
+ module.exports = class TagWranglerLike extends Plugin {
61
+ onload() {
62
+ this.addCommand({
63
+ id: 'rename-tag',
64
+ name: 'Rename Tag',
65
+ callback: () => {
66
+ this.app.metadataCache.getCache('notes/example.md');
67
+ new Notice('renamed');
68
+ }
69
+ });
70
+ }
71
+ };
72
+ `,
73
+ },
74
+ {
75
+ pluginId: 'homepage-like',
76
+ displayName: 'Homepage-like',
77
+ source: 'https://www.obsidianstats.com/plugins/homepage',
78
+ expectedCompatibilityLevel: 'compatible',
79
+ code: `
80
+ const { Plugin } = require('obsidian');
81
+ module.exports = class HomepageLike extends Plugin {
82
+ onload() {
83
+ this.addCommand({
84
+ id: 'open-homepage',
85
+ name: 'Open Homepage',
86
+ callback: () => this.app.workspace.openLinkText('Home', '')
87
+ });
88
+ }
89
+ };
90
+ `,
91
+ },
92
+ ];
@@ -0,0 +1,62 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import fs from 'fs';
3
+ import os from 'os';
4
+ import path from 'path';
5
+ import { analyzePluginCompatibility, getCompatibilityLevel } from '@/lib/obsidian-compat/compatibility-report';
6
+ import { PluginManager } from '@/lib/obsidian-compat/plugin-manager';
7
+ import { OBSIDIAN_COMMUNITY_FIXTURES } from '../fixtures/obsidian-community-fixtures';
8
+
9
+ let mindRoot: string;
10
+
11
+ function writePlugin(pluginId: string, mainJs: string, styles?: string) {
12
+ const pluginDir = path.join(mindRoot, '.plugins', pluginId);
13
+ fs.mkdirSync(pluginDir, { recursive: true });
14
+ fs.writeFileSync(
15
+ path.join(pluginDir, 'manifest.json'),
16
+ JSON.stringify({ id: pluginId, name: pluginId, version: '1.0.0' }, null, 2),
17
+ 'utf-8',
18
+ );
19
+ fs.writeFileSync(path.join(pluginDir, 'main.js'), mainJs, 'utf-8');
20
+ if (styles) {
21
+ fs.writeFileSync(path.join(pluginDir, 'styles.css'), styles, 'utf-8');
22
+ }
23
+ }
24
+
25
+ describe('community plugin smoke suite', () => {
26
+ beforeEach(() => {
27
+ mindRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-obsidian-community-'));
28
+ });
29
+
30
+ afterEach(() => {
31
+ fs.rmSync(mindRoot, { recursive: true, force: true });
32
+ });
33
+
34
+ for (const fixture of OBSIDIAN_COMMUNITY_FIXTURES) {
35
+ it(`classifies ${fixture.displayName} from ${fixture.source}`, async () => {
36
+ writePlugin(fixture.pluginId, fixture.code, fixture.styles);
37
+
38
+ const report = analyzePluginCompatibility(fixture.code);
39
+ expect(getCompatibilityLevel(report)).toBe(fixture.expectedCompatibilityLevel);
40
+
41
+ const manager = new PluginManager(mindRoot);
42
+ const plugins = await manager.discover();
43
+ const plugin = plugins.find((item) => item.id === fixture.pluginId);
44
+ expect(plugin).toMatchObject({ id: fixture.pluginId, compatibilityLevel: fixture.expectedCompatibilityLevel });
45
+ });
46
+ }
47
+
48
+ it('loads the QuickAdd-like fixture successfully', async () => {
49
+ const fixture = OBSIDIAN_COMMUNITY_FIXTURES.find((item) => item.pluginId === 'quickadd-like');
50
+ if (!fixture) throw new Error('Missing quickadd-like fixture');
51
+
52
+ writePlugin(fixture.pluginId, fixture.code, fixture.styles);
53
+
54
+ const manager = new PluginManager(mindRoot);
55
+ await manager.discover();
56
+ await manager.enable(fixture.pluginId);
57
+ const result = await manager.loadEnabledPlugins();
58
+
59
+ expect(result.loaded).toEqual([fixture.pluginId]);
60
+ expect(manager.list()[0]).toMatchObject({ compatibilityLevel: 'compatible', loaded: true });
61
+ });
62
+ });
@@ -0,0 +1,126 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import fs from 'fs';
3
+ import os from 'os';
4
+ import path from 'path';
5
+ import {
6
+ importObsidianPlugin,
7
+ scanObsidianVaultPlugins,
8
+ } from '@/lib/obsidian-compat/obsidian-import';
9
+
10
+ let vaultRoot: string;
11
+ let mindRoot: string;
12
+
13
+ const writeVaultPlugin = (
14
+ pluginId: string,
15
+ mainJs: string,
16
+ options?: { styles?: string; data?: object; manifest?: Record<string, unknown> },
17
+ ) => {
18
+ const pluginDir = path.join(vaultRoot, '.obsidian', 'plugins', pluginId);
19
+ fs.mkdirSync(pluginDir, { recursive: true });
20
+ fs.writeFileSync(
21
+ path.join(pluginDir, 'manifest.json'),
22
+ JSON.stringify(options?.manifest ?? { id: pluginId, name: pluginId, version: '1.0.0' }, null, 2),
23
+ 'utf-8',
24
+ );
25
+ fs.writeFileSync(path.join(pluginDir, 'main.js'), mainJs, 'utf-8');
26
+ if (options?.styles) {
27
+ fs.writeFileSync(path.join(pluginDir, 'styles.css'), options.styles, 'utf-8');
28
+ }
29
+ if (options?.data) {
30
+ fs.writeFileSync(path.join(pluginDir, 'data.json'), JSON.stringify(options.data, null, 2), 'utf-8');
31
+ }
32
+ };
33
+
34
+ describe('obsidian import scanner', () => {
35
+ beforeEach(() => {
36
+ vaultRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-obsidian-vault-source-'));
37
+ mindRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-obsidian-vault-target-'));
38
+ });
39
+
40
+ afterEach(() => {
41
+ fs.rmSync(vaultRoot, { recursive: true, force: true });
42
+ fs.rmSync(mindRoot, { recursive: true, force: true });
43
+ });
44
+
45
+ it('scans .obsidian/plugins and returns compatibility summaries', async () => {
46
+ writeVaultPlugin(
47
+ 'quickadd-like',
48
+ `
49
+ const { Plugin, Modal, Notice } = require('obsidian');
50
+ module.exports = class QuickAddLike extends Plugin {
51
+ onload() {
52
+ this.addCommand({ id: 'capture', name: 'Capture', callback: () => new Notice('ok') });
53
+ }
54
+ };
55
+ `,
56
+ { styles: '.test { color: red; }', data: { enabled: true } },
57
+ );
58
+
59
+ writeVaultPlugin(
60
+ 'desktop-only-like',
61
+ `
62
+ const { Plugin } = require('obsidian');
63
+ const electron = require('electron');
64
+ module.exports = class DesktopOnly extends Plugin {};
65
+ `,
66
+ );
67
+
68
+ const reports = await scanObsidianVaultPlugins(vaultRoot);
69
+
70
+ expect(reports).toHaveLength(2);
71
+
72
+ const quickadd = reports.find((item) => item.id === 'quickadd-like');
73
+ expect(quickadd).toMatchObject({
74
+ compatibilityLevel: 'compatible',
75
+ hasStyles: true,
76
+ hasData: true,
77
+ });
78
+
79
+ const desktopOnly = reports.find((item) => item.id === 'desktop-only-like');
80
+ expect(desktopOnly).toMatchObject({ compatibilityLevel: 'blocked' });
81
+ expect(desktopOnly?.compatibility.nodeModules).toContain('electron');
82
+ });
83
+
84
+ it('skips invalid manifests instead of crashing the whole scan', async () => {
85
+ writeVaultPlugin('good-plugin', `const { Plugin } = require('obsidian'); module.exports = class Good extends Plugin {};`);
86
+ writeVaultPlugin(
87
+ 'bad-plugin',
88
+ `const { Plugin } = require('obsidian'); module.exports = class Bad extends Plugin {};`,
89
+ { manifest: { id: 'bad plugin', name: 'bad', version: '1.0.0' } },
90
+ );
91
+
92
+ const reports = await scanObsidianVaultPlugins(vaultRoot);
93
+
94
+ expect(reports.map((item) => item.id)).toEqual(['good-plugin']);
95
+ });
96
+
97
+ it('imports an Obsidian plugin into MindOS .plugins and preserves data and styles', async () => {
98
+ writeVaultPlugin(
99
+ 'import-me',
100
+ `const { Plugin } = require('obsidian'); module.exports = class ImportMe extends Plugin {};`,
101
+ { styles: '.plugin-style {}', data: { count: 2 } },
102
+ );
103
+
104
+ const imported = await importObsidianPlugin({
105
+ vaultRoot,
106
+ pluginId: 'import-me',
107
+ targetMindRoot: mindRoot,
108
+ });
109
+
110
+ expect(imported.targetDir).toBe(path.join(mindRoot, '.plugins', 'import-me'));
111
+ expect(fs.existsSync(path.join(imported.targetDir, 'manifest.json'))).toBe(true);
112
+ expect(fs.existsSync(path.join(imported.targetDir, 'main.js'))).toBe(true);
113
+ expect(fs.existsSync(path.join(imported.targetDir, 'styles.css'))).toBe(true);
114
+ expect(JSON.parse(fs.readFileSync(path.join(imported.targetDir, 'data.json'), 'utf-8'))).toEqual({ count: 2 });
115
+ });
116
+
117
+ it('rejects importing plugins that escape the source plugins directory', async () => {
118
+ await expect(
119
+ importObsidianPlugin({
120
+ vaultRoot,
121
+ pluginId: '../escape',
122
+ targetMindRoot: mindRoot,
123
+ }),
124
+ ).rejects.toThrow(/escapes/i);
125
+ });
126
+ });
@@ -117,4 +117,32 @@ describe('PluginManager', () => {
117
117
  const plugin = manager.list().find((item) => item.id === 'toggle-plugin');
118
118
  expect(plugin).toMatchObject({ enabled: false, loaded: false });
119
119
  });
120
+
121
+ it('scans an external Obsidian vault and imports a selected plugin into the manager root', async () => {
122
+ const sourceVault = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-obsidian-import-source-'));
123
+ try {
124
+ const sourcePluginDir = path.join(sourceVault, '.obsidian', 'plugins', 'ported-plugin');
125
+ fs.mkdirSync(sourcePluginDir, { recursive: true });
126
+ fs.writeFileSync(
127
+ path.join(sourcePluginDir, 'manifest.json'),
128
+ JSON.stringify({ id: 'ported-plugin', name: 'ported-plugin', version: '1.0.0' }, null, 2),
129
+ 'utf-8',
130
+ );
131
+ fs.writeFileSync(
132
+ path.join(sourcePluginDir, 'main.js'),
133
+ `const { Plugin } = require('obsidian'); module.exports = class PortedPlugin extends Plugin {};`,
134
+ 'utf-8',
135
+ );
136
+
137
+ const manager = new PluginManager(mindRoot);
138
+ const scanned = await manager.scanObsidianVault(sourceVault);
139
+ expect(scanned[0]).toMatchObject({ id: 'ported-plugin', compatibilityLevel: 'compatible' });
140
+
141
+ await manager.importFromObsidianVault(sourceVault, 'ported-plugin');
142
+ const plugins = await manager.discover();
143
+ expect(plugins.find((item) => item.id === 'ported-plugin')).toBeTruthy();
144
+ } finally {
145
+ fs.rmSync(sourceVault, { recursive: true, force: true });
146
+ }
147
+ });
120
148
  });
@@ -0,0 +1,139 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { execFileSync } from 'child_process';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import os from 'os';
6
+
7
+ /**
8
+ * Runtime integration test for extract-pdf.cjs.
9
+ *
10
+ * Unlike the API tests which run POST /api/extract-pdf via vitest imports,
11
+ * this test spawns the actual child process (as happens in production) to
12
+ * verify that pdfjs-dist can be resolved when running extract-pdf.cjs outside
13
+ * the Next.js bundler context.
14
+ *
15
+ * This catches the real failure mode: "Cannot find module 'pdfjs-dist/legacy/build/pdf.mjs'"
16
+ * which only occurs when pdfjs-dist is missing from the runtime's node_modules.
17
+ */
18
+
19
+ // Minimal valid PDF with extractable text
20
+ const MINIMAL_PDF = Buffer.from(`%PDF-1.4
21
+ 1 0 obj
22
+ << /Type /Catalog /Pages 2 0 R >>
23
+ endobj
24
+
25
+ 2 0 obj
26
+ << /Type /Pages /Kids [3 0 R] /Count 1 >>
27
+ endobj
28
+
29
+ 3 0 obj
30
+ << /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792]
31
+ /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>
32
+ endobj
33
+
34
+ 4 0 obj
35
+ << /Length 44 >>
36
+ stream
37
+ BT /F1 12 Tf 100 700 Td (Hello World) Tj ET
38
+ endstream
39
+ endobj
40
+
41
+ 5 0 obj
42
+ << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
43
+ endobj
44
+
45
+ xref
46
+ 0 6
47
+ 0000000000 65535 f
48
+ 0000000009 00000 n
49
+ 0000000058 00000 n
50
+ 0000000115 00000 n
51
+ 0000000266 00000 n
52
+ 0000000360 00000 n
53
+
54
+ trailer
55
+ << /Size 6 /Root 1 0 R >>
56
+ startxref
57
+ 441
58
+ %%EOF`);
59
+
60
+ describe('extract-pdf.cjs runtime integration', () => {
61
+ const scriptPath = path.resolve(__dirname, '../../scripts/extract-pdf.cjs');
62
+
63
+ it('script file exists', () => {
64
+ expect(fs.existsSync(scriptPath)).toBe(true);
65
+ });
66
+
67
+ it('successfully loads pdfjs-dist and extracts text', () => {
68
+ // Write test PDF to temp file
69
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pdf-test-'));
70
+ const pdfPath = path.join(tmpDir, 'test.pdf');
71
+ fs.writeFileSync(pdfPath, MINIMAL_PDF);
72
+
73
+ try {
74
+ // Spawn the script exactly as the API route does
75
+ const result = execFileSync('node', [scriptPath, pdfPath], {
76
+ encoding: 'utf-8',
77
+ timeout: 10_000,
78
+ maxBuffer: 10 * 1024 * 1024,
79
+ });
80
+
81
+ // Parse JSON output
82
+ const parsed = JSON.parse(result.trim()) as {
83
+ text: string;
84
+ pages: number;
85
+ error?: string;
86
+ };
87
+
88
+ // Must not have an error
89
+ expect(parsed.error).toBeUndefined();
90
+
91
+ // Must extract the expected text
92
+ expect(parsed.text).toContain('Hello');
93
+ expect(parsed.pages).toBe(1);
94
+ } finally {
95
+ // Cleanup
96
+ fs.rmSync(tmpDir, { recursive: true, force: true });
97
+ }
98
+ });
99
+
100
+ it('returns error JSON for invalid PDF (not crash)', () => {
101
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pdf-test-'));
102
+ const pdfPath = path.join(tmpDir, 'invalid.pdf');
103
+ fs.writeFileSync(pdfPath, 'not a valid PDF');
104
+
105
+ try {
106
+ const result = execFileSync('node', [scriptPath, pdfPath], {
107
+ encoding: 'utf-8',
108
+ timeout: 10_000,
109
+ maxBuffer: 10 * 1024 * 1024,
110
+ });
111
+
112
+ const parsed = JSON.parse(result.trim()) as {
113
+ text: string;
114
+ pages: number;
115
+ error?: string;
116
+ };
117
+
118
+ // Should have an error field, not throw
119
+ expect(parsed.error).toBeDefined();
120
+ } finally {
121
+ fs.rmSync(tmpDir, { recursive: true, force: true });
122
+ }
123
+ });
124
+
125
+ it('returns error JSON for missing file', () => {
126
+ const result = execFileSync('node', [scriptPath, '/nonexistent/path.pdf'], {
127
+ encoding: 'utf-8',
128
+ timeout: 10_000,
129
+ });
130
+
131
+ const parsed = JSON.parse(result.trim()) as {
132
+ text: string;
133
+ pages: number;
134
+ error?: string;
135
+ };
136
+
137
+ expect(parsed.error).toContain('not found');
138
+ });
139
+ });
@@ -0,0 +1,33 @@
1
+ export const dynamic = 'force-dynamic';
2
+
3
+ import { NextRequest, NextResponse } from 'next/server';
4
+ import { handleRouteErrorSimple } from '@/lib/errors';
5
+ import { scanObsidianVaultPlugins } from '@/lib/obsidian-compat/obsidian-import';
6
+ import { expandSetupPathHome } from '@/app/api/setup/path-utils';
7
+
8
+ export async function GET(req: NextRequest) {
9
+ try {
10
+ const vaultRootParam = req.nextUrl.searchParams.get('vaultRoot');
11
+ if (!vaultRootParam) {
12
+ return NextResponse.json({ ok: false, error: 'Missing vaultRoot' }, { status: 400 });
13
+ }
14
+
15
+ const vaultRoot = expandSetupPathHome(vaultRootParam.trim());
16
+ const plugins = await scanObsidianVaultPlugins(vaultRoot);
17
+ const summary = {
18
+ total: plugins.length,
19
+ compatible: plugins.filter((plugin) => plugin.compatibilityLevel === 'compatible').length,
20
+ partial: plugins.filter((plugin) => plugin.compatibilityLevel === 'partial').length,
21
+ blocked: plugins.filter((plugin) => plugin.compatibilityLevel === 'blocked').length,
22
+ };
23
+
24
+ return NextResponse.json({
25
+ ok: true,
26
+ vaultRoot,
27
+ summary,
28
+ plugins,
29
+ });
30
+ } catch (err) {
31
+ return handleRouteErrorSimple(err);
32
+ }
33
+ }
@@ -0,0 +1,37 @@
1
+ export const dynamic = 'force-dynamic';
2
+
3
+ import { NextRequest, NextResponse } from 'next/server';
4
+ import { handleRouteErrorSimple } from '@/lib/errors';
5
+ import { importObsidianPlugin, scanObsidianVaultPlugins } from '@/lib/obsidian-compat/obsidian-import';
6
+ import { expandSetupPathHome } from '@/app/api/setup/path-utils';
7
+
8
+ export async function POST(req: NextRequest) {
9
+ try {
10
+ const body = await req.json() as { vaultRoot?: string; pluginId?: string; targetMindRoot?: string };
11
+ if (!body.vaultRoot || !body.pluginId) {
12
+ return NextResponse.json({ ok: false, error: 'Missing vaultRoot or pluginId' }, { status: 400 });
13
+ }
14
+
15
+ const vaultRoot = expandSetupPathHome(body.vaultRoot.trim());
16
+ const targetMindRoot = expandSetupPathHome((body.targetMindRoot ?? process.cwd()).trim());
17
+ const plugins = await scanObsidianVaultPlugins(vaultRoot);
18
+ const plugin = plugins.find((item) => item.id === body.pluginId);
19
+ if (!plugin) {
20
+ return NextResponse.json({ ok: false, error: 'Plugin not found in Obsidian vault' }, { status: 404 });
21
+ }
22
+
23
+ const imported = await importObsidianPlugin({
24
+ vaultRoot,
25
+ pluginId: body.pluginId,
26
+ targetMindRoot,
27
+ });
28
+
29
+ return NextResponse.json({
30
+ ok: true,
31
+ plugin,
32
+ imported,
33
+ });
34
+ } catch (err) {
35
+ return handleRouteErrorSimple(err);
36
+ }
37
+ }
@@ -1,7 +1,7 @@
1
1
  export const dynamic = 'force-dynamic';
2
2
  import { NextRequest, NextResponse } from 'next/server';
3
3
  import { existsSync, readdirSync } from 'node:fs';
4
- import { expandSetupPathHome } from '../path-utils';
4
+ import { expandSetupPathHome, validateMindRootPath } from '../path-utils';
5
5
  import { handleRouteErrorSimple } from '@/lib/errors';
6
6
 
7
7
  export async function POST(req: NextRequest) {
@@ -11,6 +11,20 @@ export async function POST(req: NextRequest) {
11
11
  return NextResponse.json({ error: 'Invalid path' }, { status: 400 });
12
12
  }
13
13
  const abs = expandSetupPathHome(path.trim());
14
+
15
+ // Validate path is not inside dangerous directories
16
+ const validation = validateMindRootPath(abs);
17
+ if (!validation.safe) {
18
+ return NextResponse.json({
19
+ exists: false,
20
+ empty: true,
21
+ count: 0,
22
+ unsafe: true,
23
+ reason: validation.reason,
24
+ reasonZh: validation.reasonZh,
25
+ });
26
+ }
27
+
14
28
  const exists = existsSync(abs);
15
29
  let empty = true;
16
30
  let count = 0;
@@ -24,7 +38,7 @@ export async function POST(req: NextRequest) {
24
38
  empty = false;
25
39
  }
26
40
  }
27
- return NextResponse.json({ exists, empty, count });
41
+ return NextResponse.json({ exists, empty, count, unsafe: false });
28
42
  } catch (err) {
29
43
  return handleRouteErrorSimple(err);
30
44
  }