@rho-workspace/rho 0.5.5 → 0.5.7

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 (250) hide show
  1. package/dist/agent-connect.d.ts +42 -0
  2. package/dist/agent-connect.js +68 -0
  3. package/dist/answer-board.js +3 -3
  4. package/dist/bridge.js +6 -1
  5. package/dist/browser-access.d.ts +1 -0
  6. package/dist/browser-access.js +5 -3
  7. package/dist/capabilities.d.ts +21 -5
  8. package/dist/capabilities.js +6 -4
  9. package/dist/cli.js +113 -18
  10. package/dist/composition.d.ts +1 -1
  11. package/dist/composition.js +13 -3
  12. package/dist/connect-cli.d.ts +50 -0
  13. package/dist/connect-cli.js +128 -0
  14. package/dist/contract.generated.d.ts +1437 -381
  15. package/dist/contract.generated.js +1 -1
  16. package/dist/contracts/owners.generated.js +1160 -267
  17. package/dist/conversation-presentation.d.ts +9 -2
  18. package/dist/conversation-presentation.js +3 -1
  19. package/dist/conversations.d.ts +306 -7
  20. package/dist/conversations.js +208 -22
  21. package/dist/discovery.js +3 -3
  22. package/dist/extension-contract.d.ts +19 -0
  23. package/dist/extension-contract.js +15 -6
  24. package/dist/extension-markets.d.ts +74 -0
  25. package/dist/extension-markets.js +166 -0
  26. package/dist/extensions.d.ts +29 -1
  27. package/dist/extensions.js +13 -4
  28. package/dist/external-work.d.ts +22 -0
  29. package/dist/external-work.js +91 -0
  30. package/dist/plugin-cli.js +75 -3
  31. package/dist/plugin-inventory.d.ts +56 -0
  32. package/dist/plugin-inventory.js +41 -0
  33. package/dist/plugin-inventory.json +1581 -102
  34. package/dist/plugin-presentation.d.ts +105 -2
  35. package/dist/plugin-presentation.js +59 -5
  36. package/dist/plugins.d.ts +14 -3
  37. package/dist/plugins.js +12 -6
  38. package/dist/project-notes.js +1 -1
  39. package/dist/protocol.d.ts +7 -0
  40. package/dist/protocol.js +40 -15
  41. package/dist/replay.js +4 -0
  42. package/dist/response-contracts.js +26 -11
  43. package/dist/running.d.ts +10 -0
  44. package/dist/running.js +45 -0
  45. package/dist/server.d.ts +4 -10
  46. package/dist/server.js +140 -14
  47. package/dist/state.d.ts +8 -0
  48. package/dist/state.js +8 -0
  49. package/dist/studio-layout.js +3 -3
  50. package/dist/task-frame.d.ts +1 -1
  51. package/dist/timeline-events.d.ts +1 -0
  52. package/dist/timeline-events.js +8 -1
  53. package/dist/ui-context.d.ts +73 -0
  54. package/dist/ui-context.js +98 -0
  55. package/dist/ui-contract.d.ts +23 -0
  56. package/dist/web/.vite/manifest.json +135 -76
  57. package/dist/web/assets/answer-board-CeYS8k8y.js +1 -0
  58. package/dist/web/assets/choices-D8vGwsl2.js +1 -0
  59. package/dist/web/assets/{console-BSjLGe0T.js → console-Dyuo1q4N.js} +4 -4
  60. package/dist/web/assets/{dist-Tzoe_zm-.js → dist-CSiCyBml.js} +1 -1
  61. package/dist/web/assets/{dist-Cw8hRIlT.js → dist-D9FLb9Hm.js} +1 -1
  62. package/dist/web/assets/{dist-foH9IKc6.js → dist-FXbTBwML.js} +1 -1
  63. package/dist/web/assets/{dist-Buk0lwzI.js → dist-l3DUhbw5.js} +1 -1
  64. package/dist/web/assets/{explore-in-BVUy3ZW_.js → explore-in-BfSFGRh2.js} +1 -1
  65. package/dist/web/assets/graph-BU2_o5uA.js +2 -0
  66. package/dist/web/assets/index-C16mXVvk.css +1 -0
  67. package/dist/web/assets/index-CWg9XYXx.js +952 -0
  68. package/dist/web/assets/markdown.reader-Ct2-e2Zt.png +0 -0
  69. package/dist/web/assets/{notes-meaning-pVbbQUGP.js → notes-meaning-T2m5zQfv.js} +1 -1
  70. package/dist/web/assets/overview-PzfLJCo-.js +6 -0
  71. package/dist/web/assets/preview-BguEdsza.js +1 -0
  72. package/dist/web/assets/previews-pWNik-2g.js +3 -0
  73. package/dist/web/assets/{review-CMxQlQ-C.js → review-Dy_85lcH.js} +1 -1
  74. package/dist/web/assets/rho.editor-CCJeyHma.png +0 -0
  75. package/dist/web/assets/rho.flow-WkMj6fRS.png +0 -0
  76. package/dist/web/assets/rho.media-Cc6amodO.png +0 -0
  77. package/dist/web/assets/rho.notebook-6vsZKGDq.png +0 -0
  78. package/dist/web/assets/rho.object-BGoeXjte.png +0 -0
  79. package/dist/web/assets/rho.plots-yIiISCkb.png +0 -0
  80. package/dist/web/assets/rho.scatter-DwHxesCs.png +0 -0
  81. package/dist/web/assets/rho.servers-DKf_mnNq.png +0 -0
  82. package/dist/web/assets/rho.table-DWOGaWDa.png +0 -0
  83. package/dist/web/assets/rho.variables-CKcWczhQ.png +0 -0
  84. package/dist/web/assets/{skills-BFNSyrnD.js → skills-Dyz7mBlc.js} +1 -1
  85. package/dist/web/assets/{skills-work-BGPSnF_I.js → skills-work-BEGqlCkx.js} +1 -1
  86. package/dist/web/assets/studio-process-D-ykbC4D.js +2 -0
  87. package/dist/web/assets/timeline-events-DKTho9fU.js +1 -0
  88. package/dist/web/assets/work-turns-DSabCogR.js +1 -0
  89. package/dist/web/assets/{workspace-CWlkjLNx.js → workspace-DfjBL--r.js} +2 -2
  90. package/dist/web/composition.json +135 -80
  91. package/dist/web/index.html +3 -3
  92. package/dist/web/renderer.json +1 -1
  93. package/dist/web-assets.js +2 -2
  94. package/dist/work-graph.d.ts +11 -1
  95. package/dist/work-graph.js +16 -5
  96. package/dist/workspace.d.ts +2 -2
  97. package/dist/workspace.js +8 -7
  98. package/docs/FRONTEND.md +71 -21
  99. package/docs/HEADLESS.md +127 -24
  100. package/docs/THIRD-PARTY-PLUGINS.md +75 -3
  101. package/node_modules/@rho-workspace/plugin-agent/README.md +34 -0
  102. package/node_modules/@rho-workspace/plugin-agent/dist/acp-command.d.ts +32 -0
  103. package/node_modules/@rho-workspace/plugin-agent/dist/acp-command.js +54 -11
  104. package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.d.ts +1 -0
  105. package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.js +29 -3
  106. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.js +11 -5
  107. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.d.ts +12 -1
  108. package/node_modules/@rho-workspace/plugin-agent/dist/index.d.ts +8 -0
  109. package/node_modules/@rho-workspace/plugin-agent/dist/index.js +3 -2
  110. package/node_modules/@rho-workspace/plugin-agent/dist/mcp-entry.d.ts +13 -0
  111. package/node_modules/@rho-workspace/plugin-agent/dist/mcp-entry.js +13 -0
  112. package/node_modules/@rho-workspace/plugin-agent/dist/mcp.js +16 -8
  113. package/node_modules/@rho-workspace/plugin-agent/dist/native-sessions.d.ts +70 -0
  114. package/node_modules/@rho-workspace/plugin-agent/dist/native-sessions.js +538 -0
  115. package/node_modules/@rho-workspace/plugin-agent/package.json +2 -1
  116. package/node_modules/@rho-workspace/plugin-figures/LICENSE +661 -0
  117. package/node_modules/@rho-workspace/plugin-figures/README.md +191 -0
  118. package/node_modules/@rho-workspace/plugin-figures/dist/index.d.ts +236 -0
  119. package/node_modules/@rho-workspace/plugin-figures/dist/index.js +165 -0
  120. package/node_modules/@rho-workspace/plugin-figures/dist/operations.d.ts +44 -0
  121. package/node_modules/@rho-workspace/plugin-figures/dist/operations.js +39 -0
  122. package/node_modules/@rho-workspace/plugin-figures/dist/presentation.d.ts +19 -0
  123. package/node_modules/@rho-workspace/plugin-figures/dist/presentation.js +26 -0
  124. package/node_modules/@rho-workspace/plugin-figures/dist/record.d.ts +188 -0
  125. package/node_modules/@rho-workspace/plugin-figures/dist/record.js +143 -0
  126. package/node_modules/@rho-workspace/plugin-figures/dist/ui-styles.d.ts +1 -0
  127. package/node_modules/@rho-workspace/plugin-figures/dist/ui-styles.js +68 -0
  128. package/node_modules/@rho-workspace/plugin-figures/dist/ui.d.ts +56 -0
  129. package/node_modules/@rho-workspace/plugin-figures/dist/ui.js +363 -0
  130. package/node_modules/@rho-workspace/plugin-figures/package.json +41 -0
  131. package/node_modules/@rho-workspace/plugin-figures/py/figures.py +856 -0
  132. package/node_modules/@rho-workspace/plugin-figures/r/figures.R +775 -0
  133. package/node_modules/@rho-workspace/plugin-kernel/README.md +27 -3
  134. package/node_modules/@rho-workspace/plugin-kernel/dist/contract.d.ts +12 -0
  135. package/node_modules/@rho-workspace/plugin-kernel/dist/contract.js +8 -1
  136. package/node_modules/@rho-workspace/plugin-kernel/dist/index.d.ts +61 -0
  137. package/node_modules/@rho-workspace/plugin-kernel/dist/index.js +125 -9
  138. package/node_modules/@rho-workspace/plugin-kernel/dist/session-scope.d.ts +14 -0
  139. package/node_modules/@rho-workspace/plugin-kernel/dist/session-scope.js +9 -0
  140. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.d.ts +23 -5
  141. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook-work.js +1 -1
  142. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.d.ts +6 -4
  143. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.js +44 -17
  144. package/node_modules/@rho-workspace/plugin-kernel/dist/ui-styles.js +6 -0
  145. package/node_modules/@rho-workspace/plugin-kernel/package.json +1 -1
  146. package/node_modules/@rho-workspace/plugin-kernel/runners/runner.R +144 -4
  147. package/node_modules/@rho-workspace/plugin-kernel/runners/runner.py +106 -1
  148. package/node_modules/@rho-workspace/plugin-tables/README.md +5 -0
  149. package/node_modules/@rho-workspace/plugin-tables/dist/index.d.ts +1 -0
  150. package/node_modules/@rho-workspace/plugin-tables/dist/index.js +19 -3
  151. package/node_modules/@rho-workspace/plugin-tables/dist/ui.js +1 -1
  152. package/node_modules/@rho-workspace/plugin-tables/package.json +1 -1
  153. package/node_modules/hono/dist/adapter/aws-lambda/handler.js +1 -1
  154. package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +1 -1
  155. package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
  156. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  157. package/node_modules/hono/dist/cjs/client/fetch-result-please.js +1 -1
  158. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +2 -1
  159. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +5 -3
  160. package/node_modules/hono/dist/cjs/jsx/base.js +49 -30
  161. package/node_modules/hono/dist/cjs/jsx/components.js +2 -2
  162. package/node_modules/hono/dist/cjs/jsx/constants.js +2 -0
  163. package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +13 -17
  164. package/node_modules/hono/dist/cjs/middleware/etag/index.js +3 -1
  165. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +1 -0
  166. package/node_modules/hono/dist/cjs/middleware/timing/timing.js +4 -3
  167. package/node_modules/hono/dist/cjs/utils/cookie.js +2 -2
  168. package/node_modules/hono/dist/cjs/utils/mime.js +1 -1
  169. package/node_modules/hono/dist/cjs/utils/url.js +1 -1
  170. package/node_modules/hono/dist/client/fetch-result-please.js +1 -1
  171. package/node_modules/hono/dist/helper/accepts/accepts.js +2 -1
  172. package/node_modules/hono/dist/helper/ssg/ssg.js +5 -3
  173. package/node_modules/hono/dist/jsx/base.js +49 -32
  174. package/node_modules/hono/dist/jsx/components.js +2 -2
  175. package/node_modules/hono/dist/jsx/constants.js +2 -1
  176. package/node_modules/hono/dist/jsx/jsx-runtime.js +15 -19
  177. package/node_modules/hono/dist/middleware/etag/index.js +3 -1
  178. package/node_modules/hono/dist/middleware/language/language.js +1 -1
  179. package/node_modules/hono/dist/middleware/pretty-json/index.js +1 -0
  180. package/node_modules/hono/dist/middleware/timing/timing.js +4 -3
  181. package/node_modules/hono/dist/utils/cookie.js +2 -2
  182. package/node_modules/hono/dist/utils/mime.js +1 -1
  183. package/node_modules/hono/dist/utils/url.js +1 -1
  184. package/node_modules/hono/package.json +1 -1
  185. package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +3 -2
  186. package/node_modules/jose/dist/webapi/jwks/remote.js +1 -1
  187. package/node_modules/jose/dist/webapi/jws/general/verify.js +2 -8
  188. package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +11 -8
  189. package/node_modules/jose/dist/webapi/lib/key_management.js +0 -1
  190. package/node_modules/jose/package.json +1 -1
  191. package/package.json +6 -4
  192. package/protocol/index.json +106 -64
  193. package/protocol/operations/agent.sessions.list.json +57 -3
  194. package/protocol/operations/agent.sessions.read.json +61 -4
  195. package/protocol/operations/capability.list.json +382 -6
  196. package/protocol/operations/composition.apply.json +10 -2
  197. package/protocol/operations/composition.delete.json +845 -0
  198. package/protocol/operations/composition.read.json +10 -2
  199. package/protocol/operations/composition.undo.json +10 -2
  200. package/protocol/operations/conversation.agents.add.json +346 -0
  201. package/protocol/operations/conversation.agents.remove.json +340 -0
  202. package/protocol/operations/conversation.configure.json +29 -0
  203. package/protocol/operations/conversation.decide.json +225 -0
  204. package/protocol/operations/conversation.list.json +29 -0
  205. package/protocol/operations/conversation.permission.json +225 -0
  206. package/protocol/operations/conversation.read.json +225 -0
  207. package/protocol/operations/conversation.restore.json +29 -0
  208. package/protocol/operations/conversation.send.json +294 -0
  209. package/protocol/operations/conversation.settings.check.json +226 -416
  210. package/protocol/operations/conversation.settings.read.json +224 -411
  211. package/protocol/operations/conversation.settings.update.json +248 -475
  212. package/protocol/operations/conversation.start.json +313 -6
  213. package/protocol/operations/conversation.stop.json +225 -0
  214. package/protocol/operations/conversation.trash.json +29 -0
  215. package/protocol/operations/extension.describe.json +39 -0
  216. package/protocol/operations/extension.install.json +62 -0
  217. package/protocol/operations/extension.list.json +164 -1
  218. package/protocol/operations/extension.market.change.json +210 -0
  219. package/protocol/operations/figure.read.json +265 -0
  220. package/protocol/operations/figure.select.json +157 -0
  221. package/protocol/operations/kernel.interrupt.json +119 -0
  222. package/protocol/operations/kernel.read.json +119 -0
  223. package/protocol/operations/kernel.run.json +119 -0
  224. package/protocol/operations/observation.snapshot.json +445 -8
  225. package/protocol/operations/project.openFile.json +10 -2
  226. package/protocol/operations/session.grant.json +4 -0
  227. package/protocol/operations/session.instructions.json +43 -0
  228. package/protocol/operations/shared.json +1 -0
  229. package/protocol/operations/view.close.json +10 -2
  230. package/protocol/operations/view.protection.set.json +10 -2
  231. package/vendor/composition.json +174 -109
  232. package/vendor/rho-workspace-plugin-agent-0.4.33.tgz +0 -0
  233. package/vendor/rho-workspace-plugin-figures-0.5.1.tgz +0 -0
  234. package/vendor/rho-workspace-plugin-kernel-0.5.13.tgz +0 -0
  235. package/vendor/rho-workspace-plugin-tables-0.5.2.tgz +0 -0
  236. package/web/theme.css +17 -0
  237. package/dist/web/assets/answer-board-CBkGbSLD.js +0 -1
  238. package/dist/web/assets/canvas-D8rDdfDz.js +0 -1
  239. package/dist/web/assets/choices-b0XhrGQV.js +0 -1
  240. package/dist/web/assets/graph-1OdIJ9l7.js +0 -2
  241. package/dist/web/assets/index-CsC3sTRq.css +0 -1
  242. package/dist/web/assets/index-CxmItXqa.js +0 -891
  243. package/dist/web/assets/overview-B9UtVJ32.js +0 -6
  244. package/dist/web/assets/preview-CksD_5KS.js +0 -1
  245. package/dist/web/assets/studio-process-CsRoTHOh.js +0 -2
  246. package/dist/web/assets/timeline-events-BbuuFWHV.js +0 -1
  247. package/dist/web/assets/work-turns-BvJlIMmA.js +0 -1
  248. package/vendor/rho-workspace-plugin-agent-0.4.29.tgz +0 -0
  249. package/vendor/rho-workspace-plugin-kernel-0.5.5.tgz +0 -0
  250. package/vendor/rho-workspace-plugin-tables-0.5.0.tgz +0 -0
@@ -16,7 +16,8 @@ const RETAINED_304_HEADERS = [
16
16
  ];
17
17
  const stripWeak = (tag) => tag.replace(/^W\//, "");
18
18
  function etagMatches(etag, ifNoneMatch) {
19
- return ifNoneMatch != null && ifNoneMatch.split(",").some((t) => stripWeak(t.trim()) === stripWeak(etag));
19
+ const expected = stripWeak(etag);
20
+ return ifNoneMatch?.match(/"[^"]*"/g)?.some((tag) => tag === expected) ?? false;
20
21
  }
21
22
  function initializeGenerator(generator) {
22
23
  if (!generator) {
@@ -64,6 +65,7 @@ const etag = (options) => {
64
65
  etag = weak ? `W/"${hash}"` : `"${hash}"`;
65
66
  }
66
67
  if (ifNoneMatch === "*" || etagMatches(etag, ifNoneMatch)) {
68
+ await res.body?.cancel();
67
69
  c.res = new Response(null, {
68
70
  status: 304,
69
71
  statusText: "Not Modified",
@@ -1,5 +1,5 @@
1
- import { parseAccept } from "../../utils/accept.js";
2
1
  import { getCookie, setCookie } from "../../helper/cookie/index.js";
2
+ import { parseAccept } from "../../utils/accept.js";
3
3
  //#region src/middleware/language/language.ts
4
4
  const DEFAULT_OPTIONS = {
5
5
  order: [
@@ -31,6 +31,7 @@ const prettyJSON = (options) => {
31
31
  } catch {
32
32
  return;
33
33
  }
34
+ await c.res.body?.cancel();
34
35
  c.res = new Response(JSON.stringify(obj, null, options?.space ?? 2), c.res);
35
36
  c.res.headers.delete("Content-Length");
36
37
  }
@@ -74,6 +74,7 @@ const timing = (config) => {
74
74
  }
75
75
  };
76
76
  };
77
+ const quote = (s) => `"${s.replace(/[\\"]/g, "\\$&")}"`;
77
78
  /**
78
79
  * Set a metric for the timing middleware.
79
80
  *
@@ -96,11 +97,11 @@ const setMetric = (c, name, valueDescription, description, precision) => {
96
97
  return;
97
98
  }
98
99
  if (typeof valueDescription === "number") {
99
- const dur = valueDescription.toFixed(precision || 1);
100
- const metric = description ? `${name};dur=${dur};desc="${description}"` : `${name};dur=${dur}`;
100
+ const dur = valueDescription.toFixed(precision ?? 1);
101
+ const metric = description ? `${name};dur=${dur};desc=${quote(description)}` : `${name};dur=${dur}`;
101
102
  metrics.headers.push(metric);
102
103
  } else {
103
- const metric = valueDescription ? `${name};desc="${valueDescription}"` : `${name}`;
104
+ const metric = valueDescription ? `${name};desc=${quote(valueDescription)}` : `${name}`;
104
105
  metrics.headers.push(metric);
105
106
  }
106
107
  };
@@ -79,8 +79,8 @@ const parseSigned = async (cookie, secret, name) => {
79
79
  const _serialize = (name, value, opt = {}) => {
80
80
  if (!validCookieNameRegEx.test(name)) throw new Error("Invalid cookie name");
81
81
  let cookie = `${name}=${value}`;
82
- if (name.startsWith("__Secure-") && !opt.secure) throw new Error("__Secure- Cookie must have Secure attributes");
83
- if (name.startsWith("__Host-")) {
82
+ if (/^__secure-/i.test(name) && !opt.secure) throw new Error("__Secure- Cookie must have Secure attributes");
83
+ if (/^__host-/i.test(name)) {
84
84
  if (!opt.secure) throw new Error("__Host- Cookie must have Secure attributes");
85
85
  if (opt.path !== "/") throw new Error("__Host- Cookie must have Path attributes with \"/\"");
86
86
  if (opt.domain) throw new Error("__Host- Cookie must not have Domain attributes");
@@ -9,7 +9,7 @@ const getMimeType = (filename, mimes = baseMimes) => {
9
9
  return mimes[match[1].toLowerCase()];
10
10
  };
11
11
  const getExtension = (mimeType) => {
12
- const baseType = mimeType.split(";", 1)[0].trim();
12
+ const baseType = mimeType.split(";", 1)[0].trim().toLowerCase();
13
13
  for (const ext in baseMimes) {
14
14
  const stored = baseMimes[ext];
15
15
  if (stored === mimeType || stored.split(";", 1)[0].trim() === baseType) return ext;
@@ -161,7 +161,7 @@ const _getQueryParam = (url, key, multiple) => {
161
161
  const hashIndex = url.indexOf("#", 8);
162
162
  if (hashIndex !== -1) url = url.slice(0, hashIndex);
163
163
  let encoded;
164
- if (!multiple && key && key.indexOf("%") === -1 && key.indexOf("+") === -1) {
164
+ if (!multiple && key && !/[%+&=]/.test(key)) {
165
165
  const queryIndex = url.indexOf("?", 8);
166
166
  let keyIndex = queryIndex;
167
167
  if (keyIndex === -1) return;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.13.16",
3
+ "version": "4.13.17",
4
4
  "description": "Web framework built on Web Standards",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",
@@ -13,9 +13,10 @@ async function generalDecrypt(jwe, key, options) {
13
13
  throw new JWEInvalid("JWE Recipients missing or incorrect type");
14
14
  if (!recipients.length)
15
15
  throw new JWEInvalid("JWE Recipients has no members");
16
- let shared, sharedJwe, token;
16
+ const shared = prepareDecrypt(options);
17
+ let sharedJwe, token;
17
18
  try {
18
- shared = prepareDecrypt(options), sharedJwe = snapshotSharedJWE(jwe), token = shareJWE(sharedJwe);
19
+ sharedJwe = snapshotSharedJWE(jwe), token = shareJWE(sharedJwe);
19
20
  } catch {
20
21
  throw new JWEDecryptionFailed();
21
22
  }
@@ -5,7 +5,7 @@ function isCloudflareWorkers() {
5
5
  return typeof WebSocketPair < "u" || typeof navigator < "u" && navigator.userAgent === "Cloudflare-Workers" || typeof EdgeRuntime < "u" && EdgeRuntime === "vercel";
6
6
  }
7
7
  let USER_AGENT;
8
- (typeof navigator > "u" || !navigator.userAgent?.startsWith?.("Mozilla/5.0 ")) && (USER_AGENT = "jose/v6.2.15");
8
+ (typeof navigator > "u" || !navigator.userAgent?.startsWith?.("Mozilla/5.0 ")) && (USER_AGENT = "jose/v6.2.16");
9
9
  const customFetch = /* @__PURE__ */ Symbol();
10
10
  async function fetchJwks(url, headers, signal, fetchImpl = fetch) {
11
11
  const response = await fetchImpl(url, {
@@ -22,15 +22,9 @@ async function generalVerify(jws, key, options) {
22
22
  const signatureEntries = Array.from(signatures);
23
23
  if (!signatureEntries.every(isObject))
24
24
  throw new JWSInvalid("JWS Signatures missing or incorrect type");
25
- let shared;
26
- try {
27
- if (inputPayload === void 0)
28
- throw new Error();
29
- shared = prepareVerify(options);
30
- } catch {
25
+ if (inputPayload === void 0)
31
26
  throw new JWSSignatureVerificationFailed();
32
- }
33
- const payload = inputPayload instanceof Uint8Array ? new Uint8Array(inputPayload) : inputPayload, candidates = signatureEntries.map((signature) => snapshotSignature(signature, payload)).filter((candidate) => candidate !== void 0);
27
+ const shared = prepareVerify(options), payload = inputPayload instanceof Uint8Array ? new Uint8Array(inputPayload) : inputPayload, candidates = signatureEntries.map((signature) => snapshotSignature(signature, payload)).filter((candidate) => candidate !== void 0);
34
28
  let payloadEncodings = 0;
35
29
  for (const [, , payloadEncoding] of candidates)
36
30
  if (payloadEncodings |= payloadEncoding, payloadEncodings === 3)
@@ -1,7 +1,7 @@
1
1
  import { decrypt, generateCek } from "./content_encryption.js";
2
2
  import { decodeBase64url, encodeAsciiMember, parseJoseHeader, isDisjoint, isObject, validateCrit, validateAlgorithms, JWE_RECOGNIZED } from "./validate.js";
3
3
  import { JOSEAlgNotAllowed, JOSENotSupported, JWEInvalid } from "../util/errors.js";
4
- import { decryptKeyManagement } from "./key_management.js";
4
+ import { decryptKeyManagement, validateMaxPBES2Count } from "./key_management.js";
5
5
  import { decoder } from "./buffer_utils.js";
6
6
  import { prepareKey } from "./key.js";
7
7
  import { JWE, isJWECEKTransport, jweAlgorithm, jweEncryption } from "./jwe_algorithms.js";
@@ -69,12 +69,17 @@ function shareJWE(jwe) {
69
69
  ];
70
70
  }
71
71
  function prepareDecrypt(options) {
72
+ const keyManagementAlgorithms = options && validateAlgorithms("keyManagementAlgorithms", options.keyManagementAlgorithms), contentEncryptionAlgorithms = options && validateAlgorithms("contentEncryptionAlgorithms", options.contentEncryptionAlgorithms), { crit, maxPBES2Count, maxDecompressedLength } = options ?? {};
73
+ validateMaxPBES2Count(maxPBES2Count);
74
+ const decompressionLimit = maxDecompressedLength ?? 25e4;
75
+ if (decompressionLimit !== 0 && decompressionLimit !== 1 / 0 && (!Number.isSafeInteger(decompressionLimit) || decompressionLimit < 1))
76
+ throw new TypeError("maxDecompressedLength must be 0, a positive safe integer, or Infinity");
72
77
  return [
73
- options && validateAlgorithms("keyManagementAlgorithms", options.keyManagementAlgorithms),
74
- options && validateAlgorithms("contentEncryptionAlgorithms", options.contentEncryptionAlgorithms),
75
- options?.crit,
76
- options?.maxPBES2Count,
77
- options?.maxDecompressedLength
78
+ keyManagementAlgorithms,
79
+ contentEncryptionAlgorithms,
80
+ crit,
81
+ maxPBES2Count,
82
+ maxDecompressedLength
78
83
  ];
79
84
  }
80
85
  async function decryptJWE(jwe, shared, key, token = shareJWE(jwe)) {
@@ -145,8 +150,6 @@ async function decryptJWE(jwe, shared, key, token = shareJWE(jwe)) {
145
150
  const decompressionLimit = maxDecompressedLength ?? 25e4;
146
151
  if (decompressionLimit === 0)
147
152
  throw new JOSENotSupported('JWE "zip" (Compression Algorithm) Header Parameter is not supported.');
148
- if (decompressionLimit !== 1 / 0 && (!Number.isSafeInteger(decompressionLimit) || decompressionLimit < 1))
149
- throw new TypeError("maxDecompressedLength must be 0, a positive safe integer, or Infinity");
150
153
  plaintext = await decompress(plaintext, decompressionLimit).catch((cause) => {
151
154
  throw cause instanceof JWEInvalid ? cause : new JWEInvalid("Failed to decompress plaintext", { cause });
152
155
  });
@@ -111,7 +111,6 @@ async function decryptKeyManagement(entry, enc, key, encryptedKey, joseHeader, m
111
111
  case "PBKDF2": {
112
112
  if (typeof joseHeader.p2c != "number")
113
113
  throw new JWEInvalid('JOSE Header "p2c" (PBES2 Count) missing or invalid');
114
- validateMaxPBES2Count(maxPBES2Count);
115
114
  const p2cLimit = maxPBES2Count ?? 1e4;
116
115
  if (joseHeader.p2c > p2cLimit)
117
116
  throw new JWEInvalid('JOSE Header "p2c" (PBES2 Count) out is of acceptable bounds');
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jose",
3
- "version": "6.2.15",
3
+ "version": "6.2.16",
4
4
  "description": "JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes",
5
5
  "keywords": [
6
6
  "akp",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rho-workspace/rho",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "type": "module",
5
5
  "description": "Rho local workspace service, scoped browser shell and headless client",
6
6
  "license": "AGPL-3.0-only",
@@ -76,13 +76,14 @@
76
76
  "@rho-workspace/plugin-files": "file:vendor/rho-workspace-plugin-files-0.5.1.tgz",
77
77
  "@rho-workspace/plugin-r": "file:vendor/rho-workspace-plugin-r-0.4.2.tgz",
78
78
  "@rho-workspace/plugin-requirements": "file:vendor/rho-workspace-plugin-requirements-0.4.2.tgz",
79
- "@rho-workspace/plugin-tables": "file:vendor/rho-workspace-plugin-tables-0.5.0.tgz",
79
+ "@rho-workspace/plugin-tables": "file:vendor/rho-workspace-plugin-tables-0.5.2.tgz",
80
80
  "@rho-workspace/plugin-media": "file:vendor/rho-workspace-plugin-media-0.4.0.tgz",
81
81
  "@rho-workspace/plugin-charts": "file:vendor/rho-workspace-plugin-charts-0.4.0.tgz",
82
- "@rho-workspace/plugin-agent": "file:vendor/rho-workspace-plugin-agent-0.4.29.tgz",
82
+ "@rho-workspace/plugin-agent": "file:vendor/rho-workspace-plugin-agent-0.4.33.tgz",
83
83
  "@rho-workspace/plugin-annotations": "file:vendor/rho-workspace-plugin-annotations-0.5.2.tgz",
84
84
  "@rho-workspace/plugin-console": "file:vendor/rho-workspace-plugin-console-0.3.1.tgz",
85
- "@rho-workspace/plugin-kernel": "file:vendor/rho-workspace-plugin-kernel-0.5.5.tgz",
85
+ "@rho-workspace/plugin-kernel": "file:vendor/rho-workspace-plugin-kernel-0.5.13.tgz",
86
+ "@rho-workspace/plugin-figures": "file:vendor/rho-workspace-plugin-figures-0.5.1.tgz",
86
87
  "@rho-workspace/plugin-skills": "file:vendor/rho-workspace-plugin-skills-0.1.0.tgz"
87
88
  },
88
89
  "bundleDependencies": [
@@ -100,6 +101,7 @@
100
101
  "@rho-workspace/plugin-annotations",
101
102
  "@rho-workspace/plugin-console",
102
103
  "@rho-workspace/plugin-kernel",
104
+ "@rho-workspace/plugin-figures",
103
105
  "@rho-workspace/plugin-skills"
104
106
  ],
105
107
  "publishConfig": {
@@ -4,8 +4,8 @@
4
4
  "schemaVersion": 2,
5
5
  "shared": {
6
6
  "path": "operations/shared.json",
7
- "bytes": 75412,
8
- "sha256": "d71c814419bfab48fcc6fe8c60e498a9cf59c83725d88787e938396c8b12c9a8"
7
+ "bytes": 75434,
8
+ "sha256": "c1ef5858bc0662f02d42c19c8cefdabfc7c66a2944308d49991fa44ec2137442"
9
9
  },
10
10
  "operations": {
11
11
  "action.cancel": {
@@ -77,14 +77,14 @@
77
77
  "agent.sessions.list": {
78
78
  "summary": "agent.sessions.list",
79
79
  "path": "operations/agent.sessions.list.json",
80
- "bytes": 2202,
81
- "sha256": "43d0306205db0acba77d71280e8b5aa23a47cbed66c05c8710a39e6285fd5e3b"
80
+ "bytes": 3632,
81
+ "sha256": "0e9e07210fa6acd13d0805e12d9fe8aa87ae4a1c5cf4910e54045937de2f074a"
82
82
  },
83
83
  "agent.sessions.read": {
84
84
  "summary": "agent.sessions.read",
85
85
  "path": "operations/agent.sessions.read.json",
86
- "bytes": 6355,
87
- "sha256": "1804a39c7edaf0caaf328404936aab0cd4d3d9e1731d7d03a86cc57c642d9c10"
86
+ "bytes": 7745,
87
+ "sha256": "fea43a16a670bd36eb1fd7c616cc398c2a66bc881ee6b6690e014b2cd5c418ae"
88
88
  },
89
89
  "annotation.create": {
90
90
  "summary": "annotation.create",
@@ -167,8 +167,8 @@
167
167
  "capability.list": {
168
168
  "summary": "Read registered actions and components. Does not start R or a Core Host.",
169
169
  "path": "operations/capability.list.json",
170
- "bytes": 23255,
171
- "sha256": "8fcc56faff6e2c4102945d8a532c987dabbc69f1833371cf8c1f149dbec92dda"
170
+ "bytes": 35886,
171
+ "sha256": "a31c52e26ef96c4bcb730fcaf194043129f9f9f57dcecd0be3f54e2f83ebd051"
172
172
  },
173
173
  "capability.resolve": {
174
174
  "summary": "Fetch selected relevant Skills with complete owner contracts, whole objects only. Pages pin catalog/bundle/caller; knownRefs only reuse currently available immutable bodies.",
@@ -179,8 +179,14 @@
179
179
  "composition.apply": {
180
180
  "summary": "composition.apply",
181
181
  "path": "operations/composition.apply.json",
182
- "bytes": 47304,
183
- "sha256": "bb67f1d1ad49ae58809918ee5a4a2da63aa10c82884172a0bf353668753974ce"
182
+ "bytes": 47492,
183
+ "sha256": "7f7c106b6569c39551c28573f3a5b381f5efcbe6cf93f27f7d90c1750375cd9c"
184
+ },
185
+ "composition.delete": {
186
+ "summary": "Delete an empty Studio workspace layout only, never the project directory, documents, resources, conversations or running sessions. Requires its observed expectedVersion and a stable changeId. The same request returns its original receipt without deleting a recreated workspace. Nonempty, conversation and active-task layouts are refused. The deleted layout and its history remain readable with composition.read and recoverable with composition.undo; it is omitted from active workspace lists. Recreating it uses a conditional composition.apply replacement at its retained version.",
187
+ "path": "operations/composition.delete.json",
188
+ "bytes": 26137,
189
+ "sha256": "1e1b1a50ccdc2b2069e3157549bdd04809485a1fdc4d3fe76bef819948fa196a"
184
190
  },
185
191
  "composition.put": {
186
192
  "summary": "composition.put",
@@ -191,14 +197,14 @@
191
197
  "composition.read": {
192
198
  "summary": "composition.read",
193
199
  "path": "operations/composition.read.json",
194
- "bytes": 32911,
195
- "sha256": "ed2193fe748d87dd6c4be08e2cf01e14c4c14e98977f566dce304d41f72f48e6"
200
+ "bytes": 33131,
201
+ "sha256": "adce3928d6b297cdce3963650f2601f52f35444a5f54df375a005687c7f6b4b5"
196
202
  },
197
203
  "composition.undo": {
198
204
  "summary": "composition.undo",
199
205
  "path": "operations/composition.undo.json",
200
- "bytes": 25368,
201
- "sha256": "fadd401c6a5a98ea5c66755603bccd36353566875acf8a29fd7d75ec8cc2bc64"
206
+ "bytes": 25556,
207
+ "sha256": "7e4f918650943b44784616d154ed1f6a7f355870638a14d8efe7314a8bf30950"
202
208
  },
203
209
  "console.events": {
204
210
  "summary": "Who ran each Console command and when, newest first, for the timeline: the folder, how it ended and its first line. No output.",
@@ -242,17 +248,29 @@
242
248
  "bytes": 7719,
243
249
  "sha256": "f3ca05f37c9dc2d272abe2a2f8afbc6445aee8f3f086d7a88a15dbf95290cf3b"
244
250
  },
251
+ "conversation.agents.add": {
252
+ "summary": "Person at this machine only: add an ACP Agent for new conversations in every project, given its program (on PATH or a path) and arguments, such as [\"hermes\", \"acp\"]. Rho starts it once in this project to read what it offers, then removes that session and ends the process; no message is sent. It is kept only when it answered. Adding the same command again checks it again.",
253
+ "path": "operations/conversation.agents.add.json",
254
+ "bytes": 8835,
255
+ "sha256": "64268a3115d3efbee3770db5f76514588d7c367cad677485740489c7cfe94064"
256
+ },
257
+ "conversation.agents.remove": {
258
+ "summary": "Person at this machine only: remove an added ACP Agent from the Agents new conversations can use. Its conversations stay and continue with the command they started with.",
259
+ "path": "operations/conversation.agents.remove.json",
260
+ "bytes": 8524,
261
+ "sha256": "549e4457d67c5a231db7b9e161582d87bdb6e0296d0957eb000485642c56a751"
262
+ },
245
263
  "conversation.configure": {
246
264
  "summary": "Person at this machine only: change one setting the Agent offers (model, effort, mode…) for the next messages of a conversation started in Rho. An open session changes now; otherwise the choice is applied when the session next opens. Refused while a message is being answered.",
247
265
  "path": "operations/conversation.configure.json",
248
- "bytes": 20110,
249
- "sha256": "a92723b3e054d81050be0edb5531b2f4621d30c4d3b8712c91959355d3a33cf7"
266
+ "bytes": 20885,
267
+ "sha256": "8a745fb3600d7ac64fad3812d856f7b135a2d2c3ea2eca65d922cd6d48c1eba7"
250
268
  },
251
269
  "conversation.decide": {
252
270
  "summary": "Person at this machine only: say to use an answer, or that it needs changes and why. The decision holds for the file versions that message kept when it was given and says nothing of later versions. A new decision supersedes the one before; none is removed. Refused while the Agent is still answering.",
253
271
  "path": "operations/conversation.decide.json",
254
- "bytes": 33825,
255
- "sha256": "366b88fc2102cd7ea25aa753c5e8f17780a2d78269a4e152786a97b0a0c22dc6"
272
+ "bytes": 40542,
273
+ "sha256": "e6a6a3e853044170478db9947af86e31a814d4db32ce537e8eb1ceef014b6719"
256
274
  },
257
275
  "conversation.delete": {
258
276
  "summary": "Person at this machine only: delete Rho's record of a conversation in the trash. The Agent's own session files are not touched. Repeating the request that started it is then refused.",
@@ -263,68 +281,68 @@
263
281
  "conversation.list": {
264
282
  "summary": "Person at this machine only: list the conversations started in Rho in this project, or those in its trash, with each one's Agent, last model, choices and reported usage. Reading starts nothing.",
265
283
  "path": "operations/conversation.list.json",
266
- "bytes": 6767,
267
- "sha256": "44c0fcaaf3b0775db9d3f969218a0b9516ea4d55f79d6d9737c34be368bda7a1"
284
+ "bytes": 7600,
285
+ "sha256": "2e291ce118cab1c43436e1e5ed22a916923f0089696f32dfa5ead04c99be5ec0"
268
286
  },
269
287
  "conversation.permission": {
270
288
  "summary": "Person at this machine only: record an offered choice for a pending Agent permission request. The original request identity is retained; repeated identical choices do not respond twice.",
271
289
  "path": "operations/conversation.permission.json",
272
- "bytes": 33644,
273
- "sha256": "85bc65c9209d43a75b49542d10f5d82c2998307ef2f8b3727a94ec6ae1bffc56"
290
+ "bytes": 40361,
291
+ "sha256": "10fc1163eaa07d65e62754b439a340b96558b1751d45920cfdab49d24e280c9d"
274
292
  },
275
293
  "conversation.read": {
276
294
  "summary": "Read a conversation started in Rho: the person's messages, the Agent's visible text and tool steps, and how each message ended. Reading starts and resumes nothing.",
277
295
  "path": "operations/conversation.read.json",
278
- "bytes": 48752,
279
- "sha256": "0ae9de68afa2da8419f5d723eca3f2ea8db9d1e0936a8dd1e92284d8bcc27805"
296
+ "bytes": 55861,
297
+ "sha256": "aaefd15ff9f411ef2283f23f3cdcd7d86651fe926f3dfad26ffd57a7dc3aae2e"
280
298
  },
281
299
  "conversation.restore": {
282
300
  "summary": "Person at this machine only: return a conversation from the trash to the project's conversations, within the project's conversation limit.",
283
301
  "path": "operations/conversation.restore.json",
284
- "bytes": 6261,
285
- "sha256": "282449bc3f84125f2e6d37ec391596aa03e666b1fac06774454cd830aa9d69e4"
302
+ "bytes": 7036,
303
+ "sha256": "184780ef30bc8d0a835c94b7617bac9abc1da220e8fc4e1fbaae6a72188e4238"
286
304
  },
287
305
  "conversation.send": {
288
306
  "summary": "Person at this machine only: send the next message to a conversation started in Rho. A continuationOf links a new message to the latest confirmed Agent turn-limit stop; the original request is not resent. Refused while the previous message is being answered. A repeated changeId with the same input returns the original message.",
289
307
  "path": "operations/conversation.send.json",
290
- "bytes": 33931,
291
- "sha256": "031bbfe0e76b4e932969743953f7664a283b85b75dc3fe55fca6af45ac4d1e4c"
308
+ "bytes": 42392,
309
+ "sha256": "b9e3b7ee748f5b70d31e72e008cf6c354c181bedf2a9811a0cbcb45e411dcd97"
292
310
  },
293
311
  "conversation.settings.check": {
294
312
  "summary": "Person at this machine only: start the chosen Agent in this project to read the settings it offers, then remove that session and end the process. No message is sent; one check per Agent runs at a time.",
295
313
  "path": "operations/conversation.settings.check.json",
296
- "bytes": 14555,
297
- "sha256": "0aba6e7c8dc96f20aa20db2bea94238d370774450c70a19cabdec344a2eda88e"
314
+ "bytes": 8584,
315
+ "sha256": "beef9711442ebaf076befbb402fcd288a9156d995073fd4378ce48e13cbe1383"
298
316
  },
299
317
  "conversation.settings.read": {
300
318
  "summary": "Person at this machine only: read the Agent and settings chosen for new conversations and what each Agent last offered. Reading starts nothing.",
301
319
  "path": "operations/conversation.settings.read.json",
302
- "bytes": 14360,
303
- "sha256": "04d5f1cf71ee88946dc0bbe7bef7d3864e6cc6e705304b98e19ad2351c999ca7"
320
+ "bytes": 8376,
321
+ "sha256": "7491b0cf930c244f0573d57ce727bbb552b4b03d117752441e49b44398c5e4c2"
304
322
  },
305
323
  "conversation.settings.update": {
306
324
  "summary": "Person at this machine only: choose the Agent and its settings for new conversations, among the values that Agent last offered, and whether a model describes the files a message writes. A stale expectedVersion is refused.",
307
325
  "path": "operations/conversation.settings.update.json",
308
- "bytes": 16639,
309
- "sha256": "20612281dff10b3a2f121be5a060f5e996dd7e2ccf5f2b06406bae87a85bc1ed"
326
+ "bytes": 9742,
327
+ "sha256": "91282a4971253c0ebdceb72561e5df9a8524ccac990de7aa24eed688254e0970"
310
328
  },
311
329
  "conversation.start": {
312
- "summary": "Person at this machine only: start a conversation with the selected Claude Code or Codex Agent in this project. Rho selects the Agent plugin backend, attaches this project's MCP grant and records the message before sending it. Without backend or config, the person's saved Agent and settings are used and recorded with the conversation. A repeated changeId with the same text returns the original conversation and starts nothing.",
330
+ "summary": "Person at this machine only: start a conversation with the selected Claude Code or Codex Agent in this project. Rho selects the Agent plugin backend, attaches this project's MCP grant and records the message before sending it. Without backend or config, the person's saved Agent and settings are used and recorded with the conversation. A repeated changeId with the same text returns the original conversation and starts nothing. With continue, the message continues an Agent session listed by agent.sessions.list (one started in a terminal, an editor or the Agent's own app) through that same session, or through a copy of it with copy; a session another live window holds open is refused unless copied.",
313
331
  "path": "operations/conversation.start.json",
314
- "bytes": 34318,
315
- "sha256": "b691ed1d000206bbaa65289e7e255d53fc5552ace1ad180b4f4d8cf2020bbb96"
332
+ "bytes": 43418,
333
+ "sha256": "51c27c4a2e7890c879b7ed292b275048d81849afe7771ff19d639d4b2d1ae857"
316
334
  },
317
335
  "conversation.stop": {
318
336
  "summary": "Person at this machine only: ask the original Agent to stop answering one message. ACP cancellation is confirmed by the original prompt response; a lost connection keeps the outcome unknown. Legacy CLI conversations confirm process exit. Steps already taken stay done.",
319
337
  "path": "operations/conversation.stop.json",
320
- "bytes": 33471,
321
- "sha256": "0755e7ba9a7c1a516d0158f0f53656f1635970ab767b0455fe786fdb1535c441"
338
+ "bytes": 40188,
339
+ "sha256": "389d3601657c361ab37144cacfbd772158e439a09c4478bba69a77c1e41d2242"
322
340
  },
323
341
  "conversation.trash": {
324
342
  "summary": "Person at this machine only: move a conversation that is not being answered to the trash. It is kept whole and not continued until restored; an idle connection to its Agent ends.",
325
343
  "path": "operations/conversation.trash.json",
326
- "bytes": 6299,
327
- "sha256": "8ecc3aaf8da2cc307b65e7015a17ae1ec096451859a06721d884e1d519cb4540"
344
+ "bytes": 7074,
345
+ "sha256": "643d239b90f97bc69d5f0884b69f51c547f1393ae0cff4a9b9fcf2d9e9763051"
328
346
  },
329
347
  "data.compare": {
330
348
  "summary": "Join two explicit table versions using declared keys, namespaces, fields and join policy. Scientific comparability remains the project responsibility.",
@@ -431,20 +449,20 @@
431
449
  "extension.describe": {
432
450
  "summary": "Read an installed third-party package manifest, operation input schemas, required Rho methods, Skills and views. Read its Skill with extension.content before use. Disabled packages cannot run.",
433
451
  "path": "operations/extension.describe.json",
434
- "bytes": 4684,
435
- "sha256": "441616d6e634daa1ce2d058f6d0b0bd7ccd494de33f01a3dae3d6c344dc6f1a9"
452
+ "bytes": 5597,
453
+ "sha256": "570477ac19be996a537ce69da4b5ed534a69960d9a7d161d38f6d45118ca2067"
436
454
  },
437
455
  "extension.install": {
438
456
  "summary": "Local person/operator: install a trusted prebuilt npm package, local folder, tarball, or Git source. Lifecycle scripts are disabled. Replacement stages and checks the new package before switching; use replace and expectedDigest for updates.",
439
457
  "path": "operations/extension.install.json",
440
- "bytes": 4803,
441
- "sha256": "862db9660b7c6d0ddfe53aa2c3e1254c0d4a4a717f23c6b820c3248d916b7ce9"
458
+ "bytes": 6286,
459
+ "sha256": "2bb1282e6afcfae985379bbdb8cfdda841ec8d13add57e6084534c07fca7e295"
442
460
  },
443
461
  "extension.list": {
444
- "summary": "List independently installed third-party packages and their enabled state, source and immutable digest. Reads start no plugin or runtime. Use extension.describe to discover operation schemas and Skills.",
462
+ "summary": "List installed third-party packages, the bundled directory and retained remote market indexes. Listing makes no network request and starts no plugin or runtime. Use extension.describe for installed operation schemas and Skills.",
445
463
  "path": "operations/extension.list.json",
446
- "bytes": 2933,
447
- "sha256": "4af06a8a7c11dbed53a9d9804d215708d7e6b6c0edacdf1bf2817a3daf24f86f"
464
+ "bytes": 7672,
465
+ "sha256": "68e5ef4bbdaeebffa00dc6879f438a95b49980cb6bb157dadba02c24398acbeb"
448
466
  },
449
467
  "extension.manage": {
450
468
  "summary": "Local person/operator: enable, disable or remove an installed third-party package at the expected digest. Existing native tasks, R sessions, project files and retained receipts are preserved.",
@@ -452,6 +470,12 @@
452
470
  "bytes": 1207,
453
471
  "sha256": "90a83550840d2d33d3d0c7e5db0dcd09de4752b0b829f65a0cac2f39dbdf5a07"
454
472
  },
473
+ "extension.market.change": {
474
+ "summary": "Local person/operator: add an HTTPS plugin market index, refresh it explicitly, or remove its source. Failed refresh retains the last valid index; removal preserves installed plugins. Listing never refreshes a source.",
475
+ "path": "operations/extension.market.change.json",
476
+ "bytes": 5453,
477
+ "sha256": "b6f09b901587d5d028370c3f26ce98ba0fae13d91d60fd09ddc9716db799a9f7"
478
+ },
455
479
  "extension.read": {
456
480
  "summary": "Observe an original plugin invocation, including pending or unknown outcomes. Never reruns code. Only its original caller can read it.",
457
481
  "path": "operations/extension.read.json",
@@ -476,6 +500,18 @@
476
500
  "bytes": 9488,
477
501
  "sha256": "4285b03a126e4f7ebd09748e557fc944700d43c804d870142cd84c93653131c1"
478
502
  },
503
+ "figure.read": {
504
+ "summary": "What a plot a cell drew shows: its layers, mappings, panels and data, the rows behind marks, and the marks people and Agents selected.",
505
+ "path": "operations/figure.read.json",
506
+ "bytes": 6256,
507
+ "sha256": "a89bca2a797588561949356f05931726b57dc84a796fbc1f249b84edf405f582"
508
+ },
509
+ "figure.select": {
510
+ "summary": "Keeps a set of a figure's marks with a note, shown highlighted in the plot; the plot and its data do not change.",
511
+ "path": "operations/figure.select.json",
512
+ "bytes": 3633,
513
+ "sha256": "a5f2648ad5beeaa71dd39158405d08229fa3e17e78eac6877c5649d9524525d7"
514
+ },
479
515
  "interaction.selection.read": {
480
516
  "summary": "interaction.selection.read",
481
517
  "path": "operations/interaction.selection.read.json",
@@ -503,8 +539,8 @@
503
539
  "kernel.interrupt": {
504
540
  "summary": "Interrupt one cell: a running cell stops and its session and values stay; a waiting cell is not run. A cell that has ended is returned unchanged.",
505
541
  "path": "operations/kernel.interrupt.json",
506
- "bytes": 6360,
507
- "sha256": "79636eab4cc83f34976c3a4097be5ee13777b17765e7955d55807a800eab287b"
542
+ "bytes": 9955,
543
+ "sha256": "3e03293fe6aaaf8e73d653e16cecf6f4f5b57d787631714f5baa93f7c6c6ac35"
508
544
  },
509
545
  "kernel.place.check": {
510
546
  "summary": "Connect to a place on a server and report its system, machine, the folder after its setup lines, and R and Python there. Runs the place's setup lines; starts no session.",
@@ -545,14 +581,14 @@
545
581
  "kernel.read": {
546
582
  "summary": "The live sessions and their cells, oldest cell first: code, purpose, who ran it, what it printed, its plots and how it ended, and each session's variables. Reading never starts a session.",
547
583
  "path": "operations/kernel.read.json",
548
- "bytes": 13302,
549
- "sha256": "cfbc1a18a6c1414d45bbc9ba3baf7ddc009baad91f15194031f5de902f60d29f"
584
+ "bytes": 17135,
585
+ "sha256": "944cc4dd59cce979338173b1c6f13c8d28dca5889cd28f4d28f5250f1a9fa141"
550
586
  },
551
587
  "kernel.run": {
552
588
  "summary": "Run a cell of R or Python in the project's live session of that language, which the Agent and the person share: what one cell defines stays for the next. Starts the session when none is live, on this machine or at a place on one of the person's servers (place, or where kernel.places says that language runs next). interpreter names the program a session on this machine starts with, in a folder of the project such as .venv/bin/python; the project keeps it for that language's later sessions, and each cell records the program and version that ran it. The same changeId from the same caller returns the same cell and never runs it twice. waitMs waits for the cell to end.",
553
589
  "path": "operations/kernel.run.json",
554
- "bytes": 13162,
555
- "sha256": "f6a48db022b54b204f5c685fdb16737caf6dfa973cbd5184cbbb877a4032bbb5"
590
+ "bytes": 16757,
591
+ "sha256": "728230e62d3b4b2c279f626cb734dec203b4f2043d00e4bae8144080ba7978df"
556
592
  },
557
593
  "kernel.server.skill": {
558
594
  "summary": "One skill bound to a server, as its file reads now: how that server is used. Read it before naming a place there or running work on it.",
@@ -587,8 +623,8 @@
587
623
  "observation.snapshot": {
588
624
  "summary": "observation.snapshot",
589
625
  "path": "operations/observation.snapshot.json",
590
- "bytes": 165030,
591
- "sha256": "ee71c0bf7b912ad38bbbfc3ad5a797f1306f1eb821cdc30819d24b5d86e0867d"
626
+ "bytes": 180932,
627
+ "sha256": "0772088169eaa4421be046b0bc783ceb2e1996e7fe9d9109bd6667c25f7c4bca"
592
628
  },
593
629
  "project.create": {
594
630
  "summary": "project.create",
@@ -629,8 +665,8 @@
629
665
  "project.openFile": {
630
666
  "summary": "Open one text file from the selected project as a document and place it in the person's own layout in one conditional step, so a person can see and edit their own source files without an Agent. Accepts a project-relative path or the @<sourceId>/<path> reference the listing returns; it executes nothing.",
631
667
  "path": "operations/project.openFile.json",
632
- "bytes": 39369,
633
- "sha256": "f995dc4e4355fa368f65933486be1a8b4830aa39e95578be0ec5fa797ebc77ec"
668
+ "bytes": 39589,
669
+ "sha256": "045659b998a532f8721415f10559695e50c8e65bcd891bc213fda75f1076c586"
634
670
  },
635
671
  "project.pick": {
636
672
  "summary": "project.pick",
@@ -737,8 +773,14 @@
737
773
  "session.grant": {
738
774
  "summary": "session.grant",
739
775
  "path": "operations/session.grant.json",
740
- "bytes": 5059,
741
- "sha256": "d5d0e15b50349fbec4affa99ceb1b98c79a6dbdce048e1305f8cd8ad31a3fdd2"
776
+ "bytes": 5188,
777
+ "sha256": "2e23b33da965d9085eddabde5a22e5d25b3eb2c90adb438905b4616e3f36559b"
778
+ },
779
+ "session.instructions": {
780
+ "summary": "Person at this machine or operator only: read a prompt for the person's own MCP client to connect itself to this existing project. Returns local launcher paths, never credential contents. Reading or copying grants no access, edits no client configuration and starts no runtime.",
781
+ "path": "operations/session.instructions.json",
782
+ "bytes": 1057,
783
+ "sha256": "acc5dba3651bdd6db317d7a3062fd0d7f3dff3e1514d6d51c00a017c3d050181"
742
784
  },
743
785
  "skill.list": {
744
786
  "summary": "List the application and enabled provider Skills shipped in the selected package. Skills guide discovery but do not grant authorization.",
@@ -809,8 +851,8 @@
809
851
  "view.close": {
810
852
  "summary": "view.close",
811
853
  "path": "operations/view.close.json",
812
- "bytes": 33232,
813
- "sha256": "55c3de5d21493a691340739f7786ee4d111f74fa3a814235681a92d65a904082"
854
+ "bytes": 33452,
855
+ "sha256": "50be16f1f9f36920447a99c71dbbfc143726aa0edca47fe537954c163dd586ef"
814
856
  },
815
857
  "view.observations.read": {
816
858
  "summary": "view.observations.read",
@@ -827,8 +869,8 @@
827
869
  "view.protection.set": {
828
870
  "summary": "view.protection.set",
829
871
  "path": "operations/view.protection.set.json",
830
- "bytes": 25562,
831
- "sha256": "d8a8168a41d40c7294f57170986cdb6c138dfdd134f910d6771d7e82b7da0ed9"
872
+ "bytes": 25750,
873
+ "sha256": "46b70dca9e4a11f430f8c809aa70f982ba7bc387139c8668d24068b893089c75"
832
874
  },
833
875
  "workspace.enhance": {
834
876
  "summary": "Assigned presenter only: conditional display emphasis/title/plain Agent note using exact current generation, witness and observation. Does not modify business resources, feedback or protection.",