@geminilight/mindos 0.6.67 → 0.6.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) 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 +26 -25
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +7 -7
  10. package/_standalone/.next/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route.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.js +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  42. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/ask/route.js +17 -17
  49. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  61. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  62. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  66. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  85. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  91. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  104. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  107. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  112. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  115. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  123. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js +1 -1
  135. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  136. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js +1 -1
  138. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  139. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  142. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js +1 -1
  144. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js +1 -1
  147. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js +1 -1
  150. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  151. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  154. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js +1 -1
  156. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  157. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  158. package/_standalone/.next/server/app/page.js +1 -1
  159. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  160. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js +1 -1
  162. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  163. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  164. package/_standalone/.next/server/app/trash/page.js +3 -3
  165. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  166. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  167. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  168. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  169. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js +1 -1
  171. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  172. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  173. package/_standalone/.next/server/app-paths-manifest.json +26 -25
  174. package/_standalone/.next/server/chunks/3437.js +2 -2
  175. package/_standalone/.next/server/chunks/5299.js +1 -0
  176. package/_standalone/.next/server/chunks/6022.js +39 -39
  177. package/_standalone/.next/server/chunks/6133.js +54 -0
  178. package/_standalone/.next/server/chunks/6539.js +1 -1
  179. package/_standalone/.next/server/chunks/8326.js +1 -0
  180. package/_standalone/.next/server/chunks/8388.js +5 -3
  181. package/_standalone/.next/server/chunks/953.js +6 -4
  182. package/_standalone/.next/server/chunks/9938.js +24 -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/1814.8a1fef15856dce84.js +1 -0
  189. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  190. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  191. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  192. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  193. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  194. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  195. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  196. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  197. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  198. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  200. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  203. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  269. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  270. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  271. package/_standalone/.next/static/chunks/app/{layout-9bb19a959ffb87ac.js → layout-8aa53b34ef34a246.js} +28 -28
  272. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  273. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  274. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  276. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  281. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  282. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  283. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  284. package/_standalone/.next/trace +72 -71
  285. package/_standalone/.next/types/routes.d.ts +2 -1
  286. package/_standalone/.next/types/validator.ts +9 -0
  287. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  288. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  289. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  290. package/_standalone/__tests__/acp/agent-descriptors.test.ts +101 -3
  291. package/_standalone/__tests__/acp/registry.test.ts +34 -5
  292. package/_standalone/__tests__/acp/session.test.ts +346 -167
  293. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  294. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  295. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  296. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  297. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  298. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  299. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  300. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  301. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  302. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  303. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  304. package/_standalone/components/Breadcrumb.tsx +10 -10
  305. package/_standalone/components/FindInPage.tsx +1 -1
  306. package/_standalone/components/MarkdownView.tsx +4 -0
  307. package/_standalone/components/Panel.tsx +17 -10
  308. package/_standalone/components/TableOfContents.tsx +9 -9
  309. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  310. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  311. package/_standalone/components/ask/AskContent.tsx +68 -28
  312. package/_standalone/components/ask/AskHeader.tsx +6 -2
  313. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  314. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  315. package/_standalone/components/panels/AgentsPanel.tsx +8 -1
  316. package/_standalone/components/settings/AiTab.tsx +5 -1
  317. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  318. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  319. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  320. package/_standalone/components/settings/McpTab.tsx +1 -5
  321. package/_standalone/components/settings/TestButton.tsx +1 -0
  322. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  323. package/_standalone/components/settings/types.ts +12 -0
  324. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  325. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  326. package/_standalone/hooks/useAcpDetection.ts +1 -1
  327. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  328. package/_standalone/hooks/useFileImport.ts +7 -2
  329. package/_standalone/hooks/useFileUpload.ts +17 -10
  330. package/_standalone/lib/acp/index.ts +4 -6
  331. package/_standalone/lib/acp/types.ts +0 -29
  332. package/_standalone/lib/im/platforms.ts +6 -2
  333. package/_standalone/lib/pdf-extract.ts +6 -2
  334. package/_standalone/package-lock.json +12 -2
  335. package/_standalone/package.json +2 -1
  336. package/_standalone/tsconfig.tsbuildinfo +1 -1
  337. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  338. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  339. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  340. package/app/app/api/acp/detect/route.ts +9 -15
  341. package/app/app/api/channels/verify/route.ts +54 -0
  342. package/app/app/api/extract-pdf/route.ts +17 -3
  343. package/app/app/api/settings/list-models/route.ts +40 -44
  344. package/app/app/api/settings/route.ts +16 -0
  345. package/app/app/api/settings/test-key/route.ts +5 -2
  346. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  347. package/app/components/Breadcrumb.tsx +10 -10
  348. package/app/components/DirView.tsx +1 -1
  349. package/app/components/FindInPage.tsx +1 -1
  350. package/app/components/InboxView.tsx +2 -2
  351. package/app/components/MarkdownView.tsx +4 -0
  352. package/app/components/Panel.tsx +17 -10
  353. package/app/components/TableOfContents.tsx +9 -9
  354. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  355. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  356. package/app/components/ask/AskContent.tsx +68 -28
  357. package/app/components/ask/AskHeader.tsx +6 -2
  358. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  359. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  360. package/app/components/panels/AgentsPanel.tsx +8 -1
  361. package/app/components/settings/AiTab.tsx +5 -1
  362. package/app/components/settings/KnowledgeTab.tsx +92 -1
  363. package/app/components/settings/McpConnectGuides.tsx +4 -0
  364. package/app/components/settings/McpPortSection.tsx +207 -0
  365. package/app/components/settings/McpTab.tsx +1 -5
  366. package/app/components/settings/TestButton.tsx +1 -0
  367. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  368. package/app/components/settings/types.ts +12 -0
  369. package/app/components/settings/useCustomProviderForm.ts +2 -2
  370. package/app/data/skills/mindos/SKILL.md +45 -1
  371. package/app/hooks/useAcpDetection.ts +1 -1
  372. package/app/hooks/useAcpRegistry.ts +1 -1
  373. package/app/hooks/useFileImport.ts +7 -2
  374. package/app/hooks/useFileUpload.ts +17 -10
  375. package/app/lib/acp/agent-descriptors.ts +69 -29
  376. package/app/lib/acp/index.ts +4 -6
  377. package/app/lib/acp/registry.ts +43 -47
  378. package/app/lib/acp/session.ts +253 -517
  379. package/app/lib/acp/subprocess.ts +249 -414
  380. package/app/lib/acp/types.ts +0 -29
  381. package/app/lib/agent/model.ts +20 -4
  382. package/app/lib/agent/non-streaming.ts +37 -20
  383. package/app/lib/agent/providers.ts +31 -0
  384. package/app/lib/agent/tools.ts +5 -3
  385. package/app/lib/core/embedding-index.ts +285 -0
  386. package/app/lib/core/embedding-provider.ts +164 -0
  387. package/app/lib/core/hybrid-search.ts +160 -0
  388. package/app/lib/core/search.ts +11 -21
  389. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  390. package/app/lib/i18n/modules/panels.ts +14 -0
  391. package/app/lib/i18n/modules/settings.ts +2 -0
  392. package/app/lib/im/platforms.ts +6 -2
  393. package/app/lib/im/verify.ts +94 -0
  394. package/app/lib/pdf-extract.ts +6 -2
  395. package/app/lib/settings.ts +23 -0
  396. package/app/package.json +2 -1
  397. package/bin/cli.js +3 -1
  398. package/bin/commands/channel.js +342 -0
  399. package/bin/commands/update.js +11 -4
  400. package/bin/lib/build.js +34 -16
  401. package/bin/lib/channel-config.js +168 -0
  402. package/bin/lib/channel-constants.js +88 -0
  403. package/bin/lib/channel-mgmt.js +244 -0
  404. package/bin/lib/channel-prompts.js +72 -0
  405. package/bin/lib/channel-validate.js +57 -0
  406. package/bin/lib/safe-rm.js +165 -0
  407. package/package.json +1 -1
  408. package/skills/mindos/SKILL.md +45 -1
  409. package/_standalone/.next/server/chunks/1750.js +0 -1
  410. package/_standalone/.next/server/chunks/8947.js +0 -52
  411. package/_standalone/.next/static/0JtsgqDZLSJ6MrIZIV6gC/_buildManifest.js +0 -1
  412. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  413. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  414. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  415. package/_standalone/.next/static/chunks/476.463546c195b89cce.js +0 -48
  416. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  417. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  418. package/_standalone/.next/static/chunks/5998.7bd28de9747440b5.js +0 -1
  419. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  481. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  483. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  485. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  486. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  487. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/app/trash/page-bebb28bf472cf691.js +0 -1
  489. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/app/view/[...path]/page-dd5698f3df138835.js +0 -12
  491. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  492. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  493. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  494. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  495. package/_standalone/.next/static/chunks/webpack-043f40ef7816d8c4.js +0 -1
  496. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  497. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  498. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  499. package/app/lib/core/synonym-dict.ts +0 -139
  500. /package/_standalone/.next/static/{0JtsgqDZLSJ6MrIZIV6gC → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -1,52 +1,50 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import type { AcpRegistryEntry, AcpJsonRpcResponse } from '../../lib/acp/types';
3
-
4
- const mockStdin = { writable: true, write: vi.fn() };
5
- const mockStdout = { on: vi.fn() };
6
- const mockStderr = { on: vi.fn() };
7
- const mockProc = {
8
- stdin: mockStdin,
9
- stdout: mockStdout,
10
- stderr: mockStderr,
11
- pid: 12345,
12
- on: vi.fn(),
13
- once: vi.fn(),
14
- kill: vi.fn(),
15
- removeListener: vi.fn(),
16
- };
17
-
18
- vi.mock('child_process', () => ({
19
- spawn: vi.fn(() => mockProc),
20
- }));
2
+ import type { AcpRegistryEntry } from '../../lib/acp/types';
3
+
4
+ // Mock SDK connection that records calls
5
+ let mockInitialize: ReturnType<typeof vi.fn>;
6
+ let mockNewSession: ReturnType<typeof vi.fn>;
7
+ let mockAuthenticate: ReturnType<typeof vi.fn>;
8
+ let mockPrompt: ReturnType<typeof vi.fn>;
9
+ let mockCancel: ReturnType<typeof vi.fn>;
10
+ let mockSetSessionMode: ReturnType<typeof vi.fn>;
11
+ let mockSetSessionConfigOption: ReturnType<typeof vi.fn>;
12
+ let mockUnstableCloseSession: ReturnType<typeof vi.fn>;
13
+ let mockLoadSession: ReturnType<typeof vi.fn>;
14
+ let mockListSessions: ReturnType<typeof vi.fn>;
15
+ let capturedCallbacks: { onSessionUpdate?: (params: unknown) => void } = {};
21
16
 
22
17
  vi.mock('../../lib/acp/registry', () => ({
23
18
  findAcpAgent: vi.fn(),
24
19
  }));
25
20
 
26
- // Capture notification callbacks for testing
27
- let capturedNotifCallback: ((notif: unknown) => void) | null = null;
28
-
29
- vi.mock('../../lib/acp/subprocess', () => {
30
- return {
31
- spawnAcpAgent: vi.fn(() => {
32
- return { id: 'test-proc', agentId: 'test-agent', proc: mockProc, alive: true };
33
- }),
34
- sendAndWait: vi.fn(),
35
- sendMessage: vi.fn(() => 'rpc-99'),
36
- onMessage: vi.fn(() => () => {}),
37
- onNotification: vi.fn((_proc: unknown, cb: (notif: unknown) => void) => {
38
- capturedNotifCallback = cb;
39
- return () => { capturedNotifCallback = null; };
40
- }),
41
- onRequest: vi.fn(() => () => {}),
42
- sendResponse: vi.fn(),
43
- installAutoApproval: vi.fn(() => () => {}),
44
- killAgent: vi.fn((p: { alive: boolean }) => { p.alive = false; }),
45
- };
46
- });
21
+ vi.mock('../../lib/acp/subprocess', () => ({
22
+ spawnAndConnect: vi.fn(() => {
23
+ capturedCallbacks = {};
24
+ return {
25
+ connection: {
26
+ initialize: mockInitialize,
27
+ newSession: mockNewSession,
28
+ authenticate: mockAuthenticate,
29
+ prompt: mockPrompt,
30
+ cancel: mockCancel,
31
+ setSessionMode: mockSetSessionMode,
32
+ setSessionConfigOption: mockSetSessionConfigOption,
33
+ unstable_closeSession: mockUnstableCloseSession,
34
+ loadSession: mockLoadSession,
35
+ listSessions: mockListSessions,
36
+ signal: new AbortController().signal,
37
+ closed: new Promise(() => {}),
38
+ },
39
+ callbacks: capturedCallbacks,
40
+ process: { id: 'test-proc', agentId: 'test-agent', proc: { pid: 12345 }, alive: true },
41
+ };
42
+ }),
43
+ killAgent: vi.fn((p: { alive: boolean }) => { p.alive = false; }),
44
+ }));
47
45
 
48
- import { createSessionFromEntry, prompt, cancelPrompt, closeSession, getSession, getActiveSessions } from '../../lib/acp/session';
49
- import { sendAndWait } from '../../lib/acp/subprocess';
46
+ import { createSession, createSessionFromEntry, loadSession, listSessions, prompt, promptStream, cancelPrompt, closeSession, setMode, setConfigOption, getSession, getActiveSessions } from '../../lib/acp/session';
47
+ import { findAcpAgent } from '../../lib/acp/registry';
50
48
 
51
49
  const MOCK_ENTRY: AcpRegistryEntry = {
52
50
  id: 'test-agent',
@@ -56,63 +54,58 @@ const MOCK_ENTRY: AcpRegistryEntry = {
56
54
  command: 'test-agent',
57
55
  };
58
56
 
59
- describe('ACP Session', () => {
60
- beforeEach(() => {
57
+ describe('ACP Session (SDK-based)', () => {
58
+ beforeEach(async () => {
61
59
  vi.clearAllMocks();
62
- capturedNotifCallback = null;
63
- for (const s of getActiveSessions()) {
64
- closeSession(s.id).catch(() => {});
65
- }
60
+ capturedCallbacks = {};
61
+
62
+ mockInitialize = vi.fn().mockResolvedValue({ agentCapabilities: {} });
63
+ mockNewSession = vi.fn().mockResolvedValue({ sessionId: 'agent-ses-1' });
64
+ mockAuthenticate = vi.fn().mockResolvedValue({});
65
+ mockPrompt = vi.fn().mockResolvedValue({ stopReason: 'end_turn' });
66
+ mockCancel = vi.fn().mockResolvedValue(undefined);
67
+ mockSetSessionMode = vi.fn().mockResolvedValue({});
68
+ mockSetSessionConfigOption = vi.fn().mockResolvedValue({ configOptions: [] });
69
+ mockUnstableCloseSession = vi.fn().mockResolvedValue({});
70
+ mockLoadSession = vi.fn().mockResolvedValue({ sessionId: 'loaded-ses-1' });
71
+ mockListSessions = vi.fn().mockResolvedValue({ sessions: [] });
72
+
73
+ await Promise.allSettled(getActiveSessions().map(s => closeSession(s.id)));
66
74
  });
67
75
 
68
76
  describe('createSessionFromEntry', () => {
69
- it('creates a session after successful initialize', async () => {
70
- const mockResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
71
- vi.mocked(sendAndWait).mockResolvedValueOnce(mockResponse);
72
-
77
+ it('creates a session via SDK initialize + newSession', async () => {
73
78
  const session = await createSessionFromEntry(MOCK_ENTRY);
74
79
 
75
80
  expect(session).toBeDefined();
76
81
  expect(session.agentId).toBe('test-agent');
77
82
  expect(session.state).toBe('idle');
78
83
  expect(session.id).toContain('ses-test-agent-');
84
+ expect(mockInitialize).toHaveBeenCalledOnce();
85
+ expect(mockNewSession).toHaveBeenCalledOnce();
79
86
  });
80
87
 
81
- it('extracts agentSessionId from session/new response', async () => {
82
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
83
- const sessionNewResponse: AcpJsonRpcResponse = {
84
- jsonrpc: '2.0', id: 'rpc-2',
85
- result: { sessionId: 'agent-assigned-session-id-123' },
86
- };
87
- vi.mocked(sendAndWait)
88
- .mockResolvedValueOnce(initResponse)
89
- .mockResolvedValueOnce(sessionNewResponse);
88
+ it('extracts agentSessionId from SDK newSession response', async () => {
89
+ mockNewSession.mockResolvedValueOnce({ sessionId: 'agent-assigned-id-123' });
90
90
 
91
91
  const session = await createSessionFromEntry(MOCK_ENTRY);
92
92
 
93
- expect(session.agentSessionId).toBe('agent-assigned-session-id-123');
93
+ expect(session.agentSessionId).toBe('agent-assigned-id-123');
94
94
  expect(session.id).toContain('ses-test-agent-');
95
- expect(session.id).not.toBe('agent-assigned-session-id-123');
95
+ expect(session.id).not.toBe('agent-assigned-id-123');
96
96
  });
97
97
 
98
98
  it('parses modes from nested { availableModes: [...] } format', async () => {
99
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
100
- const sessionNewResponse: AcpJsonRpcResponse = {
101
- jsonrpc: '2.0', id: 'rpc-2',
102
- result: {
103
- sessionId: 'ses-1',
104
- modes: {
105
- availableModes: [
106
- { id: 'default', name: 'Default' },
107
- { id: 'code', name: 'Code Mode', description: 'Optimized for coding' },
108
- ],
109
- currentModeId: 'default',
110
- },
99
+ mockNewSession.mockResolvedValueOnce({
100
+ sessionId: 'ses-1',
101
+ modes: {
102
+ availableModes: [
103
+ { id: 'default', name: 'Default' },
104
+ { id: 'code', name: 'Code Mode', description: 'Optimized for coding' },
105
+ ],
106
+ currentModeId: 'default',
111
107
  },
112
- };
113
- vi.mocked(sendAndWait)
114
- .mockResolvedValueOnce(initResponse)
115
- .mockResolvedValueOnce(sessionNewResponse);
108
+ });
116
109
 
117
110
  const session = await createSessionFromEntry(MOCK_ENTRY);
118
111
 
@@ -121,108 +114,71 @@ describe('ACP Session', () => {
121
114
  expect(session.modes![1]).toEqual({ id: 'code', name: 'Code Mode', description: 'Optimized for coding' });
122
115
  });
123
116
 
124
- it('parses modes from flat array format (backward compat)', async () => {
125
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
126
- const sessionNewResponse: AcpJsonRpcResponse = {
127
- jsonrpc: '2.0', id: 'rpc-2',
128
- result: {
129
- sessionId: 'ses-1',
130
- modes: [
131
- { id: 'default', name: 'Default' },
132
- ],
133
- },
134
- };
135
- vi.mocked(sendAndWait)
136
- .mockResolvedValueOnce(initResponse)
137
- .mockResolvedValueOnce(sessionNewResponse);
117
+ it('parses modes from flat array format', async () => {
118
+ mockNewSession.mockResolvedValueOnce({
119
+ sessionId: 'ses-1',
120
+ modes: [{ id: 'default', name: 'Default' }],
121
+ });
138
122
 
139
123
  const session = await createSessionFromEntry(MOCK_ENTRY);
140
124
  expect(session.modes).toHaveLength(1);
141
125
  });
142
126
 
143
127
  it('throws and cleans up on initialize failure', async () => {
144
- const mockResponse: AcpJsonRpcResponse = {
145
- jsonrpc: '2.0',
146
- id: 'rpc-1',
147
- error: { code: -32603, message: 'Init failed' },
148
- };
149
- vi.mocked(sendAndWait).mockResolvedValueOnce(mockResponse);
128
+ mockInitialize.mockRejectedValueOnce(new Error('Init failed'));
150
129
 
151
130
  await expect(createSessionFromEntry(MOCK_ENTRY)).rejects.toThrow('initialize failed');
152
131
  });
153
132
 
154
133
  it('throws on spawn timeout', async () => {
155
- vi.mocked(sendAndWait).mockRejectedValueOnce(new Error('timeout'));
134
+ mockInitialize.mockRejectedValueOnce(new Error('timeout'));
156
135
 
157
136
  await expect(createSessionFromEntry(MOCK_ENTRY)).rejects.toThrow('timeout');
158
137
  });
159
- });
160
-
161
- describe('prompt', () => {
162
- it('returns response text from result when no notifications arrive', async () => {
163
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
164
- vi.mocked(sendAndWait).mockResolvedValueOnce(initResponse);
165
- const session = await createSessionFromEntry(MOCK_ENTRY);
166
138
 
167
- const promptResponse: AcpJsonRpcResponse = {
168
- jsonrpc: '2.0', id: 'rpc-2',
169
- result: { text: 'Hello from agent!', done: true },
170
- };
171
- vi.mocked(sendAndWait).mockResolvedValueOnce(promptResponse);
172
-
173
- const response = await prompt(session.id, 'Hello');
174
- expect(response.text).toBe('Hello from agent!');
175
- expect(response.done).toBe(true);
176
- });
139
+ it('authenticates when agent declares auth methods', async () => {
140
+ mockInitialize.mockResolvedValueOnce({
141
+ agentCapabilities: {},
142
+ authMethods: [{ id: 'terminal', name: 'Terminal Login' }],
143
+ });
177
144
 
178
- it('aggregates text from session/update notifications', async () => {
179
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
180
- vi.mocked(sendAndWait).mockResolvedValueOnce(initResponse);
181
145
  const session = await createSessionFromEntry(MOCK_ENTRY);
146
+ expect(session).toBeDefined();
147
+ expect(mockAuthenticate).toHaveBeenCalledWith({ methodId: 'terminal' });
148
+ });
149
+ });
182
150
 
183
- vi.mocked(sendAndWait).mockImplementationOnce(async () => {
184
- // Simulate notifications arriving before the response
185
- if (capturedNotifCallback) {
186
- capturedNotifCallback({
187
- jsonrpc: '2.0', method: 'session/update',
188
- params: { sessionId: 'x', update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Hello ' } } },
151
+ describe('prompt', () => {
152
+ it('returns aggregated notification text', async () => {
153
+ mockPrompt.mockImplementationOnce(async () => {
154
+ if (capturedCallbacks.onSessionUpdate) {
155
+ capturedCallbacks.onSessionUpdate({
156
+ sessionId: 'x',
157
+ update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Hello ' } },
189
158
  });
190
- capturedNotifCallback({
191
- jsonrpc: '2.0', method: 'session/update',
192
- params: { sessionId: 'x', update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'world!' } } },
159
+ capturedCallbacks.onSessionUpdate({
160
+ sessionId: 'x',
161
+ update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'world!' } },
193
162
  });
194
163
  }
195
- return { jsonrpc: '2.0', id: 'rpc-3', result: { stopReason: 'end_turn' } } as AcpJsonRpcResponse;
164
+ return { stopReason: 'end_turn' };
196
165
  });
197
166
 
167
+ const session = await createSessionFromEntry(MOCK_ENTRY);
198
168
  const response = await prompt(session.id, 'Hello');
169
+
199
170
  expect(response.text).toBe('Hello world!');
171
+ expect(response.done).toBe(true);
200
172
  expect(response.stopReason).toBe('end_turn');
201
173
  });
202
174
 
203
- it('uses agentSessionId in RPC params', async () => {
204
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
205
- const sessionNewResponse: AcpJsonRpcResponse = {
206
- jsonrpc: '2.0', id: 'rpc-2',
207
- result: { sessionId: 'agent-ses-42' },
208
- };
209
- vi.mocked(sendAndWait)
210
- .mockResolvedValueOnce(initResponse)
211
- .mockResolvedValueOnce(sessionNewResponse);
212
- const session = await createSessionFromEntry(MOCK_ENTRY);
213
-
214
- const promptResponse: AcpJsonRpcResponse = {
215
- jsonrpc: '2.0', id: 'rpc-3',
216
- result: { text: 'ok', stopReason: 'end_turn' },
217
- };
218
- vi.mocked(sendAndWait).mockResolvedValueOnce(promptResponse);
175
+ it('uses agentSessionId in SDK prompt call', async () => {
176
+ mockNewSession.mockResolvedValueOnce({ sessionId: 'agent-ses-42' });
219
177
 
178
+ const session = await createSessionFromEntry(MOCK_ENTRY);
220
179
  await prompt(session.id, 'test');
221
180
 
222
- // Verify sendAndWait was called with the agent's sessionId, not our internal ID
223
- const promptCalls = vi.mocked(sendAndWait).mock.calls.filter(c => c[1] === 'session/prompt');
224
- expect(promptCalls).toHaveLength(1);
225
- expect(promptCalls[0][2]).toEqual(expect.objectContaining({
181
+ expect(mockPrompt).toHaveBeenCalledWith(expect.objectContaining({
226
182
  sessionId: 'agent-ses-42',
227
183
  }));
228
184
  });
@@ -232,29 +188,66 @@ describe('ACP Session', () => {
232
188
  });
233
189
 
234
190
  it('sets session state to error on prompt failure', async () => {
235
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
236
- vi.mocked(sendAndWait).mockResolvedValueOnce(initResponse);
237
- const session = await createSessionFromEntry(MOCK_ENTRY);
238
-
239
- const errorResponse: AcpJsonRpcResponse = {
240
- jsonrpc: '2.0', id: 'rpc-2',
241
- error: { code: -32603, message: 'Agent crashed' },
242
- };
243
- vi.mocked(sendAndWait).mockResolvedValueOnce(errorResponse);
191
+ mockPrompt.mockRejectedValueOnce(new Error('Agent crashed'));
244
192
 
193
+ const session = await createSessionFromEntry(MOCK_ENTRY);
245
194
  await expect(prompt(session.id, 'crash')).rejects.toThrow('Agent crashed');
246
195
  expect(getSession(session.id)?.state).toBe('error');
247
196
  });
197
+
198
+ it('cleans up update handler after prompt (success)', async () => {
199
+ const session = await createSessionFromEntry(MOCK_ENTRY);
200
+ await prompt(session.id, 'test');
201
+ expect(capturedCallbacks.onSessionUpdate).toBeUndefined();
202
+ });
203
+
204
+ it('cleans up update handler after prompt (error)', async () => {
205
+ mockPrompt.mockRejectedValueOnce(new Error('fail'));
206
+
207
+ const session = await createSessionFromEntry(MOCK_ENTRY);
208
+ await expect(prompt(session.id, 'test')).rejects.toThrow('fail');
209
+ expect(capturedCallbacks.onSessionUpdate).toBeUndefined();
210
+ });
211
+
212
+ it('rejects concurrent prompts on same session', async () => {
213
+ const session = await createSessionFromEntry(MOCK_ENTRY);
214
+ mockPrompt.mockImplementationOnce(() => new Promise(() => {})); // never resolves
215
+ const p1 = prompt(session.id, 'first');
216
+ await expect(prompt(session.id, 'second')).rejects.toThrow('busy');
217
+ // Clean up the hanging prompt
218
+ session.state = 'idle';
219
+ });
220
+ });
221
+
222
+ describe('promptStream', () => {
223
+ it('forwards updates via onUpdate callback', async () => {
224
+ const updates: unknown[] = [];
225
+
226
+ mockPrompt.mockImplementationOnce(async () => {
227
+ if (capturedCallbacks.onSessionUpdate) {
228
+ capturedCallbacks.onSessionUpdate({
229
+ sessionId: 'x',
230
+ update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'streaming...' } },
231
+ });
232
+ }
233
+ return { stopReason: 'end_turn' };
234
+ });
235
+
236
+ const session = await createSessionFromEntry(MOCK_ENTRY);
237
+ const response = await promptStream(session.id, 'Hello', (update) => updates.push(update));
238
+
239
+ expect(response.text).toBe('streaming...');
240
+ expect(updates.length).toBeGreaterThanOrEqual(1);
241
+ expect(updates[updates.length - 1]).toEqual(expect.objectContaining({ type: 'done' }));
242
+ });
248
243
  });
249
244
 
250
245
  describe('cancelPrompt', () => {
251
246
  it('does nothing for idle session', async () => {
252
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
253
- vi.mocked(sendAndWait).mockResolvedValueOnce(initResponse);
254
247
  const session = await createSessionFromEntry(MOCK_ENTRY);
255
-
256
248
  await cancelPrompt(session.id);
257
249
  expect(getSession(session.id)?.state).toBe('idle');
250
+ expect(mockCancel).not.toHaveBeenCalled();
258
251
  });
259
252
 
260
253
  it('throws for unknown session', async () => {
@@ -262,21 +255,56 @@ describe('ACP Session', () => {
262
255
  });
263
256
  });
264
257
 
258
+ describe('setMode', () => {
259
+ it('calls SDK setSessionMode with wireSessionId', async () => {
260
+ mockNewSession.mockResolvedValueOnce({ sessionId: 'agent-ses-99' });
261
+ const session = await createSessionFromEntry(MOCK_ENTRY);
262
+
263
+ await setMode(session.id, 'code');
264
+
265
+ expect(mockSetSessionMode).toHaveBeenCalledWith({
266
+ sessionId: 'agent-ses-99',
267
+ modeId: 'code',
268
+ });
269
+ });
270
+ });
271
+
272
+ describe('setConfigOption', () => {
273
+ it('calls SDK setSessionConfigOption and returns updated options', async () => {
274
+ mockSetSessionConfigOption.mockResolvedValueOnce({
275
+ configOptions: [
276
+ { configId: 'model', category: 'model', currentValue: 'gpt-4', options: [] },
277
+ ],
278
+ });
279
+
280
+ const session = await createSessionFromEntry(MOCK_ENTRY);
281
+ const result = await setConfigOption(session.id, 'model', 'gpt-4');
282
+
283
+ expect(result).toHaveLength(1);
284
+ expect(result[0].configId).toBe('model');
285
+ });
286
+ });
287
+
265
288
  describe('closeSession', () => {
266
289
  it('closes and removes session', async () => {
267
- const initResponse: AcpJsonRpcResponse = { jsonrpc: '2.0', id: 'rpc-1', result: { ok: true } };
268
- vi.mocked(sendAndWait).mockResolvedValueOnce(initResponse);
269
290
  const session = await createSessionFromEntry(MOCK_ENTRY);
270
-
271
- vi.mocked(sendAndWait).mockResolvedValueOnce({ jsonrpc: '2.0', id: 'rpc-2', result: {} });
272
291
  await closeSession(session.id);
273
-
274
292
  expect(getSession(session.id)).toBeUndefined();
275
293
  });
276
294
 
277
295
  it('handles close of nonexistent session gracefully', async () => {
278
296
  await closeSession('nonexistent');
279
297
  });
298
+
299
+ it('calls unstable_closeSession on SDK connection', async () => {
300
+ mockNewSession.mockResolvedValueOnce({ sessionId: 'agent-ses-close' });
301
+ const session = await createSessionFromEntry(MOCK_ENTRY);
302
+ await closeSession(session.id);
303
+
304
+ expect(mockUnstableCloseSession).toHaveBeenCalledWith({
305
+ sessionId: 'agent-ses-close',
306
+ });
307
+ });
280
308
  });
281
309
 
282
310
  describe('getActiveSessions', () => {
@@ -284,4 +312,155 @@ describe('ACP Session', () => {
284
312
  expect(getActiveSessions()).toHaveLength(0);
285
313
  });
286
314
  });
315
+
316
+ describe('createSession (by agentId)', () => {
317
+ it('throws when agent is not found in registry', async () => {
318
+ (findAcpAgent as ReturnType<typeof vi.fn>).mockResolvedValueOnce(null);
319
+ await expect(createSession('nonexistent-agent')).rejects.toThrow('not found in registry');
320
+ });
321
+
322
+ it('delegates to createSessionFromEntry when agent is found', async () => {
323
+ (findAcpAgent as ReturnType<typeof vi.fn>).mockResolvedValueOnce(MOCK_ENTRY);
324
+ const session = await createSession('test-agent');
325
+ expect(session.agentId).toBe('test-agent');
326
+ });
327
+ });
328
+
329
+ describe('createSessionFromEntry — edge cases', () => {
330
+ it('continues when session/new fails with non-auth error', async () => {
331
+ mockNewSession.mockRejectedValueOnce(new Error('Network timeout'));
332
+ const session = await createSessionFromEntry(MOCK_ENTRY);
333
+ expect(session).toBeDefined();
334
+ expect(session.agentSessionId).toBeUndefined();
335
+ });
336
+
337
+ it('throws when session/new fails with auth error', async () => {
338
+ mockNewSession.mockRejectedValueOnce(new Error('Authentication required'));
339
+ await expect(createSessionFromEntry(MOCK_ENTRY)).rejects.toThrow('Authentication required');
340
+ });
341
+
342
+ it('enforces max total sessions limit', async () => {
343
+ const created: string[] = [];
344
+ for (let i = 0; i < 10; i++) {
345
+ const s = await createSessionFromEntry({
346
+ ...MOCK_ENTRY,
347
+ id: `agent-${i}`,
348
+ });
349
+ created.push(s.id);
350
+ }
351
+ await expect(createSessionFromEntry({ ...MOCK_ENTRY, id: 'agent-overflow' })).rejects.toThrow('Maximum concurrent sessions');
352
+ for (const id of created) await closeSession(id);
353
+ });
354
+
355
+ it('enforces per-agent limit when filling total limit', async () => {
356
+ const created: string[] = [];
357
+ // Create 3 sessions for same agent (fills per-agent limit)
358
+ for (let i = 0; i < 3; i++) {
359
+ const s = await createSessionFromEntry(MOCK_ENTRY);
360
+ created.push(s.id);
361
+ }
362
+ // 4th session with different agent should succeed
363
+ const s4 = await createSessionFromEntry({ ...MOCK_ENTRY, id: 'other-agent' });
364
+ created.push(s4.id);
365
+ expect(s4.agentId).toBe('other-agent');
366
+ for (const id of created) await closeSession(id);
367
+ });
368
+
369
+ it('parses config options from session/new response', async () => {
370
+ mockNewSession.mockResolvedValueOnce({
371
+ sessionId: 'ses-cfg',
372
+ configOptions: [
373
+ { configId: 'model', category: 'model', currentValue: 'gpt-4', options: [{ id: 'gpt-4', label: 'GPT-4' }] },
374
+ ],
375
+ });
376
+ const session = await createSessionFromEntry(MOCK_ENTRY);
377
+ expect(session.configOptions).toHaveLength(1);
378
+ expect(session.configOptions![0].configId).toBe('model');
379
+ });
380
+ });
381
+
382
+ describe('loadSession', () => {
383
+ it('throws when agent is not found', async () => {
384
+ (findAcpAgent as ReturnType<typeof vi.fn>).mockResolvedValueOnce(null);
385
+ await expect(loadSession('unknown', 'ses-1')).rejects.toThrow('not found in registry');
386
+ });
387
+
388
+ it('throws when agent does not support loadSession', async () => {
389
+ (findAcpAgent as ReturnType<typeof vi.fn>).mockResolvedValueOnce(MOCK_ENTRY);
390
+ mockInitialize.mockResolvedValueOnce({ agentCapabilities: { loadSession: false } });
391
+ await expect(loadSession('test-agent', 'ses-1')).rejects.toThrow('does not support session/load');
392
+ });
393
+
394
+ it('loads session when agent supports it', async () => {
395
+ (findAcpAgent as ReturnType<typeof vi.fn>).mockResolvedValueOnce(MOCK_ENTRY);
396
+ mockInitialize.mockResolvedValueOnce({ agentCapabilities: { loadSession: true } });
397
+ mockLoadSession.mockResolvedValueOnce({ sessionId: 'ses-loaded', modes: [] });
398
+ const session = await loadSession('test-agent', 'ses-loaded');
399
+ expect(session.agentSessionId).toBe('ses-loaded');
400
+ });
401
+ });
402
+
403
+ describe('listSessions', () => {
404
+ it('throws when agent does not support session/list', async () => {
405
+ const session = await createSessionFromEntry(MOCK_ENTRY);
406
+ await expect(listSessions(session.id)).rejects.toThrow('does not support session/list');
407
+ });
408
+
409
+ it('returns sessions when supported', async () => {
410
+ mockInitialize.mockResolvedValueOnce({
411
+ agentCapabilities: { sessionCapabilities: { list: true } },
412
+ });
413
+ mockListSessions.mockResolvedValueOnce({
414
+ sessions: [{ sessionId: 'ses-1', cwd: '/home', title: 'My Session' }],
415
+ nextCursor: 'abc',
416
+ });
417
+ const session = await createSessionFromEntry(MOCK_ENTRY);
418
+ const result = await listSessions(session.id);
419
+ expect(result.sessions).toHaveLength(1);
420
+ expect(result.sessions[0].sessionId).toBe('ses-1');
421
+ expect(result.nextCursor).toBe('abc');
422
+ });
423
+ });
424
+
425
+ describe('prompt — notification types', () => {
426
+ it('aggregates thinking content as text', async () => {
427
+ mockPrompt.mockImplementationOnce(async () => {
428
+ if (capturedCallbacks.onSessionUpdate) {
429
+ capturedCallbacks.onSessionUpdate({
430
+ sessionId: 'x',
431
+ update: { sessionUpdate: 'agent_thought_chunk', content: { type: 'thinking', text: 'hmm...' } },
432
+ });
433
+ }
434
+ return { stopReason: 'end_turn' };
435
+ });
436
+
437
+ const session = await createSessionFromEntry(MOCK_ENTRY);
438
+ const response = await prompt(session.id, 'think');
439
+ expect(response.text).toBe('');
440
+ });
441
+
442
+ it('handles tool_call notifications in promptStream', async () => {
443
+ const updates: unknown[] = [];
444
+ mockPrompt.mockImplementationOnce(async () => {
445
+ if (capturedCallbacks.onSessionUpdate) {
446
+ capturedCallbacks.onSessionUpdate({
447
+ sessionId: 'x',
448
+ update: {
449
+ sessionUpdate: 'tool_call',
450
+ toolCallId: 'tc-1',
451
+ title: 'Read file',
452
+ status: 'completed',
453
+ kind: 'read',
454
+ },
455
+ });
456
+ }
457
+ return { stopReason: 'end_turn' };
458
+ });
459
+
460
+ const session = await createSessionFromEntry(MOCK_ENTRY);
461
+ await promptStream(session.id, 'do something', (u) => updates.push(u));
462
+ const toolUpdate = updates.find((u: any) => u.type === 'tool_call');
463
+ expect(toolUpdate).toBeDefined();
464
+ });
465
+ });
287
466
  });