@rho-workspace/rho 0.5.3 → 0.5.5

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 (277) hide show
  1. package/README.md +24 -5
  2. package/dist/browser-access.js +3 -2
  3. package/dist/capabilities.d.ts +29 -2
  4. package/dist/capabilities.js +79 -2
  5. package/dist/cli.js +237 -99
  6. package/dist/contract.generated.d.ts +441 -16
  7. package/dist/contract.generated.js +1 -1
  8. package/dist/contracts/owners.generated.js +459 -10
  9. package/dist/conversation-presentation.d.ts +3 -1
  10. package/dist/conversation-presentation.js +16 -6
  11. package/dist/conversations.d.ts +10 -6
  12. package/dist/conversations.js +17 -13
  13. package/dist/discovery.d.ts +1 -0
  14. package/dist/discovery.js +3 -3
  15. package/dist/extension-contract.d.ts +99 -0
  16. package/dist/extension-contract.js +52 -0
  17. package/dist/extension-directory.d.ts +9 -0
  18. package/dist/extension-directory.js +11 -0
  19. package/dist/extension-worker.d.ts +1 -0
  20. package/dist/extension-worker.js +36 -0
  21. package/dist/extensions.d.ts +157 -0
  22. package/dist/extensions.js +349 -0
  23. package/dist/installs.d.ts +11 -0
  24. package/dist/installs.js +179 -0
  25. package/dist/plugin-cli.d.ts +1 -0
  26. package/dist/plugin-cli.js +139 -0
  27. package/dist/plugin-inventory.json +18 -0
  28. package/dist/plugins.d.ts +3 -3
  29. package/dist/project-notes.js +2 -0
  30. package/dist/project-work.d.ts +3 -1
  31. package/dist/project-work.js +15 -2
  32. package/dist/protocol.d.ts +7 -0
  33. package/dist/protocol.js +11 -7
  34. package/dist/screen-check-skill.d.ts +2 -0
  35. package/dist/screen-check-skill.js +39 -0
  36. package/dist/server.d.ts +6 -1
  37. package/dist/server.js +105 -15
  38. package/dist/web/.vite/manifest.json +65 -65
  39. package/dist/web/assets/{canvas-BXhC8RDZ.js → canvas-D8rDdfDz.js} +1 -1
  40. package/dist/web/assets/choices-b0XhrGQV.js +1 -0
  41. package/dist/web/assets/{console-e1P5qYQ5.js → console-BSjLGe0T.js} +1 -1
  42. package/dist/web/assets/{dist-Dd3iAGFy.js → dist-Buk0lwzI.js} +2 -2
  43. package/dist/web/assets/dist-Cw8hRIlT.js +1 -0
  44. package/dist/web/assets/dist-Tzoe_zm-.js +3 -0
  45. package/dist/web/assets/{dist-DEorbOW0.js → dist-foH9IKc6.js} +1 -1
  46. package/dist/web/assets/explore-in-BVUy3ZW_.js +1 -0
  47. package/dist/web/assets/graph-1OdIJ9l7.js +2 -0
  48. package/dist/web/assets/index-CsC3sTRq.css +1 -0
  49. package/dist/web/assets/{index-BYuKpyoi.js → index-CxmItXqa.js} +220 -121
  50. package/dist/web/assets/{notes-meaning-B3HFbh84.js → notes-meaning-pVbbQUGP.js} +1 -1
  51. package/dist/web/assets/overview-B9UtVJ32.js +6 -0
  52. package/dist/web/assets/preview-CksD_5KS.js +1 -0
  53. package/dist/web/assets/{review-BVh9jWMB.js → review-CMxQlQ-C.js} +1 -1
  54. package/dist/web/assets/{skills-DPaEYkln.js → skills-BFNSyrnD.js} +1 -1
  55. package/dist/web/assets/{skills-work-dvjfy_tu.js → skills-work-BGPSnF_I.js} +1 -1
  56. package/dist/web/assets/{studio-process-BYm8mjRJ.js → studio-process-CsRoTHOh.js} +2 -2
  57. package/dist/web/assets/{timeline-events-CDZ7wiJX.js → timeline-events-BbuuFWHV.js} +1 -1
  58. package/dist/web/assets/{work-turns-BeCt303c.js → work-turns-BvJlIMmA.js} +1 -1
  59. package/dist/web/assets/workspace-CWlkjLNx.js +5 -0
  60. package/dist/web/composition.json +80 -80
  61. package/dist/web/index.html +3 -3
  62. package/dist/web/renderer.json +1 -1
  63. package/dist/web-assets.d.ts +2 -1
  64. package/dist/web-assets.js +3 -2
  65. package/dist/work-contract.js +2 -2
  66. package/docs/FRONTEND.md +30 -14
  67. package/docs/HEADLESS.md +60 -14
  68. package/docs/PLUGIN-AUTHORING.md +4 -0
  69. package/docs/THIRD-PARTY-PLUGINS.md +190 -0
  70. package/example/pa14-qs/.rho/rho/conversations/c-67f77cfebaba2cea.json +1 -1
  71. package/example/pa14-qs/.rho/rho/conversations/c-91aa2e46b1ac1a6c.json +1 -1
  72. package/example/pa14-qs/.rho/rho/conversations/c-fa24dfd80dfe4bcb.json +1 -1
  73. package/node_modules/@hono/node-server/dist/index.js +11 -0
  74. package/node_modules/@hono/node-server/dist/index.mjs +11 -0
  75. package/node_modules/@hono/node-server/dist/listener.js +11 -0
  76. package/node_modules/@hono/node-server/dist/listener.mjs +11 -0
  77. package/node_modules/@hono/node-server/dist/request.js +11 -0
  78. package/node_modules/@hono/node-server/dist/request.mjs +11 -0
  79. package/node_modules/@hono/node-server/dist/server.js +11 -0
  80. package/node_modules/@hono/node-server/dist/server.mjs +11 -0
  81. package/node_modules/@hono/node-server/dist/vercel.js +11 -0
  82. package/node_modules/@hono/node-server/dist/vercel.mjs +11 -0
  83. package/node_modules/@hono/node-server/package.json +1 -1
  84. package/node_modules/@rho-workspace/plugin-agent/README.md +42 -1
  85. package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.js +14 -3
  86. package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.d.ts +1 -0
  87. package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.js +2 -2
  88. package/node_modules/@rho-workspace/plugin-agent/dist/conversation.d.ts +1 -0
  89. package/node_modules/@rho-workspace/plugin-agent/dist/conversation.js +1 -0
  90. package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.d.ts +6 -0
  91. package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.js +174 -0
  92. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.d.ts +82 -0
  93. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.js +15 -0
  94. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.d.ts +73 -0
  95. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.js +190 -0
  96. package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.d.ts +11 -0
  97. package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.js +7 -0
  98. package/node_modules/@rho-workspace/plugin-agent/dist/index.d.ts +373 -0
  99. package/node_modules/@rho-workspace/plugin-agent/dist/index.js +1 -0
  100. package/node_modules/@rho-workspace/plugin-agent/dist/mcp.js +5 -1
  101. package/node_modules/@rho-workspace/plugin-agent/dist/operations.d.ts +33 -0
  102. package/node_modules/@rho-workspace/plugin-agent/dist/operations.js +3 -0
  103. package/node_modules/@rho-workspace/plugin-agent/dist/presentation.d.ts +14 -0
  104. package/node_modules/@rho-workspace/plugin-agent/dist/presentation.js +2 -0
  105. package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.d.ts +15 -0
  106. package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.js +37 -0
  107. package/node_modules/@rho-workspace/plugin-agent/package.json +5 -1
  108. package/node_modules/@rho-workspace/plugin-annotations/package.json +1 -1
  109. package/node_modules/@rho-workspace/plugin-documents/README.md +4 -0
  110. package/node_modules/@rho-workspace/plugin-documents/dist/index.d.ts +3 -0
  111. package/node_modules/@rho-workspace/plugin-documents/dist/index.js +1 -1
  112. package/node_modules/@rho-workspace/plugin-documents/package.json +1 -1
  113. package/node_modules/@rho-workspace/plugin-kernel/README.md +71 -10
  114. package/node_modules/@rho-workspace/plugin-kernel/dist/code.d.ts +2 -0
  115. package/node_modules/@rho-workspace/plugin-kernel/dist/code.js +4 -1
  116. package/node_modules/@rho-workspace/plugin-kernel/dist/contract.js +5 -0
  117. package/node_modules/@rho-workspace/plugin-kernel/dist/index.d.ts +7 -0
  118. package/node_modules/@rho-workspace/plugin-kernel/dist/index.js +55 -8
  119. package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.d.ts +9 -6
  120. package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.js +18 -41
  121. package/node_modules/@rho-workspace/plugin-kernel/dist/operations.js +5 -2
  122. package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.d.ts +39 -0
  123. package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.js +661 -0
  124. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.d.ts +3 -0
  125. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.js +10 -0
  126. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.d.ts +38 -4
  127. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.js +194 -97
  128. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook-work.js +1 -2
  129. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.d.ts +10 -2
  130. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.js +79 -18
  131. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-styles.js +115 -45
  132. package/node_modules/@rho-workspace/plugin-kernel/dist/ui.d.ts +1 -1
  133. package/node_modules/@rho-workspace/plugin-kernel/dist/ui.js +1 -1
  134. package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.d.ts +63 -0
  135. package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.js +344 -0
  136. package/node_modules/@rho-workspace/plugin-kernel/package.json +1 -1
  137. package/node_modules/@rho-workspace/plugin-kernel/runners/runner.R +6 -3
  138. package/node_modules/@rho-workspace/plugin-kernel/runners/runner.py +6 -3
  139. package/node_modules/express-rate-limit/dist/index.cjs +1 -1
  140. package/node_modules/express-rate-limit/dist/index.mjs +1 -1
  141. package/node_modules/express-rate-limit/package.json +1 -1
  142. package/node_modules/ip-address/dist/ipv6.js +1 -1
  143. package/node_modules/ip-address/package.json +1 -1
  144. package/node_modules/playwright-core/LICENSE +202 -0
  145. package/node_modules/playwright-core/NOTICE +5 -0
  146. package/node_modules/playwright-core/ThirdPartyNotices.txt +13 -0
  147. package/node_modules/playwright-core/bin/install_media_pack.ps1 +5 -0
  148. package/node_modules/playwright-core/bin/install_webkit_wsl.ps1 +33 -0
  149. package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +42 -0
  150. package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +13 -0
  151. package/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +24 -0
  152. package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +42 -0
  153. package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +12 -0
  154. package/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +24 -0
  155. package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +48 -0
  156. package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +11 -0
  157. package/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +23 -0
  158. package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +48 -0
  159. package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +11 -0
  160. package/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +23 -0
  161. package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +48 -0
  162. package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +11 -0
  163. package/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +24 -0
  164. package/node_modules/playwright-core/browsers.json +52 -0
  165. package/node_modules/playwright-core/cli.js +22 -0
  166. package/node_modules/playwright-core/index.js +17 -0
  167. package/node_modules/playwright-core/index.mjs +28 -0
  168. package/node_modules/playwright-core/lib/bootstrap.js +149 -0
  169. package/node_modules/playwright-core/lib/coreBundle.js +78041 -0
  170. package/node_modules/playwright-core/lib/entry/cliDaemon.js +5 -0
  171. package/node_modules/playwright-core/lib/entry/dashboardApp.js +3 -0
  172. package/node_modules/playwright-core/lib/entry/mcp.js +10 -0
  173. package/node_modules/playwright-core/lib/entry/oopBrowserDownload.js +3 -0
  174. package/node_modules/playwright-core/lib/package.js +50 -0
  175. package/node_modules/playwright-core/lib/server/chromium/appIcon.png +0 -0
  176. package/node_modules/playwright-core/lib/server/electron/loader.js +123 -0
  177. package/node_modules/playwright-core/lib/serverRegistry.js +1939 -0
  178. package/node_modules/playwright-core/lib/serverRegistry.js.LICENSE +65 -0
  179. package/node_modules/playwright-core/lib/tools/cli-client/channelSessions.js +141 -0
  180. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +7 -0
  181. package/node_modules/playwright-core/lib/tools/cli-client/help.json +808 -0
  182. package/node_modules/playwright-core/lib/tools/cli-client/minimist.js +128 -0
  183. package/node_modules/playwright-core/lib/tools/cli-client/output.js +352 -0
  184. package/node_modules/playwright-core/lib/tools/cli-client/program.js +422 -0
  185. package/node_modules/playwright-core/lib/tools/cli-client/registry.js +180 -0
  186. package/node_modules/playwright-core/lib/tools/cli-client/session.js +261 -0
  187. package/node_modules/playwright-core/lib/tools/dashboard/appIcon.png +0 -0
  188. package/node_modules/playwright-core/lib/tools/utils/extension.js +112 -0
  189. package/node_modules/playwright-core/lib/tools/utils/socketConnection.js +108 -0
  190. package/node_modules/playwright-core/lib/utilsBundle.js +86078 -0
  191. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +1890 -0
  192. package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
  193. package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
  194. package/node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
  195. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
  196. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
  197. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
  198. package/node_modules/playwright-core/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
  199. package/node_modules/playwright-core/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
  200. package/node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
  201. package/node_modules/playwright-core/lib/vite/dashboard/index.html +29 -0
  202. package/node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg +24 -0
  203. package/node_modules/playwright-core/lib/vite/htmlReport/index.html +16 -0
  204. package/node_modules/playwright-core/lib/vite/htmlReport/report.css +2 -0
  205. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +32 -0
  206. package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
  207. package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DK72OMRi.js +32 -0
  208. package/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  209. package/node_modules/playwright-core/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
  210. package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  211. package/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
  212. package/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +9 -0
  213. package/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-BEB2e8M3.js +32 -0
  214. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  215. package/node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
  216. package/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-B794rD2Z.js +7 -0
  217. package/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
  218. package/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  219. package/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.C8BeHuxd.css +1 -0
  220. package/node_modules/playwright-core/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
  221. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +44 -0
  222. package/node_modules/playwright-core/lib/vite/traceViewer/index.oNry3Hjv.js +1 -0
  223. package/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +16 -0
  224. package/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +9 -0
  225. package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
  226. package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +10 -0
  227. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +4 -0
  228. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CYwC_gH1.js +5 -0
  229. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
  230. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +18 -0
  231. package/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
  232. package/node_modules/playwright-core/lib/webp_codec.LICENSE +173 -0
  233. package/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
  234. package/node_modules/playwright-core/lib/xdg-open +1267 -0
  235. package/node_modules/playwright-core/package.json +34 -0
  236. package/package.json +13 -7
  237. package/protocol/index.json +75 -21
  238. package/protocol/operations/agent.sessions.list.json +100 -0
  239. package/protocol/operations/agent.sessions.read.json +266 -0
  240. package/protocol/operations/conversation.settings.check.json +147 -4
  241. package/protocol/operations/conversation.settings.read.json +145 -3
  242. package/protocol/operations/conversation.settings.update.json +166 -4
  243. package/protocol/operations/conversation.start.json +2 -1
  244. package/protocol/operations/extension.call.json +132 -0
  245. package/protocol/operations/extension.content.json +78 -0
  246. package/protocol/operations/extension.describe.json +195 -0
  247. package/protocol/operations/extension.install.json +198 -0
  248. package/protocol/operations/extension.list.json +123 -0
  249. package/protocol/operations/extension.manage.json +55 -0
  250. package/protocol/operations/extension.read.json +112 -0
  251. package/protocol/operations/kernel.interrupt.json +20 -0
  252. package/protocol/operations/kernel.read.json +30 -0
  253. package/protocol/operations/kernel.run.json +36 -1
  254. package/protocol/operations/kernel.stop.json +10 -0
  255. package/protocol/operations/project.work.read.json +3 -2
  256. package/protocol/operations/session.grant.json +9 -0
  257. package/scripts/browser-checks.mjs +53 -0
  258. package/scripts/screen-check.mjs +193 -0
  259. package/scripts/third-party-acceptance.mjs +77 -0
  260. package/vendor/composition.json +111 -111
  261. package/vendor/rho-workspace-plugin-agent-0.4.29.tgz +0 -0
  262. package/vendor/rho-workspace-plugin-annotations-0.5.2.tgz +0 -0
  263. package/vendor/rho-workspace-plugin-documents-0.4.11.tgz +0 -0
  264. package/vendor/rho-workspace-plugin-kernel-0.5.5.tgz +0 -0
  265. package/web/theme.css +17 -2
  266. package/dist/web/assets/choices-B-y2OYvE.js +0 -1
  267. package/dist/web/assets/dist-CBM2oq6g.js +0 -1
  268. package/dist/web/assets/dist-CH56yNDn.js +0 -3
  269. package/dist/web/assets/explore-in-muWXOGOY.js +0 -1
  270. package/dist/web/assets/graph-CK-df5lh.js +0 -2
  271. package/dist/web/assets/index-DBd77u4a.css +0 -1
  272. package/dist/web/assets/overview-D1Ev2OC_.js +0 -6
  273. package/dist/web/assets/preview-HbmQKUGY.js +0 -1
  274. package/dist/web/assets/workspace-d5Hw_ClZ.js +0 -5
  275. package/vendor/rho-workspace-plugin-agent-0.4.27.tgz +0 -0
  276. package/vendor/rho-workspace-plugin-documents-0.4.10.tgz +0 -0
  277. package/vendor/rho-workspace-plugin-kernel-0.5.2.tgz +0 -0
package/README.md CHANGED
@@ -39,8 +39,9 @@ contract. Electron is reserved for a later desktop client that reuses the WebUI
39
39
  and component boundaries. Functional views use CodeMirror 6, AG Grid Community
40
40
  and ECharts.
41
41
 
42
- Install the packed tarball, start `rho`, and connect an external Agent with
43
- `rho --grant` ([Install and start](docs/HEADLESS.md#install-and-start)). Projects,
42
+ Install it with `npm install -g @rho-workspace/rho` on Node 22.22 or later, below 27, start
43
+ `rho`, and connect an external Agent with `rho --grant`
44
+ ([Install and start](docs/HEADLESS.md#install-and-start)). Projects,
44
45
  files, execution records and workspaces are available through the local WebUI.
45
46
  The Agent uses the same scoped capabilities; a browser request copied to an external
46
47
  Agent is explicitly a handoff.
@@ -50,8 +51,25 @@ plans and visual rules. See [Frontend](docs/FRONTEND.md) for the current interfa
50
51
  [Status](docs/STATUS.md) for executed checks and limits, and the
51
52
  [documentation index](docs/README.md) for backend and release information.
52
53
 
54
+ ## Set up with an Agent
55
+
56
+ A person can ask Claude Code or Codex, in any language:
57
+
58
+ > Read https://yulab-smu.top/Rho/doc/setup.md and follow its steps to install and configure Rho for me.
59
+
60
+ or: 请阅读 https://yulab-smu.top/Rho/doc/setup.md 文档,按照步骤为我安装并配置 Rho。
61
+
62
+ That page is [SETUP.md](SETUP.md). The Agent checks the machine, installs the npm package and
63
+ starts Rho on `~/Rho/projects` and `~/Rho/state`. It then installs the Agent Skill in
64
+ [skills/rho](skills/rho/SKILL.md) into its own skills folder, connects itself to the example
65
+ project and says what is missing. The Skill teaches an Agent to install and connect Rho, call
66
+ its tools without guessing, and run an analysis a person can follow. It is published beside the
67
+ page at <https://yulab-smu.top/Rho/skills/rho/SKILL.md>.
68
+
53
69
  ## Documentation
54
70
 
71
+ <https://yulab-smu.top/Rho/> runs the real interface on the shipped example project,
72
+ replaying a recorded session without a backend, and gives the sentence above for an Agent.
55
73
  The documentation is published at <https://yulab-smu.top/Rho/docs/>. The site is
56
74
  generated from this repository's `docs/` directory, which stays the only source of
57
75
  truth: every page names the file it came from and links to it.
@@ -60,12 +78,13 @@ truth: every page names the file it came from and links to it.
60
78
  npm run docs:dev # assemble and serve locally
61
79
  npm run docs:build # assemble, then build the static site into site/.vitepress/dist
62
80
  npm run docs:check # fail if a document in docs/ is neither published nor withheld
81
+ npm run pages:build # front page, demo and documentation into site/.pages (add -- --home for the front page alone)
82
+ npm run pages:check # walk the demo and the front page in a browser
83
+ npm run pages:capture # record the demo again from this checkout's service (after npm run build)
63
84
  ```
64
85
 
65
86
  `@rho-workspace/rho` is published to npm. The registry entry for 0.5.2 carries no
66
- README, so its package page shows no description; from 0.5.3 the packer ships this README. Desktop installers on the
67
- [downloads page](https://yulab-smu.top/Rho/) are the earlier 0.4.0 line; this npm line
68
- is the current delivery.
87
+ README, so its package page shows no description; from 0.5.3 the packer ships this README.
69
88
 
70
89
  For a new component view, start with [Plugin authoring](docs/PLUGIN-AUTHORING.md):
71
90
  generate a typed package, preview it independently and select its compiled entry
@@ -1,3 +1,4 @@
1
+ import { extensionMethods } from './extension-contract.js';
1
2
  import * as fs from 'node:fs/promises';
2
3
  import path from 'node:path';
3
4
  import { randomBytes } from 'node:crypto';
@@ -36,7 +37,7 @@ export const browserMethods = ['protocol.describe', 'protocol.validate', 'projec
36
37
  // Only the person at this machine talks to a conversation Rho starts: it runs their own Claude
37
38
  // Code with their model credentials. Only they add Rho to their own Agent's configuration. A
38
39
  // narrower, expiring link never receives these.
39
- export const conversationMethods = ['session.connect', 'conversation.start', 'conversation.send', 'conversation.stop', 'conversation.decide', 'conversation.read', 'conversation.list', 'conversation.trash', 'conversation.restore', 'conversation.delete', 'conversation.permission', 'conversation.configure', 'conversation.settings.read', 'conversation.settings.update', 'conversation.settings.check', 'project.work.read', 'evidence.preview', 'evidence.export'];
40
+ export const conversationMethods = ['agent.sessions.list', 'agent.sessions.read', 'session.connect', 'conversation.start', 'conversation.send', 'conversation.stop', 'conversation.decide', 'conversation.read', 'conversation.list', 'conversation.trash', 'conversation.restore', 'conversation.delete', 'conversation.permission', 'conversation.configure', 'conversation.settings.read', 'conversation.settings.update', 'conversation.settings.check', 'project.work.read', 'evidence.preview', 'evidence.export'];
40
41
  // The person at this machine. A tab this service served is authorized by the request itself:
41
42
  // same origin, loopback only, no link, no code and no expiry. `--pair` stays an explicit,
42
43
  // narrower grant for a shared or subfolder-scoped tab.
@@ -49,7 +50,7 @@ export const skillsMethods = ['skills.list', 'skills.read', 'skills.change', 'sk
49
50
  export function localBrowserPrincipal(root) {
50
51
  // The empty token hash can never match a request digest, so no header impersonates this
51
52
  // identity: it is chosen because the request carried no credential at all.
52
- return { id: localBrowserId, kind: 'browser', tokenHash: '', projectRoot: root, methods: [...browserMethods, ...conversationMethods, ...consoleMethods, ...kernelMethods, ...skillsMethods] };
53
+ return { id: localBrowserId, kind: 'browser', tokenHash: '', projectRoot: root, methods: [...extensionMethods, ...browserMethods, ...conversationMethods, ...consoleMethods, ...kernelMethods, ...skillsMethods] };
53
54
  }
54
55
  export class BrowserAccess {
55
56
  state;
@@ -64,6 +64,33 @@ export declare const personFilesSkill: {
64
64
  description: string;
65
65
  };
66
66
  };
67
+ export declare const analysisRunSkillDeclaration: {
68
+ id: string;
69
+ version: string;
70
+ content: string;
71
+ digest: string;
72
+ intent: string;
73
+ requires: string[];
74
+ example: {
75
+ method: string;
76
+ input: {
77
+ language: string;
78
+ code: string;
79
+ purpose: string;
80
+ changeId: string;
81
+ waitMs: number;
82
+ };
83
+ };
84
+ failureRecipes: {
85
+ kind: string;
86
+ message: string;
87
+ next: string;
88
+ }[];
89
+ verify: {
90
+ command: string;
91
+ description: string;
92
+ };
93
+ };
67
94
  export declare const taskMapSkill: {
68
95
  id: string;
69
96
  version: string;
@@ -130,7 +157,7 @@ export declare class Capabilities {
130
157
  enabled: string[];
131
158
  }, author: string): Promise<{
132
159
  version: number;
133
- enabled: ("media" | "r" | "agent" | "files" | "documents" | "requirements" | "tables" | "charts" | "annotations" | "console" | "kernel" | "skills")[];
160
+ enabled: ("media" | "r" | "agent" | "files" | "skills" | "documents" | "requirements" | "tables" | "charts" | "annotations" | "console" | "kernel")[];
134
161
  receipt: CapabilityReceipt;
135
162
  }>;
136
163
  private pluginStatus;
@@ -165,7 +192,7 @@ export declare class Capabilities {
165
192
  }[];
166
193
  configuration: {
167
194
  version: number;
168
- enabled: ("media" | "r" | "agent" | "files" | "documents" | "requirements" | "tables" | "charts" | "annotations" | "console" | "kernel" | "skills")[];
195
+ enabled: ("media" | "r" | "agent" | "files" | "skills" | "documents" | "requirements" | "tables" | "charts" | "annotations" | "console" | "kernel")[];
169
196
  retainedReceipts: number;
170
197
  retainedFromVersion: number;
171
198
  maxReceipts: number;
@@ -1,6 +1,7 @@
1
1
  import * as path from 'node:path';
2
2
  import { atomicJson, canonical, digest, now, readJson, requireThat, stateDirectory } from '@rho-workspace/plugin-contracts';
3
3
  import { operations } from './protocol.js';
4
+ import { screenCheckSkill } from './screen-check-skill.js';
4
5
  export const capabilityLimits = { maxReceipts: 256 };
5
6
  // The umbrella Skill: what this application is, the order to work in, and the rules
6
7
  // that used to be discovered by failing. It names where the detail lives instead of
@@ -9,6 +10,11 @@ const applicationContent = [
9
10
  'Start with rho_index: select an owner or search, then rho_resolve only the operations',
10
11
  'needed now. Use rho_call with the complete contractRef. The private connection supplies',
11
12
  'the project; discovery never grants additional authority or starts a runtime.',
13
+ 'Independent third-party plugins: extension.list shows installed packages, extension.describe',
14
+ 'gives their digest, operations and Skill entries. Read extension.content (kind skill)',
15
+ 'before extension.call. Keep expectedDigest and the original changeId for a native call;',
16
+ 'extension.read observes pending or unknown outcomes without rerunning. Installation and',
17
+ 'management belong to the local person; plugin code never expands this connection grant.',
12
18
  'Large replies carry a result reference. Use rho_read to inspect its fields and fetch',
13
19
  'only selected text ranges or array pages. Retain useful references; release finished',
14
20
  'results explicitly. Never repeat an action just to retrieve a large reply.',
@@ -29,7 +35,7 @@ const applicationContent = [
29
35
  'run or export it as files; a stopped run is not resubmitted under its own operationId.'
30
36
  ].join('\n');
31
37
  const applicationSkill = {
32
- id: 'rho.workspace', version: '1.5', content: applicationContent,
38
+ id: 'rho.workspace', version: '1.6', content: applicationContent,
33
39
  intent: 'Work in this project through versioned operations, in a safe order.',
34
40
  requires: ['capability.list', 'observation.snapshot', 'action.submit', 'composition.apply', 'context.read'],
35
41
  example: { method: 'observation.snapshot', input: { projectId: 'the-open-project' } },
@@ -85,6 +91,77 @@ const personFiles = {
85
91
  };
86
92
  export const rhoWorkspaceSkill = { ...applicationSkill, digest: skillDigest };
87
93
  export const personFilesSkill = personFiles;
94
+ // Written after five real analyses (bulk RNA-seq, snRNA-seq, GeoMx DSP, bulk plus a
95
+ // metabolome, and a multi-omics cohort) ran through this application. None of them
96
+ // finished unattended at the time: turns ended on a call limit or on a wait nothing
97
+ // wakes, calls went into looking for what may be done rather than doing it, and results
98
+ // were not always written before the turn ended. Several of those stops have since been
99
+ // fixed in this application, so what follows is written as the practice that survived
100
+ // them rather than as a workaround for one build's limits.
101
+ const analysisRunContent = [
102
+ 'A whole analysis has to survive interruption. Rho keeps no step cap and no wall time',
103
+ 'by default, and a long analysis may still be stopped by the person or by the Agent',
104
+ 'client, so write results as you go instead of holding them until the end.',
105
+ '',
106
+ '1. Spend calls on the analysis, not on discovery. Resolve the operations you will use',
107
+ ' once each (kernel.run, kernel.read, kernel.interrupt, resource.list) and reuse the',
108
+ ' contractRef you were given. In the runs behind this Skill one Agent spent 36',
109
+ ' capability.index calls in a single analysis and ended with only its quality-control',
110
+ ' table written.',
111
+ '2. Do not guess what a result reference contains. A refused read means the shape is',
112
+ ' wrong, not that the result is missing: resolve the operation that produced it and',
113
+ ' read the page or range it names instead of trying sibling paths.',
114
+ '3. Nothing wakes you later. No monitor, timer or event resumes your turn: a cell still',
115
+ ' running when you stop is left running for nobody, and ending your reply is not',
116
+ ' proof the analysis finished. Pass a waitMs long enough for the slowest step (a',
117
+ ' normalisation over 90,000 nuclei can take many minutes), or read the cell with',
118
+ ' kernel.read in your own next call.',
119
+ '4. Load once, build on it. A session keeps what a cell defines, so read the data in one',
120
+ ' cell and derive in the next. A service restart does not keep those objects: the code',
121
+ ' and its outputs stay, the values in memory do not, so keep a script that rebuilds',
122
+ ' what matters.',
123
+ '5. Prefer a few large cells to many small ones, and keep each short enough to finish. A',
124
+ ' cell that hangs costs time: interrupt it with kernel.interrupt and continue with the',
125
+ ' part that is cheap to redo.',
126
+ '6. Draw to an explicit device. In these runs a ggsave call in the shared session hung',
127
+ ' and the figure had to be redrawn with png() and dev.off(): open the device, plot,',
128
+ ' close it, and let the figure land in a file you name.',
129
+ '7. Write each file once, complete, and save it to disk before you rely on it. One script',
130
+ ' written in full and then run costs less than the same script edited piece by piece,',
131
+ ' and a file on disk is the only version that outlives a stop.',
132
+ '8. Check packages in one call, and do not install into a temporary library. Name what is',
133
+ ' missing, and when you substitute a gene-set source or an annotation build, say so',
134
+ ' beside the result, because that choice changes the numbers.',
135
+ '9. Say what did not reproduce, and why. When a published count cannot be matched, name',
136
+ ' the undefined choice (a threshold, a direction, a model) and compute the cheap',
137
+ ' alternatives beside your main one instead of tuning until it fits.',
138
+ '10. Report the state you actually reached. Say which outputs exist on disk, which cell',
139
+ ' was still running, and what a stopped turn left behind; the person continues from',
140
+ ' that record rather than from a claim that the work is done.',
141
+ ].join('\n');
142
+ const analysisRunSkill = {
143
+ id: 'rho.analysis-run', version: '1.1', content: analysisRunContent,
144
+ digest: digest(analysisRunContent),
145
+ intent: 'Run a whole analysis through the live sessions so a stop never loses the work.',
146
+ requires: ['kernel.run', 'kernel.read', 'kernel.interrupt', 'resource.list'],
147
+ example: {
148
+ method: 'kernel.run',
149
+ input: {
150
+ language: 'r',
151
+ code: 'counts <- read.csv("data/counts.csv", row.names = 1); dim(counts)',
152
+ purpose: 'Load the count matrix once and keep it for later cells',
153
+ changeId: 'load-counts',
154
+ waitMs: 120000
155
+ }
156
+ },
157
+ failureRecipes: [
158
+ { kind: 'not_found', message: 'Skill is not available in this project and session.', next: 'Read skill.list for the Skills this project and session expose; a Skill owned by a disabled plugin is not listed.' },
159
+ { kind: 'stale', message: 'Skill content digest changed.', next: 'Read the Skill again and apply the current text; do not act on a cached copy.' },
160
+ { kind: 'limit', message: 'Too many cells are waiting.', next: 'Wait for the running cell or interrupt it, then continue in a new cell with a new changeId.' }
161
+ ],
162
+ verify: { command: 'npm run test:notebook', description: 'Runs R and Python cells, keeps their output, plots and variables, interrupts and stops sessions, and keeps identity across a restart.' }
163
+ };
164
+ export const analysisRunSkillDeclaration = analysisRunSkill;
88
165
  const taskMapContent = [
89
166
  'Describe the whole task yourself: Rho fixes no closed list of kinds or states.',
90
167
  '',
@@ -240,7 +317,7 @@ export class Capabilities {
240
317
  }
241
318
  async skills(principal) {
242
319
  const state = await this.state();
243
- const result = [rhoWorkspaceSkill, personFilesSkill, taskMapSkill];
320
+ const result = [rhoWorkspaceSkill, personFilesSkill, taskMapSkill, analysisRunSkill, screenCheckSkill];
244
321
  for (const descriptor of this.plugins.descriptors()) {
245
322
  const status = this.pluginStatus(descriptor.id, state);
246
323
  for (const skill of descriptor.skills ?? []) {