@geminilight/mindos 0.6.69 → 0.6.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +22 -21
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +7 -7
  10. package/_standalone/.next/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/ask/route.js +13 -13
  48. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  59. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  61. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  65. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  122. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/changelog/page.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/changes/page.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/echo/page.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/explore/page.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/help/page.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app/login/page.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  156. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  157. package/_standalone/.next/server/app/page.js +1 -1
  158. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  159. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  160. package/_standalone/.next/server/app/setup/page.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  162. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/app/trash/page.js +3 -3
  164. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  165. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  167. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  168. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  169. package/_standalone/.next/server/app/wiki/page.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  171. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/app-paths-manifest.json +22 -21
  173. package/_standalone/.next/server/chunks/3437.js +2 -2
  174. package/_standalone/.next/server/chunks/5299.js +1 -0
  175. package/_standalone/.next/server/chunks/6022.js +42 -42
  176. package/_standalone/.next/server/chunks/6133.js +54 -0
  177. package/_standalone/.next/server/chunks/6539.js +1 -1
  178. package/_standalone/.next/server/chunks/8326.js +1 -0
  179. package/_standalone/.next/server/chunks/8388.js +5 -3
  180. package/_standalone/.next/server/chunks/953.js +6 -4
  181. package/_standalone/.next/server/chunks/9938.js +24 -0
  182. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  184. package/_standalone/.next/server/pages/500.html +2 -2
  185. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  186. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  187. package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
  188. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  189. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  190. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  191. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  192. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  193. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  194. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  195. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  196. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  197. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  198. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  201. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  269. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  270. package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
  271. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  272. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  273. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  274. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  276. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  281. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  282. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  283. package/_standalone/.next/trace +72 -71
  284. package/_standalone/.next/types/routes.d.ts +2 -1
  285. package/_standalone/.next/types/validator.ts +9 -0
  286. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  287. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  288. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  289. package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
  290. package/_standalone/__tests__/acp/session.test.ts +346 -167
  291. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  292. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  293. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  294. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  295. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  296. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  297. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  298. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  299. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  300. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  301. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  302. package/_standalone/components/Breadcrumb.tsx +11 -11
  303. package/_standalone/components/FindInPage.tsx +1 -1
  304. package/_standalone/components/MarkdownView.tsx +4 -0
  305. package/_standalone/components/Panel.tsx +17 -10
  306. package/_standalone/components/TableOfContents.tsx +9 -9
  307. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  308. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  309. package/_standalone/components/ask/AskContent.tsx +68 -28
  310. package/_standalone/components/ask/AskHeader.tsx +6 -2
  311. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  312. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  313. package/_standalone/components/settings/AiTab.tsx +5 -1
  314. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  315. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  316. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  317. package/_standalone/components/settings/McpTab.tsx +1 -5
  318. package/_standalone/components/settings/TestButton.tsx +1 -0
  319. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  320. package/_standalone/components/settings/types.ts +12 -0
  321. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  322. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  323. package/_standalone/hooks/useAcpDetection.ts +1 -1
  324. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  325. package/_standalone/hooks/useFileImport.ts +7 -2
  326. package/_standalone/hooks/useFileUpload.ts +17 -10
  327. package/_standalone/lib/acp/index.ts +3 -7
  328. package/_standalone/lib/acp/types.ts +0 -29
  329. package/_standalone/lib/im/platforms.ts +6 -2
  330. package/_standalone/lib/pdf-extract.ts +6 -2
  331. package/_standalone/package-lock.json +12 -2
  332. package/_standalone/package.json +2 -1
  333. package/_standalone/tsconfig.tsbuildinfo +1 -1
  334. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  335. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  336. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  337. package/app/app/api/channels/verify/route.ts +54 -0
  338. package/app/app/api/extract-pdf/route.ts +17 -3
  339. package/app/app/api/settings/list-models/route.ts +40 -44
  340. package/app/app/api/settings/route.ts +16 -0
  341. package/app/app/api/settings/test-key/route.ts +5 -2
  342. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  343. package/app/components/Breadcrumb.tsx +11 -11
  344. package/app/components/DirView.tsx +1 -1
  345. package/app/components/FindInPage.tsx +1 -1
  346. package/app/components/InboxView.tsx +2 -2
  347. package/app/components/MarkdownView.tsx +4 -0
  348. package/app/components/Panel.tsx +17 -10
  349. package/app/components/TableOfContents.tsx +9 -9
  350. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  351. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  352. package/app/components/ask/AskContent.tsx +68 -28
  353. package/app/components/ask/AskHeader.tsx +6 -2
  354. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  355. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  356. package/app/components/settings/AiTab.tsx +5 -1
  357. package/app/components/settings/KnowledgeTab.tsx +92 -1
  358. package/app/components/settings/McpConnectGuides.tsx +4 -0
  359. package/app/components/settings/McpPortSection.tsx +207 -0
  360. package/app/components/settings/McpTab.tsx +1 -5
  361. package/app/components/settings/TestButton.tsx +1 -0
  362. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  363. package/app/components/settings/types.ts +12 -0
  364. package/app/components/settings/useCustomProviderForm.ts +2 -2
  365. package/app/data/skills/mindos/SKILL.md +45 -1
  366. package/app/hooks/useAcpDetection.ts +1 -1
  367. package/app/hooks/useAcpRegistry.ts +1 -1
  368. package/app/hooks/useFileImport.ts +7 -2
  369. package/app/hooks/useFileUpload.ts +17 -10
  370. package/app/lib/acp/agent-descriptors.ts +18 -0
  371. package/app/lib/acp/index.ts +3 -7
  372. package/app/lib/acp/registry.ts +1 -1
  373. package/app/lib/acp/session.ts +237 -530
  374. package/app/lib/acp/subprocess.ts +224 -427
  375. package/app/lib/acp/types.ts +0 -29
  376. package/app/lib/agent/model.ts +20 -4
  377. package/app/lib/agent/non-streaming.ts +37 -20
  378. package/app/lib/agent/providers.ts +31 -0
  379. package/app/lib/agent/tools.ts +2 -1
  380. package/app/lib/core/embedding-index.ts +285 -0
  381. package/app/lib/core/embedding-provider.ts +164 -0
  382. package/app/lib/core/hybrid-search.ts +160 -0
  383. package/app/lib/core/search.ts +11 -21
  384. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  385. package/app/lib/i18n/modules/panels.ts +14 -0
  386. package/app/lib/i18n/modules/settings.ts +2 -0
  387. package/app/lib/im/platforms.ts +6 -2
  388. package/app/lib/im/verify.ts +94 -0
  389. package/app/lib/pdf-extract.ts +6 -2
  390. package/app/lib/settings.ts +23 -0
  391. package/app/package.json +2 -1
  392. package/bin/cli.js +3 -1
  393. package/bin/commands/channel.js +342 -0
  394. package/bin/commands/update.js +11 -4
  395. package/bin/lib/build.js +34 -16
  396. package/bin/lib/channel-config.js +168 -0
  397. package/bin/lib/channel-constants.js +88 -0
  398. package/bin/lib/channel-mgmt.js +244 -0
  399. package/bin/lib/channel-prompts.js +72 -0
  400. package/bin/lib/channel-validate.js +57 -0
  401. package/bin/lib/safe-rm.js +165 -0
  402. package/package.json +1 -1
  403. package/skills/mindos/SKILL.md +45 -1
  404. package/_standalone/.next/server/chunks/1750.js +0 -1
  405. package/_standalone/.next/server/chunks/7200.js +0 -52
  406. package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
  407. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  408. package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
  409. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  410. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  411. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  412. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  413. package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
  414. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  415. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  416. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  417. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  418. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  419. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  481. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
  483. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
  485. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  486. package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
  487. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  489. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  491. package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
  492. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  493. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  494. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  495. package/app/lib/core/synonym-dict.ts +0 -139
  496. /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -1,9 +1,14 @@
1
1
  /**
2
2
  * ACP Session Manager — High-level session lifecycle for ACP agents.
3
- * Manages session creation, prompt turns, cancellation, and cleanup.
4
- * Implements full ACP spec: initialize → session/new → session/prompt → session/cancel → close.
3
+ * Uses @agentclientprotocol/sdk for all protocol handling.
4
+ * Implements: initialize → session/new → session/prompt → session/cancel → close.
5
5
  */
6
6
 
7
+ import type {
8
+ ClientSideConnection,
9
+ SessionNotification,
10
+ SessionUpdate,
11
+ } from '@agentclientprotocol/sdk';
7
12
  import type {
8
13
  AcpSession,
9
14
  AcpSessionState,
@@ -19,22 +24,26 @@ import type {
19
24
  AcpContentBlock,
20
25
  } from './types';
21
26
  import {
22
- spawnAcpAgent,
23
- sendAndWait,
24
- sendMessage,
25
- onMessage,
26
- onNotification,
27
+ spawnAndConnect,
27
28
  killAgent,
28
- installAutoApproval,
29
- type AcpProcess,
29
+ type AcpConnection,
30
30
  } from './subprocess';
31
31
  import { findAcpAgent } from './registry';
32
32
 
33
+ /* ── Version ───────────────────────────────────────────────────────────── */
34
+
35
+ let _cachedVersion = '';
36
+ function getMindosVersion(): string {
37
+ if (!_cachedVersion) {
38
+ try { _cachedVersion = require('../../package.json').version ?? '0.0.0'; } catch { _cachedVersion = '0.0.0'; }
39
+ }
40
+ return _cachedVersion;
41
+ }
42
+
33
43
  /* ── State ─────────────────────────────────────────────────────────────── */
34
44
 
35
45
  const sessions = new Map<string, AcpSession>();
36
- const sessionProcesses = new Map<string, AcpProcess>();
37
- const autoApprovalCleanups = new Map<string, () => void>();
46
+ const sessionConnections = new Map<string, AcpConnection>();
38
47
 
39
48
  const MAX_SESSIONS_PER_AGENT = 3;
40
49
  const MAX_TOTAL_SESSIONS = 10;
@@ -43,7 +52,6 @@ const MAX_TOTAL_SESSIONS = 10;
43
52
 
44
53
  /**
45
54
  * Create a new ACP session by spawning an agent process.
46
- * Full ACP lifecycle: spawn → initialize → authenticate (if needed) → session/new.
47
55
  */
48
56
  export async function createSession(
49
57
  agentId: string,
@@ -53,7 +61,6 @@ export async function createSession(
53
61
  if (!entry) {
54
62
  throw new Error(`ACP agent not found in registry: ${agentId}`);
55
63
  }
56
-
57
64
  return createSessionFromEntry(entry, options);
58
65
  }
59
66
 
@@ -66,94 +73,65 @@ export async function createSessionFromEntry(
66
73
  ): Promise<AcpSession> {
67
74
  checkSessionLimits(entry.id);
68
75
 
69
- const proc = spawnAcpAgent(entry, options);
70
-
71
76
  const sessionCwd = options?.cwd ?? process.cwd();
72
- const unsubApproval = installAutoApproval(proc, { cwd: sessionCwd });
77
+ const conn = spawnAndConnect(entry, options);
73
78
 
74
79
  let agentCapabilities: AcpAgentCapabilities | undefined;
75
80
  let authMethods: AcpAuthMethod[] | undefined;
76
81
 
77
- // Phase 1: Initialize — negotiate protocol and capabilities
82
+ // Phase 1: Initialize
78
83
  try {
79
- const response = await sendAndWait(proc, 'initialize', {
84
+ const initResult = await conn.connection.initialize({
80
85
  protocolVersion: 1,
81
- capabilities: {
86
+ clientCapabilities: {
82
87
  fs: { readTextFile: true, writeTextFile: true },
83
88
  terminal: true,
84
89
  },
85
- clientInfo: { name: 'mindos', version: '0.6.29' },
86
- }, 30_000);
87
-
88
- if (response.error) {
89
- unsubApproval();
90
- killAgent(proc);
91
- throw new Error(`initialize failed: ${response.error.message}`);
92
- }
90
+ clientInfo: { name: 'mindos', version: getMindosVersion() },
91
+ });
93
92
 
94
- // Parse agent capabilities from response
95
- const initResult = response.result as Record<string, unknown> | undefined;
96
- if (initResult) {
97
- agentCapabilities = parseAgentCapabilities(initResult.agentCapabilities);
98
- authMethods = parseAuthMethods(initResult.authMethods);
99
- }
93
+ agentCapabilities = parseAgentCapabilities(initResult.agentCapabilities);
94
+ authMethods = parseAuthMethods(initResult.authMethods);
100
95
  } catch (err) {
101
- unsubApproval();
102
- killAgent(proc);
103
- throw err;
96
+ killAgent(conn.process);
97
+ throw new Error(`initialize failed: ${(err as Error).message}`);
104
98
  }
105
99
 
106
100
  // Phase 2: Authenticate (if agent declares auth methods)
107
101
  if (authMethods && authMethods.length > 0) {
108
102
  try {
109
- const authResponse = await sendAndWait(proc, 'authenticate', {
110
- methodId: authMethods[0].id,
111
- }, 15_000);
112
-
113
- if (authResponse.error) {
114
- // Authentication failed — non-fatal, log and continue
115
- console.warn(`ACP authenticate warning for ${entry.id}: ${authResponse.error.message}`);
116
- }
103
+ await conn.connection.authenticate({ methodId: authMethods[0].id });
117
104
  } catch {
118
- // Best-effort auth — agent may not require it
105
+ // Best-effort auth
119
106
  }
120
107
  }
121
108
 
122
- // Phase 3: session/new — create the conversation session
109
+ // Phase 3: session/new
123
110
  let modes: AcpMode[] | undefined;
124
111
  let configOptions: AcpConfigOption[] | undefined;
125
112
  let agentSessionId: string | undefined;
126
113
 
127
114
  try {
128
- const newResponse = await sendAndWait(proc, 'session/new', {
115
+ const newResult = await conn.connection.newSession({
129
116
  cwd: sessionCwd,
130
117
  mcpServers: [],
131
- }, 15_000);
132
-
133
- if (newResponse.error) {
134
- const errMsg = newResponse.error.message ?? 'session/new failed';
135
- if (/auth/i.test(errMsg)) {
136
- unsubApproval();
137
- killAgent(proc);
138
- throw new Error(`${entry.id}: ${errMsg}`);
139
- }
140
- console.warn(`ACP session/new warning for ${entry.id}: ${errMsg}`);
141
- } else {
142
- const newResult = newResponse.result as Record<string, unknown> | undefined;
143
- if (newResult) {
144
- // The agent assigns its own sessionId — we MUST use it for all future RPC calls
145
- if (typeof newResult.sessionId === 'string') {
146
- agentSessionId = newResult.sessionId;
147
- }
148
- modes = parseModes(newResult.modes);
149
- configOptions = parseConfigOptions(newResult.configOptions);
150
- }
118
+ });
119
+
120
+ if (typeof newResult.sessionId === 'string') {
121
+ agentSessionId = newResult.sessionId;
151
122
  }
123
+ modes = parseModes(newResult.modes);
124
+ configOptions = parseConfigOptions(newResult.configOptions);
152
125
  } catch (sessionErr) {
153
- if (sessionErr instanceof Error && /auth/i.test(sessionErr.message)) throw sessionErr;
126
+ const msg = (sessionErr as Error).message ?? '';
127
+ if (/auth/i.test(msg)) {
128
+ killAgent(conn.process);
129
+ throw new Error(`${entry.id}: ${msg}`);
130
+ }
131
+ // Non-auth errors: log and continue (session may still be usable)
132
+ console.warn(`ACP session/new warning for ${entry.id}: ${msg}`);
154
133
  }
155
134
 
156
- // Reap stale sessions lazily on each new session creation
157
135
  reapStaleSessions();
158
136
 
159
137
  const sessionId = `ses-${entry.id}-${Date.now()}`;
@@ -172,14 +150,12 @@ export async function createSessionFromEntry(
172
150
  };
173
151
 
174
152
  sessions.set(sessionId, session);
175
- sessionProcesses.set(sessionId, proc);
176
- autoApprovalCleanups.set(sessionId, unsubApproval);
153
+ sessionConnections.set(sessionId, conn);
177
154
  return session;
178
155
  }
179
156
 
180
157
  /**
181
158
  * Load/resume an existing session on an agent.
182
- * Requires agent to declare `loadSession` capability.
183
159
  */
184
160
  export async function loadSession(
185
161
  agentId: string,
@@ -191,72 +167,45 @@ export async function loadSession(
191
167
  throw new Error(`ACP agent not found in registry: ${agentId}`);
192
168
  }
193
169
 
194
- const proc = spawnAcpAgent(entry, options);
195
170
  const loadCwd = options?.cwd ?? process.cwd();
196
- const unsubApproval = installAutoApproval(proc, { cwd: loadCwd });
171
+ const conn = spawnAndConnect(entry, options);
197
172
 
198
173
  let agentCapabilities: AcpAgentCapabilities | undefined;
199
174
 
200
- // Initialize
201
175
  try {
202
- const initResponse = await sendAndWait(proc, 'initialize', {
176
+ const initResult = await conn.connection.initialize({
203
177
  protocolVersion: 1,
204
- capabilities: {
178
+ clientCapabilities: {
205
179
  fs: { readTextFile: true, writeTextFile: true },
206
180
  terminal: true,
207
181
  },
208
- clientInfo: { name: 'mindos', version: '0.6.29' },
209
- }, 30_000);
210
-
211
- if (initResponse.error) {
212
- unsubApproval();
213
- killAgent(proc);
214
- throw new Error(`initialize failed: ${initResponse.error.message}`);
215
- }
216
-
217
- const initResult = initResponse.result as Record<string, unknown> | undefined;
218
- if (initResult) {
219
- agentCapabilities = parseAgentCapabilities(initResult.agentCapabilities);
220
- }
182
+ clientInfo: { name: 'mindos', version: getMindosVersion() },
183
+ });
184
+ agentCapabilities = parseAgentCapabilities(initResult.agentCapabilities);
221
185
  } catch (err) {
222
- unsubApproval();
223
- killAgent(proc);
224
- throw err;
186
+ killAgent(conn.process);
187
+ throw new Error(`initialize failed: ${(err as Error).message}`);
225
188
  }
226
189
 
227
- // Check if agent supports loadSession
228
190
  if (!agentCapabilities?.loadSession) {
229
- unsubApproval();
230
- killAgent(proc);
231
- throw new Error(`Agent ${agentId} does not support session/load (loadSession capability not declared)`);
191
+ killAgent(conn.process);
192
+ throw new Error(`Agent ${agentId} does not support session/load`);
232
193
  }
233
194
 
234
- // session/load — resume the existing session
235
195
  let modes: AcpMode[] | undefined;
236
196
  let configOptions: AcpConfigOption[] | undefined;
237
197
 
238
198
  try {
239
- const loadResponse = await sendAndWait(proc, 'session/load', {
199
+ const loadResult = await conn.connection.loadSession({
240
200
  sessionId: existingSessionId,
241
201
  cwd: loadCwd,
242
202
  mcpServers: [],
243
- }, 15_000);
244
-
245
- if (loadResponse.error) {
246
- unsubApproval();
247
- killAgent(proc);
248
- throw new Error(`session/load failed: ${loadResponse.error.message}`);
249
- }
250
-
251
- const loadResult = loadResponse.result as Record<string, unknown> | undefined;
252
- if (loadResult) {
253
- modes = parseModes(loadResult.modes);
254
- configOptions = parseConfigOptions(loadResult.configOptions);
255
- }
203
+ });
204
+ modes = parseModes(loadResult.modes);
205
+ configOptions = parseConfigOptions(loadResult.configOptions);
256
206
  } catch (err) {
257
- unsubApproval();
258
- killAgent(proc);
259
- throw err;
207
+ killAgent(conn.process);
208
+ throw new Error(`session/load failed: ${(err as Error).message}`);
260
209
  }
261
210
 
262
211
  const session: AcpSession = {
@@ -273,65 +222,52 @@ export async function loadSession(
273
222
  };
274
223
 
275
224
  sessions.set(existingSessionId, session);
276
- sessionProcesses.set(existingSessionId, proc);
277
- autoApprovalCleanups.set(existingSessionId, unsubApproval);
225
+ sessionConnections.set(existingSessionId, conn);
278
226
  return session;
279
227
  }
280
228
 
281
229
  /**
282
230
  * List resumable sessions from the agent.
283
- * Requires agent to declare `sessionCapabilities.list`.
284
231
  */
285
232
  export async function listSessions(
286
233
  sessionId: string,
287
234
  options?: { cursor?: string; cwd?: string },
288
235
  ): Promise<{ sessions: AcpSessionInfo[]; nextCursor?: string }> {
289
- const { session, proc } = getSessionAndProc(sessionId);
236
+ const { session, conn } = getSessionAndConn(sessionId);
290
237
 
291
238
  if (!session.agentCapabilities?.sessionCapabilities?.list) {
292
239
  throw new Error('Agent does not support session/list');
293
240
  }
294
241
 
295
- const response = await sendAndWait(proc, 'session/list', {
242
+ const result = await conn.connection.listSessions({
296
243
  ...(options?.cursor ? { cursor: options.cursor } : {}),
297
244
  ...(options?.cwd ? { cwd: options.cwd } : {}),
298
- }, 10_000);
299
-
300
- if (response.error) {
301
- throw new Error(`session/list failed: ${response.error.message}`);
302
- }
303
-
304
- const result = response.result as Record<string, unknown> | undefined;
305
- const rawSessions = Array.isArray(result?.sessions) ? result.sessions : [];
245
+ });
306
246
 
307
247
  return {
308
- sessions: rawSessions.map((s: unknown) => {
309
- const obj = s as Record<string, unknown>;
310
- return {
311
- sessionId: String(obj.sessionId ?? ''),
312
- title: typeof obj.title === 'string' ? obj.title : undefined,
313
- cwd: typeof obj.cwd === 'string' ? obj.cwd : undefined,
314
- updatedAt: typeof obj.updatedAt === 'string' ? obj.updatedAt : undefined,
315
- };
316
- }),
317
- nextCursor: typeof result?.nextCursor === 'string' ? result.nextCursor : undefined,
248
+ sessions: (result.sessions ?? []).map(s => ({
249
+ sessionId: s.sessionId ?? '',
250
+ title: s.title ?? undefined,
251
+ cwd: s.cwd ?? undefined,
252
+ updatedAt: s.updatedAt ?? undefined,
253
+ })),
254
+ nextCursor: result.nextCursor ?? undefined,
318
255
  };
319
256
  }
320
257
 
321
258
  /* ── Public API — Prompt ──────────────────────────────────────────────── */
322
259
 
260
+ const PROMPT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
261
+
323
262
  /**
324
- * Send a prompt to an active session and collect the full response.
325
- * Aggregates text from session/update notifications (primary content delivery mechanism
326
- * for agents like Gemini CLI that send text via streaming notifications, not in the
327
- * final JSON-RPC response).
328
- * For streaming, use promptStream() instead.
263
+ * Send a prompt and collect the full response.
264
+ * Text arrives via session/update notifications (handled by SDK → Client.sessionUpdate).
329
265
  */
330
266
  export async function prompt(
331
267
  sessionId: string,
332
268
  text: string,
333
269
  ): Promise<AcpPromptResponse> {
334
- const { session, proc } = getSessionAndProc(sessionId);
270
+ const { session, conn } = getSessionAndConn(sessionId);
335
271
 
336
272
  if (session.state === 'active') {
337
273
  throw new Error(`Session ${sessionId} is busy processing another prompt`);
@@ -340,62 +276,48 @@ export async function prompt(
340
276
  updateSessionState(session, 'active');
341
277
  const wireSessionId = session.agentSessionId ?? sessionId;
342
278
 
343
- // Collect text from streaming notifications while sendAndWait waits for the final response
344
279
  let notificationText = '';
345
- const unsubNotify = onNotification(proc, (notif) => {
346
- if (notif.method !== 'session/update' || !notif.params) return;
347
- const update = parseNotificationToUpdate(sessionId, notif.params);
348
- if (!update) return;
280
+ conn.callbacks.onSessionUpdate = (params) => {
281
+ const update = sdkNotificationToUpdate(sessionId, params);
349
282
  if ((update.type === 'agent_message_chunk' || update.type === 'text') && update.text) {
350
283
  notificationText += update.text;
351
284
  }
352
- });
285
+ };
353
286
 
354
287
  try {
355
- const response = await sendAndWait(proc, 'session/prompt', {
356
- sessionId: wireSessionId,
357
- prompt: [{ type: 'text', text }] satisfies AcpContentBlock[],
358
- ...(session.cwd ? { context: { cwd: session.cwd } } : {}),
359
- }, 120_000);
360
-
361
- unsubNotify();
362
-
363
- if (response.error) {
364
- updateSessionState(session, 'error');
365
- throw new Error(`session/prompt error: ${response.error.message}`);
366
- }
288
+ const result = await withTimeout(
289
+ conn.connection.prompt({
290
+ sessionId: wireSessionId,
291
+ prompt: [{ type: 'text', text }] satisfies AcpContentBlock[],
292
+ }),
293
+ PROMPT_TIMEOUT_MS,
294
+ `Prompt timed out after ${PROMPT_TIMEOUT_MS / 1000}s`,
295
+ );
367
296
 
368
297
  updateSessionState(session, 'idle');
369
- const result = response.result as Record<string, unknown>;
370
- const responseText = typeof result?.text === 'string' ? result.text : '';
371
298
  return {
372
299
  sessionId,
373
- text: notificationText || responseText,
300
+ text: notificationText || '',
374
301
  done: true,
375
- stopReason: parseStopReason(result?.stopReason),
376
- toolCalls: result?.toolCalls as AcpPromptResponse['toolCalls'],
377
- metadata: result?.metadata as AcpPromptResponse['metadata'],
302
+ stopReason: result.stopReason as AcpStopReason,
378
303
  };
379
304
  } catch (err) {
380
- unsubNotify();
381
305
  updateSessionState(session, 'error');
382
306
  throw err;
307
+ } finally {
308
+ conn.callbacks.onSessionUpdate = undefined;
383
309
  }
384
310
  }
385
311
 
386
312
  /**
387
313
  * Send a prompt and receive streaming updates via callback.
388
- * Handles both:
389
- * 1. JSON-RPC notifications (session/update) — the standard ACP streaming mechanism
390
- * 2. JSON-RPC responses with update data — backward compat for older agents
391
- * Returns the final aggregated response.
392
314
  */
393
315
  export async function promptStream(
394
316
  sessionId: string,
395
317
  text: string,
396
318
  onUpdate: (update: AcpSessionUpdate) => void,
397
319
  ): Promise<AcpPromptResponse> {
398
- const { session, proc } = getSessionAndProc(sessionId);
320
+ const { session, conn } = getSessionAndConn(sessionId);
399
321
 
400
322
  if (session.state === 'active') {
401
323
  throw new Error(`Session ${sessionId} is busy processing another prompt`);
@@ -404,258 +326,116 @@ export async function promptStream(
404
326
  updateSessionState(session, 'active');
405
327
  const wireSessionId = session.agentSessionId ?? sessionId;
406
328
 
407
- const PROMPT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
408
-
409
- return new Promise((resolve, reject) => {
410
- let aggregatedText = '';
411
- let stopReason: AcpStopReason = 'end_turn';
412
- let settled = false;
413
- let promptRpcId: string;
414
-
415
- const settle = (fn: () => void) => {
416
- if (settled) return;
417
- settled = true;
418
- cleanup();
419
- fn();
420
- };
421
-
422
- // ── 0. Timeout guard ──
423
- const timeoutTimer = setTimeout(() => {
424
- settle(() => {
425
- updateSessionState(session, 'error');
426
- reject(new Error(`Prompt timed out after ${PROMPT_TIMEOUT_MS / 1000}s — no response from agent`));
427
- });
428
- }, PROMPT_TIMEOUT_MS);
429
-
430
- // ── 1. Notifications: primary streaming channel ──
431
- const unsubNotify = onNotification(proc, (notif) => {
432
- if (settled) return;
433
- if (notif.method !== 'session/update' || !notif.params) return;
434
-
435
- const update = parseNotificationToUpdate(sessionId, notif.params);
436
- if (!update) return;
437
-
438
- onUpdate(update);
439
-
440
- if ((update.type === 'agent_message_chunk' || update.type === 'text') && update.text) {
441
- aggregatedText += update.text;
442
- }
443
- if (update.type === 'config_option_update' && update.configOptions) {
444
- session.configOptions = update.configOptions;
445
- }
446
- if (update.type === 'error') {
447
- settle(() => {
448
- updateSessionState(session, 'error');
449
- reject(new Error(update.error ?? 'Unknown ACP error'));
450
- });
451
- }
452
- if (update.type === 'done') {
453
- settle(() => {
454
- updateSessionState(session, 'idle');
455
- resolve({ sessionId, text: aggregatedText, done: true, stopReason });
456
- });
457
- }
458
- });
459
-
460
- // ── 2. Responses: completion signal + legacy streaming fallback ──
461
- const unsubMsg = onMessage(proc, (msg) => {
462
- if (settled) return;
463
-
464
- // Final response — matches the RPC ID of our prompt request
465
- if (String(msg.id) === promptRpcId) {
466
- if (msg.error) {
467
- settle(() => {
468
- updateSessionState(session, 'error');
469
- reject(new Error(`session/prompt error: ${msg.error!.message}`));
470
- });
471
- return;
472
- }
473
- const result = msg.result as Record<string, unknown> | undefined;
474
- if (result?.stopReason) stopReason = parseStopReason(result.stopReason);
475
- const responseText = typeof result?.text === 'string' ? result.text : '';
476
- if (responseText && !aggregatedText) aggregatedText = responseText;
477
-
478
- onUpdate({ sessionId, type: 'done' });
479
- settle(() => {
480
- updateSessionState(session, 'idle');
481
- resolve({ sessionId, text: aggregatedText, done: true, stopReason });
482
- });
483
- return;
484
- }
485
-
486
- // Legacy: responses with update-like result (for agents that stream via responses)
487
- if (msg.result && typeof msg.result === 'object') {
488
- const raw = msg.result as Record<string, unknown>;
489
- const update = parseSessionUpdate(sessionId, raw);
490
- onUpdate(update);
491
- if ((update.type === 'agent_message_chunk' || update.type === 'text') && update.text) {
492
- aggregatedText += update.text;
493
- }
494
- if (update.type === 'done') {
495
- if (raw.stopReason) stopReason = parseStopReason(raw.stopReason);
496
- settle(() => {
497
- updateSessionState(session, 'idle');
498
- resolve({ sessionId, text: aggregatedText, done: true, stopReason });
499
- });
500
- }
501
- if (update.type === 'error') {
502
- settle(() => {
503
- updateSessionState(session, 'error');
504
- reject(new Error(update.error ?? 'Unknown ACP error'));
505
- });
506
- }
507
- }
508
- });
509
-
510
- // ── 3. Process exit guard ──
511
- const onExit = () => {
512
- settle(() => {
513
- updateSessionState(session, 'error');
514
- reject(new Error('ACP agent process exited unexpectedly during prompt'));
515
- });
516
- };
517
- proc.proc.once('exit', onExit);
329
+ let aggregatedText = '';
330
+ conn.callbacks.onSessionUpdate = (params) => {
331
+ const update = sdkNotificationToUpdate(sessionId, params);
332
+ onUpdate(update);
518
333
 
519
- const cleanup = () => {
520
- clearTimeout(timeoutTimer);
521
- unsubNotify();
522
- unsubMsg();
523
- proc.proc.removeListener('exit', onExit);
524
- };
334
+ if ((update.type === 'agent_message_chunk' || update.type === 'text') && update.text) {
335
+ aggregatedText += update.text;
336
+ }
337
+ if (update.type === 'config_option_update' && update.configOptions) {
338
+ session.configOptions = update.configOptions;
339
+ }
340
+ };
525
341
 
526
- // ── 4. Send the prompt ──
527
- try {
528
- promptRpcId = sendMessage(proc, 'session/prompt', {
342
+ try {
343
+ const result = await withTimeout(
344
+ conn.connection.prompt({
529
345
  sessionId: wireSessionId,
530
346
  prompt: [{ type: 'text', text }] satisfies AcpContentBlock[],
531
- stream: true,
532
- ...(session.cwd ? { context: { cwd: session.cwd } } : {}),
533
- });
534
- } catch (err) {
535
- settle(() => {
536
- updateSessionState(session, 'error');
537
- reject(err);
538
- });
539
- }
540
- });
347
+ }),
348
+ PROMPT_TIMEOUT_MS,
349
+ `Prompt timed out after ${PROMPT_TIMEOUT_MS / 1000}s`,
350
+ );
351
+
352
+ onUpdate({ sessionId, type: 'done' });
353
+ updateSessionState(session, 'idle');
354
+ return {
355
+ sessionId,
356
+ text: aggregatedText,
357
+ done: true,
358
+ stopReason: result.stopReason as AcpStopReason,
359
+ };
360
+ } catch (err) {
361
+ updateSessionState(session, 'error');
362
+ throw err;
363
+ } finally {
364
+ conn.callbacks.onSessionUpdate = undefined;
365
+ }
541
366
  }
542
367
 
543
368
  /* ── Public API — Session Control ─────────────────────────────────────── */
544
369
 
545
- /**
546
- * Cancel the current prompt turn on a session.
547
- */
548
370
  export async function cancelPrompt(sessionId: string): Promise<void> {
549
- const { session, proc } = getSessionAndProc(sessionId);
550
-
371
+ const { session, conn } = getSessionAndConn(sessionId);
551
372
  if (session.state !== 'active') return;
552
373
 
553
374
  const wireSessionId = session.agentSessionId ?? sessionId;
554
375
  try {
555
- await sendAndWait(proc, 'session/cancel', { sessionId: wireSessionId }, 10_000);
376
+ await conn.connection.cancel({ sessionId: wireSessionId });
556
377
  } catch {
557
378
  // Best-effort cancel
558
379
  }
559
-
560
380
  updateSessionState(session, 'idle');
561
381
  }
562
382
 
563
- /**
564
- * Set the operating mode for a session.
565
- */
566
383
  export async function setMode(sessionId: string, modeId: string): Promise<void> {
567
- const { session, proc } = getSessionAndProc(sessionId);
568
-
384
+ const { session, conn } = getSessionAndConn(sessionId);
569
385
  const wireSessionId = session.agentSessionId ?? sessionId;
570
- const response = await sendAndWait(proc, 'session/set_mode', {
571
- sessionId: wireSessionId,
572
- modeId,
573
- }, 10_000);
574
-
575
- if (response.error) {
576
- throw new Error(`session/set_mode failed: ${response.error.message}`);
577
- }
578
-
386
+ await conn.connection.setSessionMode({ sessionId: wireSessionId, modeId });
579
387
  session.lastActivityAt = new Date().toISOString();
580
388
  }
581
389
 
582
- /**
583
- * Set a configuration option for a session.
584
- */
585
390
  export async function setConfigOption(
586
391
  sessionId: string,
587
392
  configId: string,
588
393
  value: string,
589
394
  ): Promise<AcpConfigOption[]> {
590
- const { session, proc } = getSessionAndProc(sessionId);
591
-
395
+ const { session, conn } = getSessionAndConn(sessionId);
592
396
  const wireSessionId = session.agentSessionId ?? sessionId;
593
- const response = await sendAndWait(proc, 'session/set_config_option', {
397
+
398
+ const result = await conn.connection.setSessionConfigOption({
594
399
  sessionId: wireSessionId,
595
400
  configId,
596
401
  value,
597
- }, 10_000);
598
-
599
- if (response.error) {
600
- throw new Error(`session/set_config_option failed: ${response.error.message}`);
601
- }
602
-
603
- const result = response.result as Record<string, unknown> | undefined;
604
- const configOptions = parseConfigOptions(result?.configOptions);
605
- if (configOptions) {
606
- session.configOptions = configOptions;
607
- }
402
+ });
608
403
 
404
+ const configOptions = parseConfigOptions(result.configOptions);
405
+ if (configOptions) session.configOptions = configOptions;
609
406
  session.lastActivityAt = new Date().toISOString();
610
407
  return session.configOptions ?? [];
611
408
  }
612
409
 
613
- /**
614
- * Close a session and terminate the subprocess.
615
- */
616
410
  export async function closeSession(sessionId: string): Promise<void> {
617
411
  const session = sessions.get(sessionId);
618
- const proc = sessionProcesses.get(sessionId);
412
+ const conn = sessionConnections.get(sessionId);
619
413
 
620
- if (proc?.alive) {
414
+ if (conn?.process.alive) {
621
415
  const wireSessionId = session?.agentSessionId ?? sessionId;
622
416
  try {
623
- await sendAndWait(proc, 'session/close', { sessionId: wireSessionId }, 5_000);
417
+ await conn.connection.unstable_closeSession({ sessionId: wireSessionId });
624
418
  } catch {
625
- // Best-effort close — many agents (e.g. Gemini) don't support this method
419
+ // Best-effort — many agents don't support session/close
626
420
  }
627
- killAgent(proc);
421
+ killAgent(conn.process);
628
422
  }
629
423
 
630
424
  sessions.delete(sessionId);
631
- sessionProcesses.delete(sessionId);
632
- const cleanup = autoApprovalCleanups.get(sessionId);
633
- if (cleanup) {
634
- cleanup();
635
- autoApprovalCleanups.delete(sessionId);
636
- }
425
+ sessionConnections.delete(sessionId);
637
426
  }
638
427
 
639
428
  /* ── Public API — Queries ─────────────────────────────────────────────── */
640
429
 
641
- /**
642
- * Get a session by its ID.
643
- */
644
430
  export function getSession(sessionId: string): AcpSession | undefined {
645
431
  return sessions.get(sessionId);
646
432
  }
647
433
 
648
- /**
649
- * Get all active sessions. Also reaps stale sessions.
650
- */
651
434
  export function getActiveSessions(): AcpSession[] {
652
435
  reapStaleSessions();
653
436
  return [...sessions.values()];
654
437
  }
655
438
 
656
- /**
657
- * Close all active sessions. Used for cleanup.
658
- */
659
439
  export async function closeAllSessions(): Promise<void> {
660
440
  const ids = [...sessions.keys()];
661
441
  await Promise.allSettled(ids.map(id => closeSession(id)));
@@ -663,17 +443,17 @@ export async function closeAllSessions(): Promise<void> {
663
443
 
664
444
  /* ── Internal — Session helpers ───────────────────────────────────────── */
665
445
 
666
- function getSessionAndProc(sessionId: string): { session: AcpSession; proc: AcpProcess } {
446
+ function getSessionAndConn(sessionId: string): { session: AcpSession; conn: AcpConnection } {
667
447
  const session = sessions.get(sessionId);
668
448
  if (!session) throw new Error(`Session not found: ${sessionId}`);
669
449
 
670
- const proc = sessionProcesses.get(sessionId);
671
- if (!proc?.alive) {
450
+ const conn = sessionConnections.get(sessionId);
451
+ if (!conn?.process.alive) {
672
452
  updateSessionState(session, 'error');
673
453
  throw new Error(`Session process is dead: ${sessionId}`);
674
454
  }
675
455
 
676
- return { session, proc };
456
+ return { session, conn };
677
457
  }
678
458
 
679
459
  function updateSessionState(session: AcpSession, state: AcpSessionState): void {
@@ -681,13 +461,97 @@ function updateSessionState(session: AcpSession, state: AcpSessionState): void {
681
461
  session.lastActivityAt = new Date().toISOString();
682
462
  }
683
463
 
684
- /* ── Internal Parsers ───────────────────────────────────────────────── */
464
+ function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {
465
+ return new Promise((resolve, reject) => {
466
+ const timer = setTimeout(() => reject(new Error(message)), ms);
467
+ promise.then(
468
+ (v) => { clearTimeout(timer); resolve(v); },
469
+ (e) => { clearTimeout(timer); reject(e); },
470
+ );
471
+ });
472
+ }
473
+
474
+ /* ── Internal — SDK notification → MindOS update ──────────────────────── */
475
+
476
+ /**
477
+ * Convert SDK SessionNotification to MindOS AcpSessionUpdate.
478
+ * The SDK validates and parses the JSON-RPC notification;
479
+ * we just reshape the typed data for our UI layer.
480
+ */
481
+ function sdkNotificationToUpdate(
482
+ sessionId: string,
483
+ params: SessionNotification,
484
+ ): AcpSessionUpdate {
485
+ const update = params.update as SessionUpdate & Record<string, unknown>;
486
+ const type = update.sessionUpdate as AcpSessionUpdate['type'];
487
+ const base: AcpSessionUpdate = { sessionId, type };
488
+
489
+ switch (type) {
490
+ case 'agent_message_chunk':
491
+ case 'user_message_chunk':
492
+ case 'agent_thought_chunk': {
493
+ const content = (update as Record<string, unknown>).content as Record<string, unknown> | undefined;
494
+ if (content?.type === 'text' && typeof content.text === 'string') {
495
+ base.text = content.text;
496
+ } else if (content?.type === 'thinking' && typeof content.text === 'string') {
497
+ base.text = content.text;
498
+ }
499
+ break;
500
+ }
685
501
 
686
- function parseStopReason(raw: unknown): AcpStopReason {
687
- const valid: AcpStopReason[] = ['end_turn', 'max_tokens', 'max_turn_requests', 'refusal', 'cancelled'];
688
- return valid.includes(raw as AcpStopReason) ? (raw as AcpStopReason) : 'end_turn';
502
+ case 'tool_call':
503
+ case 'tool_call_update': {
504
+ const tc = update as Record<string, unknown>;
505
+ base.toolCall = {
506
+ toolCallId: String(tc.toolCallId ?? ''),
507
+ title: typeof tc.title === 'string' ? tc.title : undefined,
508
+ status: (tc.status as 'pending' | 'in_progress' | 'completed' | 'failed') ?? 'pending',
509
+ kind: tc.kind as AcpSessionUpdate['toolCall'] extends { kind: infer K } ? K : undefined,
510
+ rawInput: typeof tc.rawInput === 'string' ? tc.rawInput : undefined,
511
+ rawOutput: typeof tc.rawOutput === 'string' ? tc.rawOutput : undefined,
512
+ };
513
+ break;
514
+ }
515
+
516
+ case 'plan': {
517
+ const planData = update as Record<string, unknown>;
518
+ if (Array.isArray(planData.entries)) {
519
+ base.plan = { entries: planData.entries as AcpSessionUpdate['plan'] extends { entries: infer E } ? E : never };
520
+ }
521
+ break;
522
+ }
523
+
524
+ case 'available_commands_update':
525
+ base.availableCommands = Array.isArray((update as Record<string, unknown>).availableCommands)
526
+ ? (update as Record<string, unknown>).availableCommands as unknown[]
527
+ : undefined;
528
+ break;
529
+
530
+ case 'current_mode_update':
531
+ base.currentModeId = typeof (update as Record<string, unknown>).currentModeId === 'string'
532
+ ? (update as Record<string, unknown>).currentModeId as string
533
+ : undefined;
534
+ break;
535
+
536
+ case 'config_option_update':
537
+ base.configOptions = parseConfigOptions((update as Record<string, unknown>).configOptions);
538
+ break;
539
+
540
+ case 'session_info_update': {
541
+ const info = update as Record<string, unknown>;
542
+ base.sessionInfo = {
543
+ title: typeof info.title === 'string' ? info.title : undefined,
544
+ updatedAt: typeof info.updatedAt === 'string' ? info.updatedAt : undefined,
545
+ };
546
+ break;
547
+ }
548
+ }
549
+
550
+ return base;
689
551
  }
690
552
 
553
+ /* ── Internal — Parsers ───────────────────────────────────────────────── */
554
+
691
555
  function parseAgentCapabilities(raw: unknown): AcpAgentCapabilities | undefined {
692
556
  if (!raw || typeof raw !== 'object') return undefined;
693
557
  const obj = raw as Record<string, unknown>;
@@ -712,7 +576,6 @@ function parseAuthMethods(raw: unknown): AcpAuthMethod[] | undefined {
712
576
  }
713
577
 
714
578
  function parseModes(raw: unknown): AcpMode[] | undefined {
715
- // Handle nested format: { availableModes: [...], currentModeId: "..." }
716
579
  if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
717
580
  const obj = raw as Record<string, unknown>;
718
581
  if (Array.isArray(obj.availableModes)) {
@@ -748,162 +611,6 @@ function parseConfigOptions(raw: unknown): AcpConfigOption[] | undefined {
748
611
  .filter(o => o.configId);
749
612
  }
750
613
 
751
- /** Parse a raw session/update notification into a typed AcpSessionUpdate. */
752
- function parseSessionUpdate(sessionId: string, raw: Record<string, unknown>): AcpSessionUpdate {
753
- const type = raw.type as AcpSessionUpdate['type'] ?? 'text';
754
-
755
- const base: AcpSessionUpdate = { sessionId, type };
756
-
757
- switch (type) {
758
- case 'agent_message_chunk':
759
- case 'user_message_chunk':
760
- case 'agent_thought_chunk':
761
- case 'text':
762
- base.text = typeof raw.text === 'string' ? raw.text
763
- : typeof raw.content === 'string' ? raw.content
764
- : undefined;
765
- break;
766
-
767
- case 'tool_call':
768
- case 'tool_call_update':
769
- if (raw.toolCall && typeof raw.toolCall === 'object') {
770
- base.toolCall = raw.toolCall as AcpSessionUpdate['toolCall'];
771
- } else {
772
- base.toolCall = {
773
- toolCallId: String(raw.toolCallId ?? ''),
774
- title: typeof raw.title === 'string' ? raw.title : undefined,
775
- kind: raw.kind as AcpSessionUpdate['toolCall'] extends { kind: infer K } ? K : undefined,
776
- status: (raw.status as 'pending' | 'in_progress' | 'completed' | 'failed') ?? 'pending',
777
- rawInput: typeof raw.rawInput === 'string' ? raw.rawInput : undefined,
778
- rawOutput: typeof raw.rawOutput === 'string' ? raw.rawOutput : undefined,
779
- };
780
- }
781
- break;
782
-
783
- case 'plan':
784
- if (raw.entries && Array.isArray(raw.entries)) {
785
- base.plan = { entries: raw.entries as AcpSessionUpdate['plan'] extends { entries: infer E } ? E : never };
786
- } else if (raw.plan && typeof raw.plan === 'object') {
787
- base.plan = raw.plan as AcpSessionUpdate['plan'];
788
- }
789
- break;
790
-
791
- case 'available_commands_update':
792
- base.availableCommands = Array.isArray(raw.availableCommands) ? raw.availableCommands : undefined;
793
- break;
794
-
795
- case 'current_mode_update':
796
- base.currentModeId = typeof raw.currentModeId === 'string' ? raw.currentModeId : undefined;
797
- break;
798
-
799
- case 'config_option_update':
800
- base.configOptions = parseConfigOptions(raw.configOptions);
801
- break;
802
-
803
- case 'session_info_update':
804
- base.sessionInfo = {
805
- title: typeof raw.title === 'string' ? raw.title : undefined,
806
- updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : undefined,
807
- };
808
- break;
809
-
810
- case 'error':
811
- base.error = typeof raw.error === 'string' ? raw.error : String(raw.message ?? 'Unknown error');
812
- break;
813
-
814
- case 'done':
815
- break;
816
-
817
- case 'tool_result':
818
- base.toolResult = raw.toolResult as AcpSessionUpdate['toolResult'];
819
- break;
820
- }
821
-
822
- return base;
823
- }
824
-
825
- /**
826
- * Parse a JSON-RPC notification's `params` into a typed AcpSessionUpdate.
827
- * Gemini CLI notification format:
828
- * { sessionId: "...", update: { sessionUpdate: "agent_message_chunk", content: { type: "text", text: "..." } } }
829
- */
830
- function parseNotificationToUpdate(
831
- sessionId: string,
832
- params: Record<string, unknown>,
833
- ): AcpSessionUpdate | null {
834
- const updateObj = params.update as Record<string, unknown> | undefined;
835
- if (!updateObj) return null;
836
-
837
- const updateType = (updateObj.sessionUpdate ?? updateObj.type) as AcpSessionUpdate['type'] | undefined;
838
- if (!updateType) return null;
839
-
840
- const base: AcpSessionUpdate = { sessionId, type: updateType };
841
-
842
- // Extract text from content block
843
- const content = updateObj.content as Record<string, unknown> | undefined;
844
- if (content) {
845
- if (content.type === 'text' && typeof content.text === 'string') {
846
- base.text = content.text;
847
- } else if (content.type === 'thinking' && typeof content.text === 'string') {
848
- base.text = content.text;
849
- }
850
- }
851
-
852
- // Direct text fields (some agents use flat format)
853
- if (!base.text) {
854
- if (typeof updateObj.text === 'string') base.text = updateObj.text;
855
- else if (typeof updateObj.content === 'string') base.text = updateObj.content;
856
- }
857
-
858
- switch (updateType) {
859
- case 'tool_call':
860
- case 'tool_call_update':
861
- if (updateObj.toolCall && typeof updateObj.toolCall === 'object') {
862
- base.toolCall = updateObj.toolCall as AcpSessionUpdate['toolCall'];
863
- } else {
864
- base.toolCall = {
865
- toolCallId: String(updateObj.toolCallId ?? ''),
866
- title: typeof updateObj.title === 'string' ? updateObj.title : undefined,
867
- status: (updateObj.status as 'pending' | 'in_progress' | 'completed' | 'failed') ?? 'pending',
868
- };
869
- }
870
- break;
871
-
872
- case 'plan':
873
- if (updateObj.plan && typeof updateObj.plan === 'object') {
874
- base.plan = updateObj.plan as AcpSessionUpdate['plan'];
875
- } else if (Array.isArray(updateObj.entries)) {
876
- base.plan = { entries: updateObj.entries as AcpSessionUpdate['plan'] extends { entries: infer E } ? E : never };
877
- }
878
- break;
879
-
880
- case 'error':
881
- base.error = typeof updateObj.error === 'string'
882
- ? updateObj.error
883
- : typeof updateObj.message === 'string'
884
- ? updateObj.message
885
- : 'Unknown error';
886
- break;
887
-
888
- case 'config_option_update':
889
- base.configOptions = parseConfigOptions(updateObj.configOptions);
890
- break;
891
-
892
- case 'current_mode_update':
893
- base.currentModeId = typeof updateObj.currentModeId === 'string' ? updateObj.currentModeId : undefined;
894
- break;
895
-
896
- case 'session_info_update':
897
- base.sessionInfo = {
898
- title: typeof updateObj.title === 'string' ? updateObj.title : undefined,
899
- updatedAt: typeof updateObj.updatedAt === 'string' ? updateObj.updatedAt : undefined,
900
- };
901
- break;
902
- }
903
-
904
- return base;
905
- }
906
-
907
614
  /* ── Internal — Session limits ─────────────────────────────────────────── */
908
615
 
909
616
  function checkSessionLimits(agentId: string): void {