@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.
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +22 -21
- package/_standalone/.next/build-manifest.json +3 -3
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/react-loadable-manifest.json +7 -7
- package/_standalone/.next/routes-manifest.json +6 -0
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +1 -1
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +1 -1
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +13 -13
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
- package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +1 -1
- package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +1 -1
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +1 -1
- package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/help/page.js +1 -1
- package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/login/page.js +1 -1
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +1 -1
- package/_standalone/.next/server/app/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/setup/page.js +1 -1
- package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/trash/page.js +3 -3
- package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +22 -21
- package/_standalone/.next/server/chunks/3437.js +2 -2
- package/_standalone/.next/server/chunks/5299.js +1 -0
- package/_standalone/.next/server/chunks/6022.js +42 -42
- package/_standalone/.next/server/chunks/6133.js +54 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8326.js +1 -0
- package/_standalone/.next/server/chunks/8388.js +5 -3
- package/_standalone/.next/server/chunks/953.js +6 -4
- package/_standalone/.next/server/chunks/9938.js +24 -0
- package/_standalone/.next/server/middleware-build-manifest.js +1 -1
- package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
- package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
- package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
- package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
- package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
- package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
- package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
- package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
- package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
- package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
- package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
- package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
- package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
- package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
- package/_standalone/.next/trace +72 -71
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
- package/_standalone/__tests__/acp/session.test.ts +346 -167
- package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
- package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
- package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
- package/_standalone/__tests__/api/test-key.test.ts +15 -3
- package/_standalone/__tests__/channel-mgmt.test.js +11 -0
- package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
- package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
- package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
- package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
- package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
- package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
- package/_standalone/components/Breadcrumb.tsx +11 -11
- package/_standalone/components/FindInPage.tsx +1 -1
- package/_standalone/components/MarkdownView.tsx +4 -0
- package/_standalone/components/Panel.tsx +17 -10
- package/_standalone/components/TableOfContents.tsx +9 -9
- package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
- package/_standalone/components/ask/AskContent.tsx +68 -28
- package/_standalone/components/ask/AskHeader.tsx +6 -2
- package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
- package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
- package/_standalone/components/settings/AiTab.tsx +5 -1
- package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
- package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
- package/_standalone/components/settings/McpPortSection.tsx +207 -0
- package/_standalone/components/settings/McpTab.tsx +1 -5
- package/_standalone/components/settings/TestButton.tsx +1 -0
- package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/_standalone/components/settings/types.ts +12 -0
- package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
- package/_standalone/data/skills/mindos/SKILL.md +45 -1
- package/_standalone/hooks/useAcpDetection.ts +1 -1
- package/_standalone/hooks/useAcpRegistry.ts +1 -1
- package/_standalone/hooks/useFileImport.ts +7 -2
- package/_standalone/hooks/useFileUpload.ts +17 -10
- package/_standalone/lib/acp/index.ts +3 -7
- package/_standalone/lib/acp/types.ts +0 -29
- package/_standalone/lib/im/platforms.ts +6 -2
- package/_standalone/lib/pdf-extract.ts +6 -2
- package/_standalone/package-lock.json +12 -2
- package/_standalone/package.json +2 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/app/app/api/channels/verify/route.ts +54 -0
- package/app/app/api/extract-pdf/route.ts +17 -3
- package/app/app/api/settings/list-models/route.ts +40 -44
- package/app/app/api/settings/route.ts +16 -0
- package/app/app/api/settings/test-key/route.ts +5 -2
- package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
- package/app/components/Breadcrumb.tsx +11 -11
- package/app/components/DirView.tsx +1 -1
- package/app/components/FindInPage.tsx +1 -1
- package/app/components/InboxView.tsx +2 -2
- package/app/components/MarkdownView.tsx +4 -0
- package/app/components/Panel.tsx +17 -10
- package/app/components/TableOfContents.tsx +9 -9
- package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/app/components/agents/AgentsContentChannels.tsx +22 -22
- package/app/components/ask/AskContent.tsx +68 -28
- package/app/components/ask/AskHeader.tsx +6 -2
- package/app/components/ask/ProviderModelCapsule.tsx +11 -9
- package/app/components/ask/SessionHistoryPanel.tsx +398 -0
- package/app/components/settings/AiTab.tsx +5 -1
- package/app/components/settings/KnowledgeTab.tsx +92 -1
- package/app/components/settings/McpConnectGuides.tsx +4 -0
- package/app/components/settings/McpPortSection.tsx +207 -0
- package/app/components/settings/McpTab.tsx +1 -5
- package/app/components/settings/TestButton.tsx +1 -0
- package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/app/components/settings/types.ts +12 -0
- package/app/components/settings/useCustomProviderForm.ts +2 -2
- package/app/data/skills/mindos/SKILL.md +45 -1
- package/app/hooks/useAcpDetection.ts +1 -1
- package/app/hooks/useAcpRegistry.ts +1 -1
- package/app/hooks/useFileImport.ts +7 -2
- package/app/hooks/useFileUpload.ts +17 -10
- package/app/lib/acp/agent-descriptors.ts +18 -0
- package/app/lib/acp/index.ts +3 -7
- package/app/lib/acp/registry.ts +1 -1
- package/app/lib/acp/session.ts +237 -530
- package/app/lib/acp/subprocess.ts +224 -427
- package/app/lib/acp/types.ts +0 -29
- package/app/lib/agent/model.ts +20 -4
- package/app/lib/agent/non-streaming.ts +37 -20
- package/app/lib/agent/providers.ts +31 -0
- package/app/lib/agent/tools.ts +2 -1
- package/app/lib/core/embedding-index.ts +285 -0
- package/app/lib/core/embedding-provider.ts +164 -0
- package/app/lib/core/hybrid-search.ts +160 -0
- package/app/lib/core/search.ts +11 -21
- package/app/lib/i18n/modules/ai-chat.ts +26 -0
- package/app/lib/i18n/modules/panels.ts +14 -0
- package/app/lib/i18n/modules/settings.ts +2 -0
- package/app/lib/im/platforms.ts +6 -2
- package/app/lib/im/verify.ts +94 -0
- package/app/lib/pdf-extract.ts +6 -2
- package/app/lib/settings.ts +23 -0
- package/app/package.json +2 -1
- package/bin/cli.js +3 -1
- package/bin/commands/channel.js +342 -0
- package/bin/commands/update.js +11 -4
- package/bin/lib/build.js +34 -16
- package/bin/lib/channel-config.js +168 -0
- package/bin/lib/channel-constants.js +88 -0
- package/bin/lib/channel-mgmt.js +244 -0
- package/bin/lib/channel-prompts.js +72 -0
- package/bin/lib/channel-validate.js +57 -0
- package/bin/lib/safe-rm.js +165 -0
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +45 -1
- package/_standalone/.next/server/chunks/1750.js +0 -1
- package/_standalone/.next/server/chunks/7200.js +0 -52
- package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
- package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
- package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
- package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
- package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
- package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
- package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
- package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
- package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
- package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
- package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
- package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/synonym-dict.ts +0 -139
- /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
package/app/lib/acp/session.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ACP Session Manager — High-level session lifecycle for ACP agents.
|
|
3
|
-
*
|
|
4
|
-
* Implements
|
|
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
|
-
|
|
23
|
-
sendAndWait,
|
|
24
|
-
sendMessage,
|
|
25
|
-
onMessage,
|
|
26
|
-
onNotification,
|
|
27
|
+
spawnAndConnect,
|
|
27
28
|
killAgent,
|
|
28
|
-
|
|
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
|
|
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
|
|
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
|
|
82
|
+
// Phase 1: Initialize
|
|
78
83
|
try {
|
|
79
|
-
const
|
|
84
|
+
const initResult = await conn.connection.initialize({
|
|
80
85
|
protocolVersion: 1,
|
|
81
|
-
|
|
86
|
+
clientCapabilities: {
|
|
82
87
|
fs: { readTextFile: true, writeTextFile: true },
|
|
83
88
|
terminal: true,
|
|
84
89
|
},
|
|
85
|
-
clientInfo: { name: 'mindos', version:
|
|
86
|
-
}
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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
|
|
105
|
+
// Best-effort auth
|
|
119
106
|
}
|
|
120
107
|
}
|
|
121
108
|
|
|
122
|
-
// Phase 3: session/new
|
|
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
|
|
115
|
+
const newResult = await conn.connection.newSession({
|
|
129
116
|
cwd: sessionCwd,
|
|
130
117
|
mcpServers: [],
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
171
|
+
const conn = spawnAndConnect(entry, options);
|
|
197
172
|
|
|
198
173
|
let agentCapabilities: AcpAgentCapabilities | undefined;
|
|
199
174
|
|
|
200
|
-
// Initialize
|
|
201
175
|
try {
|
|
202
|
-
const
|
|
176
|
+
const initResult = await conn.connection.initialize({
|
|
203
177
|
protocolVersion: 1,
|
|
204
|
-
|
|
178
|
+
clientCapabilities: {
|
|
205
179
|
fs: { readTextFile: true, writeTextFile: true },
|
|
206
180
|
terminal: true,
|
|
207
181
|
},
|
|
208
|
-
clientInfo: { name: 'mindos', version:
|
|
209
|
-
}
|
|
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
|
-
|
|
223
|
-
|
|
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
|
-
|
|
230
|
-
|
|
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
|
|
199
|
+
const loadResult = await conn.connection.loadSession({
|
|
240
200
|
sessionId: existingSessionId,
|
|
241
201
|
cwd: loadCwd,
|
|
242
202
|
mcpServers: [],
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
242
|
+
const result = await conn.connection.listSessions({
|
|
296
243
|
...(options?.cursor ? { cursor: options.cursor } : {}),
|
|
297
244
|
...(options?.cwd ? { cwd: options.cwd } : {}),
|
|
298
|
-
}
|
|
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:
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
|
325
|
-
*
|
|
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,
|
|
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
|
-
|
|
346
|
-
|
|
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
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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 ||
|
|
300
|
+
text: notificationText || '',
|
|
374
301
|
done: true,
|
|
375
|
-
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,
|
|
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
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
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
|
-
|
|
527
|
-
|
|
528
|
-
|
|
342
|
+
try {
|
|
343
|
+
const result = await withTimeout(
|
|
344
|
+
conn.connection.prompt({
|
|
529
345
|
sessionId: wireSessionId,
|
|
530
346
|
prompt: [{ type: 'text', text }] satisfies AcpContentBlock[],
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
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,
|
|
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
|
|
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,
|
|
568
|
-
|
|
384
|
+
const { session, conn } = getSessionAndConn(sessionId);
|
|
569
385
|
const wireSessionId = session.agentSessionId ?? sessionId;
|
|
570
|
-
|
|
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,
|
|
591
|
-
|
|
395
|
+
const { session, conn } = getSessionAndConn(sessionId);
|
|
592
396
|
const wireSessionId = session.agentSessionId ?? sessionId;
|
|
593
|
-
|
|
397
|
+
|
|
398
|
+
const result = await conn.connection.setSessionConfigOption({
|
|
594
399
|
sessionId: wireSessionId,
|
|
595
400
|
configId,
|
|
596
401
|
value,
|
|
597
|
-
}
|
|
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
|
|
412
|
+
const conn = sessionConnections.get(sessionId);
|
|
619
413
|
|
|
620
|
-
if (
|
|
414
|
+
if (conn?.process.alive) {
|
|
621
415
|
const wireSessionId = session?.agentSessionId ?? sessionId;
|
|
622
416
|
try {
|
|
623
|
-
await
|
|
417
|
+
await conn.connection.unstable_closeSession({ sessionId: wireSessionId });
|
|
624
418
|
} catch {
|
|
625
|
-
// Best-effort
|
|
419
|
+
// Best-effort — many agents don't support session/close
|
|
626
420
|
}
|
|
627
|
-
killAgent(
|
|
421
|
+
killAgent(conn.process);
|
|
628
422
|
}
|
|
629
423
|
|
|
630
424
|
sessions.delete(sessionId);
|
|
631
|
-
|
|
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
|
|
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
|
|
671
|
-
if (!
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
687
|
-
|
|
688
|
-
|
|
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 {
|