@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.
- package/README.md +24 -5
- package/dist/browser-access.js +3 -2
- package/dist/capabilities.d.ts +29 -2
- package/dist/capabilities.js +79 -2
- package/dist/cli.js +237 -99
- package/dist/contract.generated.d.ts +441 -16
- package/dist/contract.generated.js +1 -1
- package/dist/contracts/owners.generated.js +459 -10
- package/dist/conversation-presentation.d.ts +3 -1
- package/dist/conversation-presentation.js +16 -6
- package/dist/conversations.d.ts +10 -6
- package/dist/conversations.js +17 -13
- package/dist/discovery.d.ts +1 -0
- package/dist/discovery.js +3 -3
- package/dist/extension-contract.d.ts +99 -0
- package/dist/extension-contract.js +52 -0
- package/dist/extension-directory.d.ts +9 -0
- package/dist/extension-directory.js +11 -0
- package/dist/extension-worker.d.ts +1 -0
- package/dist/extension-worker.js +36 -0
- package/dist/extensions.d.ts +157 -0
- package/dist/extensions.js +349 -0
- package/dist/installs.d.ts +11 -0
- package/dist/installs.js +179 -0
- package/dist/plugin-cli.d.ts +1 -0
- package/dist/plugin-cli.js +139 -0
- package/dist/plugin-inventory.json +18 -0
- package/dist/plugins.d.ts +3 -3
- package/dist/project-notes.js +2 -0
- package/dist/project-work.d.ts +3 -1
- package/dist/project-work.js +15 -2
- package/dist/protocol.d.ts +7 -0
- package/dist/protocol.js +11 -7
- package/dist/screen-check-skill.d.ts +2 -0
- package/dist/screen-check-skill.js +39 -0
- package/dist/server.d.ts +6 -1
- package/dist/server.js +105 -15
- package/dist/web/.vite/manifest.json +65 -65
- package/dist/web/assets/{canvas-BXhC8RDZ.js → canvas-D8rDdfDz.js} +1 -1
- package/dist/web/assets/choices-b0XhrGQV.js +1 -0
- package/dist/web/assets/{console-e1P5qYQ5.js → console-BSjLGe0T.js} +1 -1
- package/dist/web/assets/{dist-Dd3iAGFy.js → dist-Buk0lwzI.js} +2 -2
- package/dist/web/assets/dist-Cw8hRIlT.js +1 -0
- package/dist/web/assets/dist-Tzoe_zm-.js +3 -0
- package/dist/web/assets/{dist-DEorbOW0.js → dist-foH9IKc6.js} +1 -1
- package/dist/web/assets/explore-in-BVUy3ZW_.js +1 -0
- package/dist/web/assets/graph-1OdIJ9l7.js +2 -0
- package/dist/web/assets/index-CsC3sTRq.css +1 -0
- package/dist/web/assets/{index-BYuKpyoi.js → index-CxmItXqa.js} +220 -121
- package/dist/web/assets/{notes-meaning-B3HFbh84.js → notes-meaning-pVbbQUGP.js} +1 -1
- package/dist/web/assets/overview-B9UtVJ32.js +6 -0
- package/dist/web/assets/preview-CksD_5KS.js +1 -0
- package/dist/web/assets/{review-BVh9jWMB.js → review-CMxQlQ-C.js} +1 -1
- package/dist/web/assets/{skills-DPaEYkln.js → skills-BFNSyrnD.js} +1 -1
- package/dist/web/assets/{skills-work-dvjfy_tu.js → skills-work-BGPSnF_I.js} +1 -1
- package/dist/web/assets/{studio-process-BYm8mjRJ.js → studio-process-CsRoTHOh.js} +2 -2
- package/dist/web/assets/{timeline-events-CDZ7wiJX.js → timeline-events-BbuuFWHV.js} +1 -1
- package/dist/web/assets/{work-turns-BeCt303c.js → work-turns-BvJlIMmA.js} +1 -1
- package/dist/web/assets/workspace-CWlkjLNx.js +5 -0
- package/dist/web/composition.json +80 -80
- package/dist/web/index.html +3 -3
- package/dist/web/renderer.json +1 -1
- package/dist/web-assets.d.ts +2 -1
- package/dist/web-assets.js +3 -2
- package/dist/work-contract.js +2 -2
- package/docs/FRONTEND.md +30 -14
- package/docs/HEADLESS.md +60 -14
- package/docs/PLUGIN-AUTHORING.md +4 -0
- package/docs/THIRD-PARTY-PLUGINS.md +190 -0
- package/example/pa14-qs/.rho/rho/conversations/c-67f77cfebaba2cea.json +1 -1
- package/example/pa14-qs/.rho/rho/conversations/c-91aa2e46b1ac1a6c.json +1 -1
- package/example/pa14-qs/.rho/rho/conversations/c-fa24dfd80dfe4bcb.json +1 -1
- package/node_modules/@hono/node-server/dist/index.js +11 -0
- package/node_modules/@hono/node-server/dist/index.mjs +11 -0
- package/node_modules/@hono/node-server/dist/listener.js +11 -0
- package/node_modules/@hono/node-server/dist/listener.mjs +11 -0
- package/node_modules/@hono/node-server/dist/request.js +11 -0
- package/node_modules/@hono/node-server/dist/request.mjs +11 -0
- package/node_modules/@hono/node-server/dist/server.js +11 -0
- package/node_modules/@hono/node-server/dist/server.mjs +11 -0
- package/node_modules/@hono/node-server/dist/vercel.js +11 -0
- package/node_modules/@hono/node-server/dist/vercel.mjs +11 -0
- package/node_modules/@hono/node-server/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-agent/README.md +42 -1
- package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.js +14 -3
- package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.d.ts +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.js +2 -2
- package/node_modules/@rho-workspace/plugin-agent/dist/conversation.d.ts +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/conversation.js +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.d.ts +6 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.js +174 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.d.ts +82 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.js +15 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/external-session.d.ts +73 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/external-session.js +190 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.d.ts +11 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.js +7 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/index.d.ts +373 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/index.js +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/mcp.js +5 -1
- package/node_modules/@rho-workspace/plugin-agent/dist/operations.d.ts +33 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/operations.js +3 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/presentation.d.ts +14 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/presentation.js +2 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.d.ts +15 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.js +37 -0
- package/node_modules/@rho-workspace/plugin-agent/package.json +5 -1
- package/node_modules/@rho-workspace/plugin-annotations/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-documents/README.md +4 -0
- package/node_modules/@rho-workspace/plugin-documents/dist/index.d.ts +3 -0
- package/node_modules/@rho-workspace/plugin-documents/dist/index.js +1 -1
- package/node_modules/@rho-workspace/plugin-documents/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/README.md +71 -10
- package/node_modules/@rho-workspace/plugin-kernel/dist/code.d.ts +2 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/code.js +4 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/contract.js +5 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/index.d.ts +7 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/index.js +55 -8
- package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.d.ts +9 -6
- package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.js +18 -41
- package/node_modules/@rho-workspace/plugin-kernel/dist/operations.js +5 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.d.ts +39 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.js +661 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.d.ts +3 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.js +10 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.d.ts +38 -4
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.js +194 -97
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook-work.js +1 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.d.ts +10 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.js +79 -18
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-styles.js +115 -45
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui.d.ts +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui.js +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.d.ts +63 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.js +344 -0
- package/node_modules/@rho-workspace/plugin-kernel/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/runners/runner.R +6 -3
- package/node_modules/@rho-workspace/plugin-kernel/runners/runner.py +6 -3
- package/node_modules/express-rate-limit/dist/index.cjs +1 -1
- package/node_modules/express-rate-limit/dist/index.mjs +1 -1
- package/node_modules/express-rate-limit/package.json +1 -1
- package/node_modules/ip-address/dist/ipv6.js +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/node_modules/playwright-core/LICENSE +202 -0
- package/node_modules/playwright-core/NOTICE +5 -0
- package/node_modules/playwright-core/ThirdPartyNotices.txt +13 -0
- package/node_modules/playwright-core/bin/install_media_pack.ps1 +5 -0
- package/node_modules/playwright-core/bin/install_webkit_wsl.ps1 +33 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/browsers.json +52 -0
- package/node_modules/playwright-core/cli.js +22 -0
- package/node_modules/playwright-core/index.js +17 -0
- package/node_modules/playwright-core/index.mjs +28 -0
- package/node_modules/playwright-core/lib/bootstrap.js +149 -0
- package/node_modules/playwright-core/lib/coreBundle.js +78041 -0
- package/node_modules/playwright-core/lib/entry/cliDaemon.js +5 -0
- package/node_modules/playwright-core/lib/entry/dashboardApp.js +3 -0
- package/node_modules/playwright-core/lib/entry/mcp.js +10 -0
- package/node_modules/playwright-core/lib/entry/oopBrowserDownload.js +3 -0
- package/node_modules/playwright-core/lib/package.js +50 -0
- package/node_modules/playwright-core/lib/server/chromium/appIcon.png +0 -0
- package/node_modules/playwright-core/lib/server/electron/loader.js +123 -0
- package/node_modules/playwright-core/lib/serverRegistry.js +1939 -0
- package/node_modules/playwright-core/lib/serverRegistry.js.LICENSE +65 -0
- package/node_modules/playwright-core/lib/tools/cli-client/channelSessions.js +141 -0
- package/node_modules/playwright-core/lib/tools/cli-client/cli.js +7 -0
- package/node_modules/playwright-core/lib/tools/cli-client/help.json +808 -0
- package/node_modules/playwright-core/lib/tools/cli-client/minimist.js +128 -0
- package/node_modules/playwright-core/lib/tools/cli-client/output.js +352 -0
- package/node_modules/playwright-core/lib/tools/cli-client/program.js +422 -0
- package/node_modules/playwright-core/lib/tools/cli-client/registry.js +180 -0
- package/node_modules/playwright-core/lib/tools/cli-client/session.js +261 -0
- package/node_modules/playwright-core/lib/tools/dashboard/appIcon.png +0 -0
- package/node_modules/playwright-core/lib/tools/utils/extension.js +112 -0
- package/node_modules/playwright-core/lib/tools/utils/socketConnection.js +108 -0
- package/node_modules/playwright-core/lib/utilsBundle.js +86078 -0
- package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +1890 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/index.html +29 -0
- package/node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg +24 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/index.html +16 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/report.css +2 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/report.js +32 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DK72OMRi.js +32 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
- package/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
- package/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-BEB2e8M3.js +32 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-B794rD2Z.js +7 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.C8BeHuxd.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.html +44 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.oNry3Hjv.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +10 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CYwC_gH1.js +5 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +18 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
- package/node_modules/playwright-core/lib/webp_codec.LICENSE +173 -0
- package/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
- package/node_modules/playwright-core/lib/xdg-open +1267 -0
- package/node_modules/playwright-core/package.json +34 -0
- package/package.json +13 -7
- package/protocol/index.json +75 -21
- package/protocol/operations/agent.sessions.list.json +100 -0
- package/protocol/operations/agent.sessions.read.json +266 -0
- package/protocol/operations/conversation.settings.check.json +147 -4
- package/protocol/operations/conversation.settings.read.json +145 -3
- package/protocol/operations/conversation.settings.update.json +166 -4
- package/protocol/operations/conversation.start.json +2 -1
- package/protocol/operations/extension.call.json +132 -0
- package/protocol/operations/extension.content.json +78 -0
- package/protocol/operations/extension.describe.json +195 -0
- package/protocol/operations/extension.install.json +198 -0
- package/protocol/operations/extension.list.json +123 -0
- package/protocol/operations/extension.manage.json +55 -0
- package/protocol/operations/extension.read.json +112 -0
- package/protocol/operations/kernel.interrupt.json +20 -0
- package/protocol/operations/kernel.read.json +30 -0
- package/protocol/operations/kernel.run.json +36 -1
- package/protocol/operations/kernel.stop.json +10 -0
- package/protocol/operations/project.work.read.json +3 -2
- package/protocol/operations/session.grant.json +9 -0
- package/scripts/browser-checks.mjs +53 -0
- package/scripts/screen-check.mjs +193 -0
- package/scripts/third-party-acceptance.mjs +77 -0
- package/vendor/composition.json +111 -111
- package/vendor/rho-workspace-plugin-agent-0.4.29.tgz +0 -0
- package/vendor/rho-workspace-plugin-annotations-0.5.2.tgz +0 -0
- package/vendor/rho-workspace-plugin-documents-0.4.11.tgz +0 -0
- package/vendor/rho-workspace-plugin-kernel-0.5.5.tgz +0 -0
- package/web/theme.css +17 -2
- package/dist/web/assets/choices-B-y2OYvE.js +0 -1
- package/dist/web/assets/dist-CBM2oq6g.js +0 -1
- package/dist/web/assets/dist-CH56yNDn.js +0 -3
- package/dist/web/assets/explore-in-muWXOGOY.js +0 -1
- package/dist/web/assets/graph-CK-df5lh.js +0 -2
- package/dist/web/assets/index-DBd77u4a.css +0 -1
- package/dist/web/assets/overview-D1Ev2OC_.js +0 -6
- package/dist/web/assets/preview-HbmQKUGY.js +0 -1
- package/dist/web/assets/workspace-d5Hw_ClZ.js +0 -5
- package/vendor/rho-workspace-plugin-agent-0.4.27.tgz +0 -0
- package/vendor/rho-workspace-plugin-documents-0.4.10.tgz +0 -0
- package/vendor/rho-workspace-plugin-kernel-0.5.2.tgz +0 -0
package/docs/FRONTEND.md
CHANGED
|
@@ -160,18 +160,31 @@ inspect what happened. The application gives those actions direct places:
|
|
|
160
160
|
an ended session stay with their cells in the Notebook. With these views on the page, the
|
|
161
161
|
Notebook leaves its own variables and plots out.
|
|
162
162
|
- **Data flow** (`rho.flow`) shows how the values of a live session were made, as a tab beside
|
|
163
|
-
Variables (else in the right column).
|
|
164
|
-
the
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
(
|
|
163
|
+
Variables (else in the right column). It is a graph of values: the project files and folders
|
|
164
|
+
the session read at the top, the results at the bottom (the files it wrote and the plots it
|
|
165
|
+
drew, else the values nothing reads), and the values between in rows. Each node is titled with
|
|
166
|
+
the meaning its `# means:` comment gives (the Agent writes these above the statement that first
|
|
167
|
+
makes the value; `# means NAME:` names one of several), with the name beneath, and shows the
|
|
168
|
+
name alone without one. A bar names the results: choosing one draws what leads to it, and the
|
|
169
|
+
first is chosen when every result at once would put more than six values in a row. Values that
|
|
170
|
+
lead to no result are named below the graph, and choosing one draws what leads to it. A chosen
|
|
171
|
+
value colors what it comes from and what comes of it; its panel gives its meaning, how and where
|
|
172
|
+
it was made, what it uses and leads to, and which results it reaches. A value can be looked at,
|
|
173
|
+
a file opened, and the cell that made it shown in the Notebook. A narrow view (under 640 px)
|
|
174
|
+
puts the chosen value above the graph. Its values come from the kernel's records (below), each
|
|
175
|
+
meaning from the code of the cell that made the value, and at most 80 values are drawn at once
|
|
176
|
+
([episode](VARIABLE-FLOW-EPISODE.md#meaning-in-the-code)).
|
|
177
|
+
- **How variables relate** ([episode](VARIABLE-FLOW-EPISODE.md)). Under each Notebook cell, what it
|
|
178
|
+
read and from which cell ("Read co from R 3"), and the later cells that read what it made ("ratio
|
|
179
|
+
read in R 6"); a cell named there goes to that cell and marks it. A cell that makes at least three
|
|
180
|
+
values offers "How its values came about", the same graph, under it. Variables names the cell that
|
|
181
|
+
made each value as it is now and the cells that read it. An R or Python script's editor has a Data
|
|
182
|
+
flow switch in its header, kept with the page: the script's flow, read from the text in the editor
|
|
183
|
+
as it is typed (nothing runs), shows beside the code, or below it in a view under 640 px. Its
|
|
184
|
+
nodes are titled by the same comments as the session's, and the flow line says how many values
|
|
185
|
+
have a meaning written in the code. The code marks the lines that make the chosen value, those it
|
|
186
|
+
comes from and those it leads to, in the colors of the key above the flow; choosing a value puts
|
|
187
|
+
the cursor on the line that makes it, and a click on a line that makes a value chooses it.
|
|
175
188
|
- **Servers** (`rho.servers`) shows where the live sessions run: this machine and each place, a
|
|
176
189
|
folder on one of the person's servers, reached through serverctl when serverctl manages it and
|
|
177
190
|
with ssh otherwise. A place shows its server and folder, how it is reached, what its last check saw
|
|
@@ -502,8 +515,11 @@ opening a value or a server's file as a view, code waiting for the Notebook's li
|
|
|
502
515
|
Notebook's form with the page, which views the page has, and a conversation's share of the
|
|
503
516
|
sessions. Highlighting and Markdown come from the shell services (`highlight`, `markdown`).
|
|
504
517
|
The plugin's `./code` finds the statement a script line runs (`statementAt`), writes the code
|
|
505
|
-
that loads a table or runs a script,
|
|
506
|
-
|
|
518
|
+
that loads a table or runs a script, what each cell read from which cell (`cellRelations`), and
|
|
519
|
+
Data flow's graph of values from a session (`sessionGraph`) or a script's text (`scriptGraph`);
|
|
520
|
+
`web/entries/documents.tsx` sends a line through the page's `runCode` shell service, draws a
|
|
521
|
+
script's graph with the plugin's `ScriptFlowView`, keeps the chosen value (from the graph or the
|
|
522
|
+
cursor's line, `graphNodeAt`) and marks the lines behind and in front of it (`graphMarks`).
|
|
507
523
|
The HTML page view is `html.reader` from Rho-plugins (HTML 0.1.0); Rho gives it `pageFrame`, the
|
|
508
524
|
service's `/frame.html` (sandboxed, with its own policy and no network; the page's policy adds
|
|
509
525
|
only `frame-src 'self'`), and `fileBytes`, a file snapshot's bytes (`readFile` in `web/previews.ts`).
|
package/docs/HEADLESS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Rho local backend
|
|
1
|
+
# Rho local backend
|
|
2
2
|
|
|
3
3
|
Rho selects nine independent capability packages: annotations plus documents, files, R,
|
|
4
4
|
requirements, tables, media, charts and Agent. Shared contracts contain generic envelopes/service ports and ordinary-file
|
|
@@ -37,23 +37,39 @@ it. Missing browser renderers do not disable the headless protocol.
|
|
|
37
37
|
## Install and start
|
|
38
38
|
|
|
39
39
|
The selected baseline is macOS arm64, Node 22.22.3 (engine range
|
|
40
|
-
`>=22.22.0 <
|
|
40
|
+
`>=22.22.0 <27`; the suite and the installed check also passed on Node 24.22.2 and
|
|
41
|
+
26.13.0), npm 10.9.8, Python 3 with `fcntl`, and Rscript 4.5.2. Windows x64
|
|
41
42
|
was checked with Node 22.23.4 and Rscript 4.5.1; its writer lock needs no Python, and
|
|
42
43
|
there `rho.cmd` starts Rho and Ctrl+Break on its console stops it in order.
|
|
43
|
-
The unsigned
|
|
44
|
-
binary
|
|
45
|
-
|
|
44
|
+
The unsigned npm package `@rho-workspace/rho` contains Plugins and one digest-checked Core
|
|
45
|
+
binary for each of macOS arm64, Linux x64 and arm64 and Windows x64; CI installs it on each.
|
|
46
|
+
R and any project-selected packages are external prerequisites, and so are the Agent
|
|
47
|
+
clients: conversations drive the person's installed Claude Code or Codex.
|
|
46
48
|
The service, documents, declared files and saved resource readers work without R.
|
|
47
49
|
An unavailable Rscript returns an unknown dependency probe and prevents managed R execution.
|
|
48
|
-
Other platforms
|
|
50
|
+
Other platforms are unverified.
|
|
49
51
|
|
|
50
52
|
```sh
|
|
51
|
-
npm install
|
|
52
|
-
/absolute/
|
|
53
|
-
--root /absolute/projects --state-dir /absolute/service-state
|
|
53
|
+
npm install -g @rho-workspace/rho
|
|
54
|
+
rho --root /absolute/projects --state-dir /absolute/service-state
|
|
54
55
|
```
|
|
55
56
|
|
|
56
57
|
Create the allowed projects directory first. Keep service state outside projects.
|
|
58
|
+
|
|
59
|
+
A person who has no folders to name runs the package with no arguments instead (from
|
|
60
|
+
0.5.4; 0.5.3 prints its usage and exits 2):
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
npx @rho-workspace/rho
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
That start uses `~/Rho/projects` and `~/Rho/state`, creates both, ships the example
|
|
67
|
+
project on a new state, and prints — after the machine line — the address to open,
|
|
68
|
+
the two folders, and whether the Agent client and R were found, so a missing one is
|
|
69
|
+
read at startup rather than discovered later. It opens the address in a browser when
|
|
70
|
+
stdout is an interactive terminal. Every flagged start keeps the output it had; no
|
|
71
|
+
argument used to print this page and exit 2.
|
|
72
|
+
|
|
57
73
|
Startup prints the loopback URL and private connection-file location, never the
|
|
58
74
|
credential. Opening that URL in a browser on the same machine is the access: the
|
|
59
75
|
service answers a same-origin request from loopback as the local person, with the
|
|
@@ -63,7 +79,17 @@ must expire; that link is a credential and is only as good as its five-minute
|
|
|
63
79
|
window and single use. A credential that is present must still be valid, so an old
|
|
64
80
|
link never silently widens to local access; a same-origin request that carries no
|
|
65
81
|
credential is the machine's own. Host and Origin are checked on every request, and
|
|
66
|
-
a browser request marked as coming from another site is refused.
|
|
82
|
+
a browser request marked as coming from another site is refused.
|
|
83
|
+
|
|
84
|
+
A start without `--port` takes the port this state's last start had, so a bookmarked
|
|
85
|
+
address and every Agent connection still reach it after a restart; only when another
|
|
86
|
+
program holds that port does it take a new one, and then each Agent connection file in
|
|
87
|
+
the state that named the old address is rewritten to the new one, keeping its token.
|
|
88
|
+
`--port 0` always takes a new port. A selected port that is in use is refused with the
|
|
89
|
+
port named, never replaced. A second start on a state that is already running is
|
|
90
|
+
refused with the running service's address.
|
|
91
|
+
|
|
92
|
+
`--port`, `--rscript`, `--core`, `--plugins` and `--limits` are explicit
|
|
67
93
|
operator selections; `RHO_RSCRIPT`, `RHO_CORE_BINARY` and `RHO_PYTHON` select
|
|
68
94
|
equivalent runtimes. A Core override is outside bundled digest verification.
|
|
69
95
|
A source checkout has no bundled Core: packaging supplies one per platform under
|
|
@@ -106,17 +132,32 @@ Exact Host and supplied Origin are checked. The bearer credential is project
|
|
|
106
132
|
scoped for external callers. CLI shutdown stops only Hosts started by this
|
|
107
133
|
service and reports confirmation separately. Existing Hosts keep their owner.
|
|
108
134
|
|
|
109
|
-
### Connect Claude Code
|
|
135
|
+
### Connect Claude Code or Codex
|
|
136
|
+
|
|
137
|
+
The running service's operator connection adds Rho to the person's own Claude Code
|
|
138
|
+
or Codex for one project, as the project page's "Add to …" button does:
|
|
139
|
+
|
|
140
|
+
```sh
|
|
141
|
+
rho --grant /absolute/service-state/connection.json --project PROJECT_FOLDER --agent claude-code|codex
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
It gives that Agent its own grant to the project (kept when it still reaches the
|
|
145
|
+
service), runs that Agent's `mcp remove` and `mcp add` on this machine — Claude Code's
|
|
146
|
+
with `-s local` in the project folder, Codex's for every folder — and records it, so the
|
|
147
|
+
page shows it under that Agent. The JSON reply names the project, its root, the number
|
|
148
|
+
of granted methods, whether a new grant was made, and what was added (`name`, `scope`,
|
|
149
|
+
`at`). A session that was already open does not have the tools; a new one does.
|
|
110
150
|
|
|
111
|
-
|
|
112
|
-
|
|
151
|
+
Without `--agent`, the same connection grants one project to one Agent session and
|
|
152
|
+
prints how Claude Code starts that session's MCP server:
|
|
113
153
|
|
|
114
154
|
```sh
|
|
115
155
|
rho --grant /absolute/service-state/connection.json --project PROJECT_FOLDER [--session NAME]
|
|
116
156
|
```
|
|
117
157
|
|
|
118
158
|
`--project` is the folder relative to `--root`; `--session` defaults to
|
|
119
|
-
`claude-code
|
|
159
|
+
`claude-code`, the session `--agent claude-code` uses, and `--session codex` is the one
|
|
160
|
+
`--agent codex` uses. When the service is not running, both forms say so and exit 1. The JSON reply names the project, the private session connection
|
|
120
161
|
file, the number of granted methods (the server default), an `mcp` entry
|
|
121
162
|
(`name`, `command`, `args`) for an MCP configuration file, and the equivalent
|
|
122
163
|
`claude mcp add rho-<folder> -- … --mcp <file>` command. `rho --mcp FILE` serves
|
|
@@ -952,6 +993,11 @@ Notebook 0.1.0 (`@rho-workspace/plugin-kernel`) keeps one live R session and one
|
|
|
952
993
|
live Python session per project, in the project folder, shared by the person and
|
|
953
994
|
their Agent. `kernel.run` queues a cell in its language's session and starts the
|
|
954
995
|
session when none is live; `waitMs` waits up to `maxWaitMs` for it to end.
|
|
996
|
+
Since Notebook 0.5.3 a cell may name `interpreter`, a program in a folder of the project
|
|
997
|
+
such as an environment's `.venv/bin/python`; the project keeps it for that language's later
|
|
998
|
+
sessions, and a session in which only that caller ran cells starts again with it, while one
|
|
999
|
+
where anyone else ran a cell is refused. Each session and each cell records the program
|
|
1000
|
+
(relative to the project when it is in it) and the version that ran it.
|
|
955
1001
|
`kernel.read` returns the sessions, their variables and the cells, and never starts
|
|
956
1002
|
a session. `kernel.inspect` returns one value of a live session as its session
|
|
957
1003
|
describes it: its kind (table, model, vector, list, function, value or other), class,
|
package/docs/PLUGIN-AUTHORING.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Build a UI extension
|
|
2
2
|
|
|
3
|
+
For independently installed operations, Skills and live HTML views, use the
|
|
4
|
+
[third-party plugin channel](THIRD-PARTY-PLUGINS.md). This page covers compiled
|
|
5
|
+
React entries over an existing Rho capability.
|
|
6
|
+
|
|
3
7
|
A UI extension is a React view over an existing Rho capability, such as Documents
|
|
4
8
|
or Tables. The package owns its view; the existing capability owns data, edits and
|
|
5
9
|
operations. Rho supplies tabs, splits, focus and versioned resource bindings.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Develop and install third-party plugins
|
|
2
|
+
|
|
3
|
+
Rho can install independent npm packages while it is running. A package supplies
|
|
4
|
+
operations, Skills and standalone HTML views; it does not require rebuilding Rho
|
|
5
|
+
or becoming a base dependency. The first consumer is the optional
|
|
6
|
+
[sclet adapter](https://github.com/YuLab-SMU/Rho-plugins/tree/main/examples/sclet-plugin).
|
|
7
|
+
Its scientific implementation remains in sclet and its objects remain in the
|
|
8
|
+
project's shared R session. See the [observed episode](THIRD-PARTY-PLUGINS-EPISODE.md).
|
|
9
|
+
|
|
10
|
+
This is source functionality after Rho 0.5.4, not a new npm release. Build the
|
|
11
|
+
current checkout with `npm run build` and use `node dist/cli.js` in place of
|
|
12
|
+
`rho` until a distribution containing it is installed.
|
|
13
|
+
|
|
14
|
+
## Install and manage
|
|
15
|
+
|
|
16
|
+
Open a project, then **Plugins → Third-party plugins**. Install a directory entry
|
|
17
|
+
or enter a package source. The installed card shows its version, source, enabled
|
|
18
|
+
state and content digest. Open its view, read its guide, update, disable or remove
|
|
19
|
+
it there. An invalid source or failed update leaves the previous selection intact.
|
|
20
|
+
|
|
21
|
+
Only install packages you trust. Hosts run native code with the Rho process user's
|
|
22
|
+
OS permissions. Disabling npm lifecycle scripts prevents install hooks; it does
|
|
23
|
+
not make plugin execution a sandbox. No approval is added to already authorized
|
|
24
|
+
analysis. Paired browsers and Agent connections cannot install or manage packages.
|
|
25
|
+
|
|
26
|
+
The equivalent commands use the running service's private connection file:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
rho plugin add /absolute/path/my-plugin
|
|
30
|
+
rho plugin add /absolute/path/my-plugin-0.1.0.tgz
|
|
31
|
+
rho plugin add @your-org/rho-plugin@0.1.0
|
|
32
|
+
rho plugin add 'git+https://github.com/your-org/repository.git#COMMIT:packages/plugin'
|
|
33
|
+
rho plugin list
|
|
34
|
+
rho plugin update my-plugin
|
|
35
|
+
rho plugin update my-plugin --source @your-org/rho-plugin@0.2.0
|
|
36
|
+
rho plugin disable my-plugin
|
|
37
|
+
rho plugin enable my-plugin
|
|
38
|
+
rho plugin remove my-plugin
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Add `--connection /absolute/service-state/connection.json` for a nondefault
|
|
42
|
+
service. The default is `~/Rho/state/connection.json`. These commands do not start
|
|
43
|
+
a service. Never share the connection file. Public HTTPS `.tgz` URLs are also
|
|
44
|
+
accepted. Git sources require Git; package staging requires npm. Git submodules
|
|
45
|
+
and build hooks are not run. Build and include runtime files before distribution.
|
|
46
|
+
|
|
47
|
+
Installation stages an isolated dependency tree using npm with `--ignore-scripts`
|
|
48
|
+
and `--install-links`, validates the manifest and contained files, hashes the tree,
|
|
49
|
+
then atomically selects it. The source selector, resolved Git commit when present,
|
|
50
|
+
package version and runtime-tree digest remain visible. Listing does not import
|
|
51
|
+
plugin code. Content and calls verify the installed tree before use.
|
|
52
|
+
|
|
53
|
+
Disable blocks new calls and views. Remove takes the package out of the installed
|
|
54
|
+
selection. Both preserve native tasks, R sessions, project files and receipts.
|
|
55
|
+
Package revisions are retained in the service's `plugins/versions` directory;
|
|
56
|
+
remove is not a disk-purge command. Closing a view only releases its renderer.
|
|
57
|
+
|
|
58
|
+
## Create a package
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
rho plugin create my-plugin --id lab.my-plugin
|
|
62
|
+
rho plugin check ./my-plugin
|
|
63
|
+
rho plugin dev ./my-plugin
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`create` refuses to overwrite a directory. The generated package has a working
|
|
67
|
+
greeting operation, Skill and view. `dev` installs checked snapshots on source
|
|
68
|
+
changes, ignoring `.git` and `node_modules`. Reopen a view to load a new snapshot.
|
|
69
|
+
Invalid edits retain the last working installation. No Rho rebuild is needed.
|
|
70
|
+
|
|
71
|
+
| File | Responsibility |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| `package.json` | npm name/version, runtime files and `rhoPlugin: "rho-plugin.json"` |
|
|
74
|
+
| `rho-plugin.json` | API version 1, unique plugin id, title, description and entries |
|
|
75
|
+
| `host.mjs` | `run(operation, input, context)` over the domain's public capabilities |
|
|
76
|
+
| `SKILL.md` | When/how to use the package, prerequisites, failures and result limits |
|
|
77
|
+
| `view.html` | Prebuilt HTML with inline scripts/styles; may bundle a framework |
|
|
78
|
+
|
|
79
|
+
Each operation declares `id`, `title`, `description`, `effect` (`read` or
|
|
80
|
+
`native`), the Rho `methods` it delegates, and an object `inputSchema`. Each Skill
|
|
81
|
+
or view declares `id`, `title` and a package-relative `file`. The manifest's
|
|
82
|
+
`operations`, `skills` and `views` arrays are required, but may be empty. A host
|
|
83
|
+
is required only when operations exist. The checker validates entry containment,
|
|
84
|
+
API compatibility, identifiers, duplicate entries, schemas and entry sizes.
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
export async function run(operation, input, context) {
|
|
88
|
+
if (operation === 'read-sessions') {
|
|
89
|
+
const value = await context.call('kernel.read', { limit: 1 });
|
|
90
|
+
return { sessions: value.sessions };
|
|
91
|
+
}
|
|
92
|
+
throw new Error('Unknown operation');
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`context.projectRoot` is the selected project, `context.invocationId` identifies
|
|
97
|
+
this call, and `context.changeId(label)` supplies a stable delegated write id.
|
|
98
|
+
`context.call(method, body)` validates the ordinary Rho schema, original caller's
|
|
99
|
+
grant, current project and owner availability. Declare every delegated method.
|
|
100
|
+
A read operation cannot delegate a mutating method. It must also keep its own
|
|
101
|
+
native work read-only; native host code is trusted, not OS-confined.
|
|
102
|
+
|
|
103
|
+
The host runs in a disposable child process for each call, without the service
|
|
104
|
+
token. Keep long work in its actual native owner and return its handle promptly.
|
|
105
|
+
For example sclet submits `kernel.run` with `waitMs: 0`, then observes the same
|
|
106
|
+
cell with `kernel.read`. Do not create a second scientific state store in Rho.
|
|
107
|
+
|
|
108
|
+
## Agent and view entries
|
|
109
|
+
|
|
110
|
+
Agents discover installed packages through `extension.list`, read their schema
|
|
111
|
+
with `extension.describe`, and read a Skill through `extension.content` with
|
|
112
|
+
`kind: "skill"`. These operations are available through the existing layered MCP
|
|
113
|
+
discovery. They then call:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"pluginId": "lab.my-plugin",
|
|
118
|
+
"expectedDigest": "64-character digest from extension.describe",
|
|
119
|
+
"operation": "greet",
|
|
120
|
+
"input": { "name": "World" },
|
|
121
|
+
"changeId": "original-request-1"
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This is the body of `extension.call`; direct HTTP clients also supply `projectId`.
|
|
126
|
+
The returned receipt separates plugin completion from the native result in
|
|
127
|
+
`value`. Native invocations retain pending/completed/unknown receipts and delegated
|
|
128
|
+
requests/replies. Repeat the **exact** request to observe the same receipt, even
|
|
129
|
+
after update or removal. `extension.read` reads it by `invocationId` for the same
|
|
130
|
+
caller/project. A restart converts pending receipts to unknown; it never replays
|
|
131
|
+
them. Read-only calls do not accumulate durable receipts. No plugin receipt makes
|
|
132
|
+
native work Core-managed or establishes scientific validity.
|
|
133
|
+
|
|
134
|
+
A view runs in an iframe with an opaque origin, no service credential or storage
|
|
135
|
+
access, and no network loading. Bundle assets inline or as data URLs. Its bridge
|
|
136
|
+
is restricted to the selected package and digest:
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
const receipt = await rho.call('greet', { name: 'World' });
|
|
140
|
+
output.textContent = receipt.state === 'completed'
|
|
141
|
+
? receipt.value.greeting : receipt.error;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Pass a third argument to `rho.call` to retain an explicit original changeId.
|
|
145
|
+
The default generates one per deliberate call. A stale digest is refused; reopen
|
|
146
|
+
the view after an update. Several views may be declared and selected in the plugin
|
|
147
|
+
panel. These runtime views currently live on Plugins, not in Studio's resource
|
|
148
|
+
binding/layout contract. Existing compiled React extensions still use
|
|
149
|
+
[UI extension authoring](PLUGIN-AUTHORING.md).
|
|
150
|
+
|
|
151
|
+
## Contribute and distribute
|
|
152
|
+
|
|
153
|
+
Keep your repository, license, dependencies and release history independent. Check
|
|
154
|
+
the packed artifact, not just source: `npm pack --ignore-scripts`, then install
|
|
155
|
+
that tarball in a disposable Rho project. Exercise missing prerequisites, an input
|
|
156
|
+
error, recovery, update and removal. Record the Rho/API version, package digest,
|
|
157
|
+
native versions and actual result. Preserve user data and avoid credentials in
|
|
158
|
+
examples or diagnostics. Publish to your own npm namespace or share a public Git
|
|
159
|
+
source/tarball; Rho does not publish packages on your behalf.
|
|
160
|
+
|
|
161
|
+
No central registration is needed to install a package. To be discoverable in the
|
|
162
|
+
bundled directory, submit a PR editing
|
|
163
|
+
[`src/extension-directory.ts`](../src/extension-directory.ts), linking the public
|
|
164
|
+
source, license, author guide and a reproducible acceptance record. Propose an
|
|
165
|
+
immutable Git commit or exact npm version. Maintainers check the declared scope;
|
|
166
|
+
directory inclusion is not a security audit, release signature or scientific
|
|
167
|
+
endorsement. Future releases of the package can update that entry independently.
|
|
168
|
+
|
|
169
|
+
## Resource limits and current scope
|
|
170
|
+
|
|
171
|
+
Use the service's `--limits` JSON file with an `extensions` object to override
|
|
172
|
+
limits. Exceeding a limit refuses new work, retains the previous selected package
|
|
173
|
+
and obtained receipts, or records an unknown result after an interrupted call.
|
|
174
|
+
|
|
175
|
+
| Protected resource | Default configuration |
|
|
176
|
+
| --- | --- |
|
|
177
|
+
| Installed selections / retained revisions | `maxPlugins: 32`, `maxVersions: 128` |
|
|
178
|
+
| Admitted runtime tree | `maxFiles: 20000`, `maxPackageBytes: 134217728` |
|
|
179
|
+
| Skill/view bytes | `maxContentBytes: 524288` |
|
|
180
|
+
| Durable invocations / receipt and result bytes | `maxReceipts: 2000`, `maxResultBytes: 1048576` |
|
|
181
|
+
| Concurrent calls / delegated calls per invocation | `maxRunning: 4`, `maxDelegations: 32` |
|
|
182
|
+
| Worker / each install subprocess | `timeoutMs: 30000`, `installTimeoutMs: 180000` |
|
|
183
|
+
|
|
184
|
+
The tree-size check applies after npm staging; it is not a disk quota on npm/Git.
|
|
185
|
+
A timed-out worker does not prove a delegated native task stopped. Observe its
|
|
186
|
+
original identity. Retention limits refuse rather than silently evict identities;
|
|
187
|
+
raise them deliberately when appropriate. Manifests are capped at 64 KiB, with
|
|
188
|
+
32 operations and 16 entries of each content kind. The browser permits four
|
|
189
|
+
pending calls per view. macOS with Node 22 is observed in this episode; Windows,
|
|
190
|
+
Linux and independent developer usability have not been established for this path.
|