@rho-workspace/rho 0.5.5 → 0.5.6

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 (106) hide show
  1. package/dist/agent-connect.d.ts +8 -0
  2. package/dist/agent-connect.js +15 -0
  3. package/dist/browser-access.js +1 -1
  4. package/dist/cli.js +38 -8
  5. package/dist/contract.generated.d.ts +148 -5
  6. package/dist/contract.generated.js +1 -1
  7. package/dist/contracts/owners.generated.js +107 -12
  8. package/dist/conversations.d.ts +157 -4
  9. package/dist/conversations.js +69 -6
  10. package/dist/discovery.js +1 -1
  11. package/dist/protocol.d.ts +1 -0
  12. package/dist/protocol.js +12 -5
  13. package/dist/server.d.ts +2 -10
  14. package/dist/server.js +71 -8
  15. package/dist/web/.vite/manifest.json +61 -61
  16. package/dist/web/assets/{choices-b0XhrGQV.js → choices-D-YfnFP6.js} +1 -1
  17. package/dist/web/assets/{console-BSjLGe0T.js → console-Trqc0swD.js} +1 -1
  18. package/dist/web/assets/{dist-Buk0lwzI.js → dist-DZmszrjG.js} +1 -1
  19. package/dist/web/assets/{dist-Cw8hRIlT.js → dist-DpIHRk3B.js} +1 -1
  20. package/dist/web/assets/{dist-foH9IKc6.js → dist-eMx6b8N1.js} +1 -1
  21. package/dist/web/assets/{dist-Tzoe_zm-.js → dist-pF902jHA.js} +1 -1
  22. package/dist/web/assets/{explore-in-BVUy3ZW_.js → explore-in-BCHqjJ7B.js} +1 -1
  23. package/dist/web/assets/{graph-1OdIJ9l7.js → graph-lENgfQNH.js} +1 -1
  24. package/dist/web/assets/index-B3_OVy91.css +1 -0
  25. package/dist/web/assets/{index-CxmItXqa.js → index-BpL_Kl_s.js} +84 -83
  26. package/dist/web/assets/{notes-meaning-pVbbQUGP.js → notes-meaning-DcVGUBBY.js} +1 -1
  27. package/dist/web/assets/{overview-B9UtVJ32.js → overview-CDnVKlOt.js} +3 -3
  28. package/dist/web/assets/{preview-CksD_5KS.js → preview-BEC1E9MK.js} +1 -1
  29. package/dist/web/assets/{review-CMxQlQ-C.js → review-DYP0aCXb.js} +1 -1
  30. package/dist/web/assets/{skills-BFNSyrnD.js → skills-1ec0Z-jx.js} +1 -1
  31. package/dist/web/assets/{skills-work-BGPSnF_I.js → skills-work-DNexV4OJ.js} +1 -1
  32. package/dist/web/assets/{studio-process-CsRoTHOh.js → studio-process-EYQgikxq.js} +1 -1
  33. package/dist/web/assets/{timeline-events-BbuuFWHV.js → timeline-events-Chj2Gbx7.js} +1 -1
  34. package/dist/web/assets/{work-turns-BvJlIMmA.js → work-turns-CT9RVcWY.js} +1 -1
  35. package/dist/web/assets/{workspace-CWlkjLNx.js → workspace-COmCbGV3.js} +1 -1
  36. package/dist/web/composition.json +58 -58
  37. package/dist/web/index.html +2 -2
  38. package/dist/web/renderer.json +1 -1
  39. package/docs/FRONTEND.md +26 -18
  40. package/docs/HEADLESS.md +37 -27
  41. package/node_modules/@rho-workspace/plugin-agent/README.md +29 -0
  42. package/node_modules/@rho-workspace/plugin-agent/dist/acp-command.d.ts +1 -0
  43. package/node_modules/@rho-workspace/plugin-agent/dist/acp-command.js +9 -1
  44. package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.d.ts +1 -0
  45. package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.js +10 -0
  46. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.js +10 -5
  47. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.d.ts +12 -1
  48. package/node_modules/@rho-workspace/plugin-agent/dist/native-sessions.d.ts +70 -0
  49. package/node_modules/@rho-workspace/plugin-agent/dist/native-sessions.js +538 -0
  50. package/node_modules/@rho-workspace/plugin-agent/package.json +2 -1
  51. package/node_modules/hono/dist/adapter/aws-lambda/handler.js +1 -1
  52. package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +1 -1
  53. package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
  54. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  55. package/node_modules/hono/dist/cjs/client/fetch-result-please.js +1 -1
  56. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +2 -1
  57. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +5 -3
  58. package/node_modules/hono/dist/cjs/jsx/base.js +49 -30
  59. package/node_modules/hono/dist/cjs/jsx/components.js +2 -2
  60. package/node_modules/hono/dist/cjs/jsx/constants.js +2 -0
  61. package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +13 -17
  62. package/node_modules/hono/dist/cjs/middleware/etag/index.js +3 -1
  63. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +1 -0
  64. package/node_modules/hono/dist/cjs/middleware/timing/timing.js +4 -3
  65. package/node_modules/hono/dist/cjs/utils/cookie.js +2 -2
  66. package/node_modules/hono/dist/cjs/utils/mime.js +1 -1
  67. package/node_modules/hono/dist/cjs/utils/url.js +1 -1
  68. package/node_modules/hono/dist/client/fetch-result-please.js +1 -1
  69. package/node_modules/hono/dist/helper/accepts/accepts.js +2 -1
  70. package/node_modules/hono/dist/helper/ssg/ssg.js +5 -3
  71. package/node_modules/hono/dist/jsx/base.js +49 -32
  72. package/node_modules/hono/dist/jsx/components.js +2 -2
  73. package/node_modules/hono/dist/jsx/constants.js +2 -1
  74. package/node_modules/hono/dist/jsx/jsx-runtime.js +15 -19
  75. package/node_modules/hono/dist/middleware/etag/index.js +3 -1
  76. package/node_modules/hono/dist/middleware/language/language.js +1 -1
  77. package/node_modules/hono/dist/middleware/pretty-json/index.js +1 -0
  78. package/node_modules/hono/dist/middleware/timing/timing.js +4 -3
  79. package/node_modules/hono/dist/utils/cookie.js +2 -2
  80. package/node_modules/hono/dist/utils/mime.js +1 -1
  81. package/node_modules/hono/dist/utils/url.js +1 -1
  82. package/node_modules/hono/package.json +1 -1
  83. package/package.json +2 -2
  84. package/protocol/index.json +39 -33
  85. package/protocol/operations/agent.sessions.list.json +49 -3
  86. package/protocol/operations/agent.sessions.read.json +53 -4
  87. package/protocol/operations/conversation.configure.json +29 -0
  88. package/protocol/operations/conversation.decide.json +29 -0
  89. package/protocol/operations/conversation.list.json +29 -0
  90. package/protocol/operations/conversation.permission.json +29 -0
  91. package/protocol/operations/conversation.read.json +29 -0
  92. package/protocol/operations/conversation.restore.json +29 -0
  93. package/protocol/operations/conversation.send.json +29 -0
  94. package/protocol/operations/conversation.settings.check.json +92 -0
  95. package/protocol/operations/conversation.settings.read.json +92 -0
  96. package/protocol/operations/conversation.settings.update.json +92 -0
  97. package/protocol/operations/conversation.start.json +46 -1
  98. package/protocol/operations/conversation.stop.json +29 -0
  99. package/protocol/operations/conversation.trash.json +29 -0
  100. package/protocol/operations/observation.snapshot.json +29 -0
  101. package/protocol/operations/session.instructions.json +43 -0
  102. package/vendor/composition.json +74 -74
  103. package/vendor/rho-workspace-plugin-agent-0.4.30.tgz +0 -0
  104. package/web/theme.css +12 -0
  105. package/dist/web/assets/index-CsC3sTRq.css +0 -1
  106. package/vendor/rho-workspace-plugin-agent-0.4.29.tgz +0 -0
@@ -12,6 +12,14 @@ export declare const connectLimits: {
12
12
  };
13
13
  export declare function mcpName(root: string): string;
14
14
  export declare function mcpCommand(connectionFile: string): string[];
15
+ export declare function connectionInstructions(project: {
16
+ id: string;
17
+ root: string;
18
+ }, stateDirectory: string): {
19
+ request: string;
20
+ prompt: string;
21
+ command: string[];
22
+ };
15
23
  export declare function addToAgent(agent: OutsideAgent, binary: string, root: string, name: string, command: string[], limits?: {
16
24
  timeoutMs: number;
17
25
  outputBytes: number;
@@ -13,6 +13,21 @@ export function mcpName(root) {
13
13
  export function mcpCommand(connectionFile) {
14
14
  return [process.execPath, fileURLToPath(new URL('./cli.js', import.meta.url)), '--mcp', connectionFile];
15
15
  }
16
+ // Paths are data in an argv array, never an interpolated shell command. Reading these
17
+ // instructions starts nothing, grants no access and includes no credential bytes.
18
+ export function connectionInstructions(project, stateDirectory) {
19
+ const command = [process.execPath, fileURLToPath(new URL('./cli.js', import.meta.url)), '--grant', path.join(stateDirectory, 'connection.json'), '--project-id', project.id];
20
+ const request = `Connect yourself to my existing Rho project ${JSON.stringify(path.basename(project.root))} so we can work on it together.`;
21
+ const prompt = [request, '',
22
+ `Project folder: ${JSON.stringify(project.root)}. Project ID: ${project.id}. Rho is already running on this machine.`,
23
+ 'Configure your own client using its supported MCP setup mechanism; inspect your own help or documentation if needed. Keep unrelated configuration, models and credentials intact. Use private local configuration, scoped to this project where supported, and keep connection settings out of version-controlled files. If you cannot run a local stdio MCP server, explain that limitation.',
24
+ 'Run this program and argument array, appending --session and a stable name identifying your own Agent (1–128 characters from A–Z, a–z, 0–9, dot, underscore, colon, @ or hyphen). Reuse that name when retrying:',
25
+ JSON.stringify(command),
26
+ 'Parse the JSON reply. Register a stdio MCP server using mcp.name, mcp.command and mcp.args exactly as returned. The connection files contain credentials: do not print their contents or put them in the project. Do not start another Rho service.',
27
+ 'Reload your MCP tools if supported, or tell me to open a new session in the project folder. Then call rho_index through your configured client tools and verify scopeHint.projectId matches the project ID above. A direct protocol probe is useful diagnostics but does not prove your client loaded its tools. Report configuration and a successful tool call separately; do not claim connected before the call succeeds. If configuration or verification fails, report the actual error and continue from the same connection.',
28
+ ].join('\n');
29
+ return { request, prompt, command };
30
+ }
16
31
  function run(binary, args, cwd, limits) {
17
32
  return new Promise((resolve, reject) => {
18
33
  const child = spawn(binary, args, { cwd, env: process.env, stdio: ['ignore', 'pipe', 'pipe'] });
@@ -37,7 +37,7 @@ export const browserMethods = ['protocol.describe', 'protocol.validate', 'projec
37
37
  // Only the person at this machine talks to a conversation Rho starts: it runs their own Claude
38
38
  // Code with their model credentials. Only they add Rho to their own Agent's configuration. A
39
39
  // narrower, expiring link never receives these.
40
- export const conversationMethods = ['agent.sessions.list', 'agent.sessions.read', 'session.connect', 'conversation.start', 'conversation.send', 'conversation.stop', 'conversation.decide', 'conversation.read', 'conversation.list', 'conversation.trash', 'conversation.restore', 'conversation.delete', 'conversation.permission', 'conversation.configure', 'conversation.settings.read', 'conversation.settings.update', 'conversation.settings.check', 'project.work.read', 'evidence.preview', 'evidence.export'];
40
+ export const conversationMethods = ['agent.sessions.list', 'agent.sessions.read', 'session.instructions', 'session.connect', 'conversation.start', 'conversation.send', 'conversation.stop', 'conversation.decide', 'conversation.read', 'conversation.list', 'conversation.trash', 'conversation.restore', 'conversation.delete', 'conversation.permission', 'conversation.configure', 'conversation.settings.read', 'conversation.settings.update', 'conversation.settings.check', 'project.work.read', 'evidence.preview', 'evidence.export'];
41
41
  // The person at this machine. A tab this service served is authorized by the request itself:
42
42
  // same origin, loopback only, no link, no code and no expiry. `--pair` stays an explicit,
43
43
  // narrower grant for a shared or subfolder-scoped tab.
package/dist/cli.js CHANGED
@@ -2,6 +2,8 @@
2
2
  import path from 'node:path';
3
3
  import { parseArgs } from 'node:util';
4
4
  import * as fs from 'node:fs/promises';
5
+ import { constants as fsConstants } from 'node:fs';
6
+ import os from 'node:os';
5
7
  import { spawn } from 'node:child_process';
6
8
  // A widened link is optional: the fragment carries a one-time code, which no request or Referer
7
9
  // sends and which the page redeems and removes. Opening the plain url needs no code at all.
@@ -43,10 +45,11 @@ Start Rho:
43
45
  rho --root PROJECTS_DIRECTORY --state-dir SERVICE_STATE [--core ABSOLUTE_CORE_BINARY] [--rscript ABSOLUTE_RSCRIPT] [--python PYTHON] [--ssh SSH] [--serverctl SERVERCTL] [--claude CLAUDE_CODE_BINARY] [--codex CODEX_BINARY] [--agent-backend claude-acp|codex-acp|claude-cli|acp] [--acp-command JSON_ARGV] [--port PORT] [--limits JSON_FILE] [--plugins documents,files,...] [--example on|off] [--open]
44
46
  A narrower browser link (optional):
45
47
  rho --pair PRIVATE_CONNECTION_FILE [--root PROJECTS_RELATIVE_DIRECTORY] [--open]
46
- Add Rho to your own Claude Code or Codex for one project, as the project page's button does:
48
+ Add Rho to your own Claude Code or Codex for one project:
47
49
  rho --grant PRIVATE_CONNECTION_FILE --project PROJECTS_RELATIVE_DIRECTORY --agent claude-code|codex
48
- Give an Agent access to one project, and the command that adds it to Claude Code:
50
+ Give any MCP Agent access to one project and print its stdio MCP configuration:
49
51
  rho --grant PRIVATE_CONNECTION_FILE --project PROJECTS_RELATIVE_DIRECTORY [--session NAME]
52
+ rho --grant PRIVATE_CONNECTION_FILE --project-id EXISTING_PROJECT_ID --session NAME
50
53
  Serve that access to the Agent over MCP (stdio):
51
54
  rho --mcp AGENT_CONNECTION_FILE
52
55
  Observe an external ACP client (use this as its agent command):
@@ -60,8 +63,24 @@ narrower, expiring link for one folder.
60
63
  PRIVATE_CONNECTION_FILE is the connectionFile the running service printed; it and every
61
64
  connection file are credentials.
62
65
  `;
66
+ // DeepSeek Harness speaks ACP through its `acp` profile (`dsh acp`). It is used only when both the
67
+ // launcher and that profile are on this computer; nothing is started to find them.
68
+ async function harnessAcp() {
69
+ const home = process.env.DSH_HOME || path.join(os.homedir(), '.dsh');
70
+ const profile = await fs.stat(path.join(home, 'profiles', 'acp', 'package.json')).then(s => s.isFile(), () => false);
71
+ if (!profile)
72
+ return undefined;
73
+ const names = process.platform === 'win32' ? ['dsh.cmd', 'dsh.exe', 'dsh'] : ['dsh'];
74
+ for (const dir of (process.env.PATH ?? '').split(path.delimiter).filter(Boolean))
75
+ for (const name of names) {
76
+ const file = path.join(dir, name);
77
+ if (await fs.access(file, fsConstants.X_OK).then(() => true, () => false))
78
+ return { file, args: ['acp'] };
79
+ }
80
+ return undefined;
81
+ }
63
82
  const options = { example: { type: 'string' }, 'verify-evidence': { type: 'string' }, acp: { type: 'string' }, 'acp-agent': { type: 'string' }, root: { type: 'string' }, 'state-dir': { type: 'string' }, core: { type: 'string' }, rscript: { type: 'string' }, python: { type: 'string' }, ssh: { type: 'string' }, serverctl: { type: 'string' }, claude: { type: 'string' }, codex: { type: 'string' }, 'agent-backend': { type: 'string' }, 'acp-command': { type: 'string' }, port: { type: 'string' }, limits: { type: 'string' }, plugins: { type: 'string' }, pair: { type: 'string' }, open: { type: 'boolean' },
64
- grant: { type: 'string' }, project: { type: 'string' }, session: { type: 'string' }, agent: { type: 'string' }, mcp: { type: 'string' }, help: { type: 'boolean', short: 'h' } };
83
+ grant: { type: 'string' }, project: { type: 'string' }, 'project-id': { type: 'string' }, session: { type: 'string' }, agent: { type: 'string' }, mcp: { type: 'string' }, help: { type: 'boolean', short: 'h' } };
65
84
  // A command that is refused says why and what to do. A service that is not running is the
66
85
  // common case for --grant and --pair; anything without a known reason keeps its stack.
67
86
  function refuse(error, url) {
@@ -126,8 +145,8 @@ else {
126
145
  // Access comes from whoever runs Rho: the operator's connection grants one project to one
127
146
  // Agent session, and the reply says how Claude Code starts that session's MCP server.
128
147
  if (values.grant) {
129
- if (!values.project) {
130
- process.stderr.write('--grant needs --project, the project folder relative to the service root.\n\n' + usage);
148
+ if (!!values.project === !!values['project-id']) {
149
+ process.stderr.write('--grant needs exactly one of --project (a folder relative to the service root) or --project-id (an existing project).\n\n' + usage);
131
150
  process.exit(2);
132
151
  }
133
152
  if (values.agent !== undefined && !['claude-code', 'codex'].includes(values.agent)) {
@@ -141,7 +160,13 @@ else {
141
160
  const { RhoClient } = await import('./client.js');
142
161
  const client = await RhoClient.fromFile(path.resolve(values.grant)).catch(error => refuse(error));
143
162
  try {
144
- const project = await client.call('project.open', { path: values.project });
163
+ const project = values['project-id']
164
+ ? (await client.call('project.list', {})).find(p => p.id === values['project-id'])
165
+ : await client.call('project.open', { path: values.project });
166
+ if (!project) {
167
+ process.stderr.write('Project is not registered or is outside this connection’s scope. Open the project in Rho and copy its setup prompt again.\n');
168
+ process.exit(1);
169
+ }
145
170
  // The same as the project page's button: the grant that Agent keeps, then its own
146
171
  // `mcp add`, recorded so the page shows it under that Agent.
147
172
  if (values.agent) {
@@ -203,7 +228,10 @@ else {
203
228
  const agentBackend = values['agent-backend'] ?? process.env.RHO_AGENT_BACKEND ?? 'claude-acp';
204
229
  if (!['claude-acp', 'codex-acp', 'claude-cli', 'acp'].includes(agentBackend))
205
230
  throw new Error('Choose --agent-backend claude-acp, codex-acp, claude-cli or acp.');
206
- const acpCommand = agentBackend === 'acp' ? parseAcpCommand(values['acp-command'] ?? process.env.RHO_ACP_COMMAND) : undefined;
231
+ // An ACP command named here, or else DeepSeek Harness's own ACP profile when it is installed, so
232
+ // sessions started in Harness continue in Rho too. Naming one does not make it the default Agent.
233
+ const named = values['acp-command'] ?? process.env.RHO_ACP_COMMAND;
234
+ const acpCommand = agentBackend === 'acp' || named ? parseAcpCommand(named) : await harnessAcp();
207
235
  if (values.port !== undefined && !(/^\d+$/.test(values.port) && Number(values.port) <= 65535)) {
208
236
  process.stderr.write('Choose --port 0 to 65535, or leave it out.\n');
209
237
  process.exit(2);
@@ -252,9 +280,11 @@ else {
252
280
  const claudePath = values.claude ?? process.env.RHO_CLAUDE, codexPath = values.codex ?? process.env.RHO_CODEX;
253
281
  const env = { ...process.env, ...(claudePath ? { CLAUDE_CODE_EXECUTABLE: claudePath } : {}), ...(codexPath ? { CODEX_PATH: codexPath } : {}) };
254
282
  // An ACP agent named with --acp-command is the operator's own command; it is named, not checked.
255
- if (acpCommand)
283
+ if (acpCommand && agentBackend === 'acp')
256
284
  say('Agent: ' + acpCommand.file + ', named with --acp-command.');
257
285
  else {
286
+ if (acpCommand)
287
+ say('Also: ' + (acpCommand.args[0] === 'acp' && /dsh(\.[a-z]+)?$/i.test(acpCommand.file) ? 'DeepSeek Harness (' + acpCommand.file + ' acp)' : acpCommand.file) + ', so its sessions can continue here.');
258
288
  const missing = agentCommand ? agentCommand.missingClient(agentBackend === 'codex-acp' ? 'codex' : 'claude', env) : null;
259
289
  say(missing
260
290
  ? 'Agent: ' + missing + ' Until then folders can be opened and files read here; the Agent cannot run in them.'
@@ -1915,21 +1915,31 @@ export interface AgentSessionsListInput {
1915
1915
  export interface AgentSessionsListOutput {
1916
1916
  omitted: number;
1917
1917
  /**
1918
- * @maxItems 64
1918
+ * @maxItems 128
1919
1919
  */
1920
1920
  sessions: {
1921
+ bytes?: number;
1922
+ continueWith?: 'claude-acp' | 'codex-acp' | 'acp' | null;
1923
+ conversationId?: string;
1921
1924
  id: string;
1922
- inputOwner: 'external';
1925
+ inputOwner?: 'external';
1923
1926
  lastAt: string;
1924
1927
  observedAt: string;
1925
1928
  omittedTurns: number;
1929
+ open?: null | {
1930
+ pid?: number;
1931
+ since?: string;
1932
+ where: string;
1933
+ };
1926
1934
  problem?: string;
1927
1935
  producer: string;
1936
+ resume?: string;
1928
1937
  sessionId: string;
1929
1938
  sourceCursor: number;
1930
1939
  state: 'running' | 'completed' | 'failed' | 'stopped' | 'unknown';
1931
1940
  title: string;
1932
1941
  turns: number;
1942
+ where?: string;
1933
1943
  }[];
1934
1944
  }
1935
1945
  export interface AgentSessionsReadInput {
@@ -1941,21 +1951,31 @@ export interface AgentSessionsReadInput {
1941
1951
  export interface AgentSessionsReadOutput {
1942
1952
  first: number;
1943
1953
  session: {
1954
+ bytes?: number;
1955
+ continueWith?: 'claude-acp' | 'codex-acp' | 'acp' | null;
1956
+ conversationId?: string;
1944
1957
  id: string;
1945
- inputOwner: 'external';
1958
+ inputOwner?: 'external';
1946
1959
  lastAt: string;
1947
1960
  observedAt: string;
1948
1961
  omittedTurns: number;
1962
+ open?: null | {
1963
+ pid?: number;
1964
+ since?: string;
1965
+ where: string;
1966
+ };
1949
1967
  problem?: string;
1950
1968
  producer: string;
1969
+ resume?: string;
1951
1970
  sessionId: string;
1952
1971
  sourceCursor: number;
1953
1972
  state: 'running' | 'completed' | 'failed' | 'stopped' | 'unknown';
1954
1973
  title: string;
1955
1974
  turns: number;
1975
+ where?: string;
1956
1976
  };
1957
1977
  /**
1958
- * @maxItems 20
1978
+ * @maxItems 50
1959
1979
  */
1960
1980
  turns: {
1961
1981
  at: string;
@@ -1999,6 +2019,7 @@ export interface AgentSessionsReadOutput {
1999
2019
  */
2000
2020
  paths: string[];
2001
2021
  }[];
2022
+ where?: string;
2002
2023
  }[];
2003
2024
  }
2004
2025
  export interface AnnotationCreateInput {
@@ -4680,6 +4701,11 @@ export interface ConversationConfigureOutput {
4680
4701
  costUsd?: number | null;
4681
4702
  sessionId?: string | null;
4682
4703
  trashedAt?: string | null;
4704
+ origin?: {
4705
+ producer: string;
4706
+ where: string;
4707
+ copyOf?: string;
4708
+ } | null;
4683
4709
  };
4684
4710
  observation: {
4685
4711
  at: string;
@@ -4811,6 +4837,11 @@ export interface ConversationDecideOutput {
4811
4837
  costUsd?: number | null;
4812
4838
  sessionId?: string | null;
4813
4839
  trashedAt?: string | null;
4840
+ origin?: {
4841
+ producer: string;
4842
+ where: string;
4843
+ copyOf?: string;
4844
+ } | null;
4814
4845
  };
4815
4846
  turn: {
4816
4847
  id: string;
@@ -5026,6 +5057,11 @@ export interface ConversationListOutput {
5026
5057
  costUsd?: number | null;
5027
5058
  sessionId?: string | null;
5028
5059
  trashedAt?: string | null;
5060
+ origin?: {
5061
+ producer: string;
5062
+ where: string;
5063
+ copyOf?: string;
5064
+ } | null;
5029
5065
  }[];
5030
5066
  }
5031
5067
  export interface ConversationPermissionInput {
@@ -5070,6 +5106,11 @@ export interface ConversationPermissionOutput {
5070
5106
  costUsd?: number | null;
5071
5107
  sessionId?: string | null;
5072
5108
  trashedAt?: string | null;
5109
+ origin?: {
5110
+ producer: string;
5111
+ where: string;
5112
+ copyOf?: string;
5113
+ } | null;
5073
5114
  };
5074
5115
  turn: {
5075
5116
  id: string;
@@ -5276,6 +5317,11 @@ export interface ConversationReadOutput {
5276
5317
  costUsd?: number | null;
5277
5318
  sessionId?: string | null;
5278
5319
  trashedAt?: string | null;
5320
+ origin?: {
5321
+ producer: string;
5322
+ where: string;
5323
+ copyOf?: string;
5324
+ } | null;
5279
5325
  };
5280
5326
  observation?: {
5281
5327
  at: string;
@@ -5567,6 +5613,11 @@ export interface ConversationRestoreOutput {
5567
5613
  costUsd?: number | null;
5568
5614
  sessionId?: string | null;
5569
5615
  trashedAt?: string | null;
5616
+ origin?: {
5617
+ producer: string;
5618
+ where: string;
5619
+ copyOf?: string;
5620
+ } | null;
5570
5621
  };
5571
5622
  }
5572
5623
  export interface ConversationSendInput {
@@ -5615,6 +5666,11 @@ export interface ConversationSendOutput {
5615
5666
  costUsd?: number | null;
5616
5667
  sessionId?: string | null;
5617
5668
  trashedAt?: string | null;
5669
+ origin?: {
5670
+ producer: string;
5671
+ where: string;
5672
+ copyOf?: string;
5673
+ } | null;
5618
5674
  };
5619
5675
  turn: {
5620
5676
  id: string;
@@ -5884,6 +5940,23 @@ export interface ConversationSettingsCheckOutput {
5884
5940
  describe?: {
5885
5941
  enabled: boolean;
5886
5942
  };
5943
+ agents?: {
5944
+ 'claude-acp': {
5945
+ found: boolean;
5946
+ problem?: string;
5947
+ name?: string | null;
5948
+ };
5949
+ 'codex-acp': {
5950
+ found: boolean;
5951
+ problem?: string;
5952
+ name?: string | null;
5953
+ };
5954
+ acp: {
5955
+ found: boolean;
5956
+ problem?: string;
5957
+ name?: string | null;
5958
+ };
5959
+ };
5887
5960
  }
5888
5961
  export interface ConversationSettingsReadInput {
5889
5962
  projectId: string;
@@ -5988,6 +6061,23 @@ export interface ConversationSettingsReadOutput {
5988
6061
  describe?: {
5989
6062
  enabled: boolean;
5990
6063
  };
6064
+ agents?: {
6065
+ 'claude-acp': {
6066
+ found: boolean;
6067
+ problem?: string;
6068
+ name?: string | null;
6069
+ };
6070
+ 'codex-acp': {
6071
+ found: boolean;
6072
+ problem?: string;
6073
+ name?: string | null;
6074
+ };
6075
+ acp: {
6076
+ found: boolean;
6077
+ problem?: string;
6078
+ name?: string | null;
6079
+ };
6080
+ };
5991
6081
  }
5992
6082
  export interface ConversationSettingsUpdateInput {
5993
6083
  projectId: string;
@@ -6108,6 +6198,23 @@ export interface ConversationSettingsUpdateOutput {
6108
6198
  describe?: {
6109
6199
  enabled: boolean;
6110
6200
  };
6201
+ agents?: {
6202
+ 'claude-acp': {
6203
+ found: boolean;
6204
+ problem?: string;
6205
+ name?: string | null;
6206
+ };
6207
+ 'codex-acp': {
6208
+ found: boolean;
6209
+ problem?: string;
6210
+ name?: string | null;
6211
+ };
6212
+ acp: {
6213
+ found: boolean;
6214
+ problem?: string;
6215
+ name?: string | null;
6216
+ };
6217
+ };
6111
6218
  }
6112
6219
  export interface ConversationStartInput {
6113
6220
  projectId: string;
@@ -6121,6 +6228,10 @@ export interface ConversationStartInput {
6121
6228
  * @maxItems 8
6122
6229
  */
6123
6230
  contexts?: string[];
6231
+ continue?: {
6232
+ session: string;
6233
+ copy?: boolean;
6234
+ };
6124
6235
  }
6125
6236
  export interface ConversationStartOutput {
6126
6237
  conversation: {
@@ -6157,6 +6268,11 @@ export interface ConversationStartOutput {
6157
6268
  costUsd?: number | null;
6158
6269
  sessionId?: string | null;
6159
6270
  trashedAt?: string | null;
6271
+ origin?: {
6272
+ producer: string;
6273
+ where: string;
6274
+ copyOf?: string;
6275
+ } | null;
6160
6276
  };
6161
6277
  turn: {
6162
6278
  id: string;
@@ -6362,6 +6478,11 @@ export interface ConversationStopOutput {
6362
6478
  costUsd?: number | null;
6363
6479
  sessionId?: string | null;
6364
6480
  trashedAt?: string | null;
6481
+ origin?: {
6482
+ producer: string;
6483
+ where: string;
6484
+ copyOf?: string;
6485
+ } | null;
6365
6486
  };
6366
6487
  turn: {
6367
6488
  id: string;
@@ -6566,6 +6687,11 @@ export interface ConversationTrashOutput {
6566
6687
  costUsd?: number | null;
6567
6688
  sessionId?: string | null;
6568
6689
  trashedAt?: string | null;
6690
+ origin?: {
6691
+ producer: string;
6692
+ where: string;
6693
+ copyOf?: string;
6694
+ } | null;
6569
6695
  };
6570
6696
  }
6571
6697
  export interface DataCompareInput {
@@ -9738,6 +9864,11 @@ export interface ObservationSnapshotOutput {
9738
9864
  costUsd?: number | null;
9739
9865
  sessionId?: string | null;
9740
9866
  trashedAt?: string | null;
9867
+ origin?: {
9868
+ producer: string;
9869
+ where: string;
9870
+ copyOf?: string;
9871
+ } | null;
9741
9872
  }[];
9742
9873
  selection: {
9743
9874
  resource: {
@@ -11097,6 +11228,14 @@ export interface SessionGrantOutput {
11097
11228
  externalSessionId: string;
11098
11229
  profile?: 'layered-business' | 'layered-presentation';
11099
11230
  }
11231
+ export interface SessionInstructionsInput {
11232
+ projectId: string;
11233
+ }
11234
+ export interface SessionInstructionsOutput {
11235
+ request: string;
11236
+ prompt: string;
11237
+ command: string[];
11238
+ }
11100
11239
  export interface SkillListInput {
11101
11240
  projectId: string;
11102
11241
  }
@@ -13437,6 +13576,10 @@ export interface RhoOperations {
13437
13576
  input: SessionGrantInput;
13438
13577
  output: SessionGrantOutput;
13439
13578
  };
13579
+ "session.instructions": {
13580
+ input: SessionInstructionsInput;
13581
+ output: SessionInstructionsOutput;
13582
+ };
13440
13583
  "skill.list": {
13441
13584
  input: SkillListInput;
13442
13585
  output: SkillListOutput;
@@ -13522,5 +13665,5 @@ export type RhoMethod = keyof RhoOperations;
13522
13665
  export type RhoInput<M extends RhoMethod> = RhoOperations[M]['input'];
13523
13666
  export type RhoOutput<M extends RhoMethod> = RhoOperations[M]['output'];
13524
13667
  /** The names a caller may pass to protocol.describe / protocol.validate. */
13525
- export declare const rhoMethods: readonly ["action.cancel", "action.export", "action.list", "action.lookup", "action.observe", "action.output", "action.retry", "action.submit", "agent.activity.capture", "agent.activity.outputs", "agent.activity.read", "agent.sessions.list", "agent.sessions.read", "annotation.create", "annotation.decide", "annotation.list", "annotation.read", "annotation.reply", "artifact.check", "binding.activity", "binding.activity.append", "binding.close", "binding.list", "binding.open", "capability.configure", "capability.index", "capability.list", "capability.resolve", "composition.apply", "composition.put", "composition.read", "composition.undo", "console.events", "console.list", "console.output", "console.run", "console.stop", "context.create", "context.read", "conversation.configure", "conversation.decide", "conversation.delete", "conversation.list", "conversation.permission", "conversation.read", "conversation.restore", "conversation.send", "conversation.settings.check", "conversation.settings.read", "conversation.settings.update", "conversation.start", "conversation.stop", "conversation.trash", "data.compare", "data.page", "data.plot", "document.abandonSave", "document.change.read", "document.edit", "document.history", "document.open", "document.read", "document.revert", "document.save", "document.undo", "document.undoOwn", "evidence.export", "evidence.preview", "extension.call", "extension.content", "extension.describe", "extension.install", "extension.list", "extension.manage", "extension.read", "feedback.read", "feedback.status", "feedback.submit", "interaction.selection.read", "interaction.selection.set", "kernel.events", "kernel.inspect", "kernel.interrupt", "kernel.place.check", "kernel.place.copy", "kernel.place.list", "kernel.place.set", "kernel.places", "kernel.plot", "kernel.read", "kernel.run", "kernel.server.skill", "kernel.servers", "kernel.stop", "media.describe", "object.read", "observation.snapshot", "project.create", "project.createWorkspace", "project.doctor", "project.entries", "project.list", "project.open", "project.openFile", "project.pick", "project.runs", "project.source.add", "project.source.pick", "project.work.read", "protocol.describe", "protocol.validate", "requirements.check", "requirements.prepare", "resource.capture", "resource.list", "resource.read", "resource.register", "selection.set", "session.browser.pair", "session.browser.revoke", "session.connect", "session.grant", "skill.list", "skill.read", "skills.change", "skills.list", "skills.read", "skills.undo", "task.map.declare", "task.map.present", "task.map.read", "task.map.respond", "task.routing.put", "view.close", "view.observations.read", "view.observe", "view.protection.set", "workspace.enhance", "workspace.export", "workspace.observe", "workspace.restore", "workspace.save"];
13668
+ export declare const rhoMethods: readonly ["action.cancel", "action.export", "action.list", "action.lookup", "action.observe", "action.output", "action.retry", "action.submit", "agent.activity.capture", "agent.activity.outputs", "agent.activity.read", "agent.sessions.list", "agent.sessions.read", "annotation.create", "annotation.decide", "annotation.list", "annotation.read", "annotation.reply", "artifact.check", "binding.activity", "binding.activity.append", "binding.close", "binding.list", "binding.open", "capability.configure", "capability.index", "capability.list", "capability.resolve", "composition.apply", "composition.put", "composition.read", "composition.undo", "console.events", "console.list", "console.output", "console.run", "console.stop", "context.create", "context.read", "conversation.configure", "conversation.decide", "conversation.delete", "conversation.list", "conversation.permission", "conversation.read", "conversation.restore", "conversation.send", "conversation.settings.check", "conversation.settings.read", "conversation.settings.update", "conversation.start", "conversation.stop", "conversation.trash", "data.compare", "data.page", "data.plot", "document.abandonSave", "document.change.read", "document.edit", "document.history", "document.open", "document.read", "document.revert", "document.save", "document.undo", "document.undoOwn", "evidence.export", "evidence.preview", "extension.call", "extension.content", "extension.describe", "extension.install", "extension.list", "extension.manage", "extension.read", "feedback.read", "feedback.status", "feedback.submit", "interaction.selection.read", "interaction.selection.set", "kernel.events", "kernel.inspect", "kernel.interrupt", "kernel.place.check", "kernel.place.copy", "kernel.place.list", "kernel.place.set", "kernel.places", "kernel.plot", "kernel.read", "kernel.run", "kernel.server.skill", "kernel.servers", "kernel.stop", "media.describe", "object.read", "observation.snapshot", "project.create", "project.createWorkspace", "project.doctor", "project.entries", "project.list", "project.open", "project.openFile", "project.pick", "project.runs", "project.source.add", "project.source.pick", "project.work.read", "protocol.describe", "protocol.validate", "requirements.check", "requirements.prepare", "resource.capture", "resource.list", "resource.read", "resource.register", "selection.set", "session.browser.pair", "session.browser.revoke", "session.connect", "session.grant", "session.instructions", "skill.list", "skill.read", "skills.change", "skills.list", "skills.read", "skills.undo", "task.map.declare", "task.map.present", "task.map.read", "task.map.respond", "task.routing.put", "view.close", "view.observations.read", "view.observe", "view.protection.set", "workspace.enhance", "workspace.export", "workspace.observe", "workspace.restore", "workspace.save"];
13526
13669
  export type RhoInputFor<M extends RhoMethod> = RhoOperations[M]['input'];
@@ -1,2 +1,2 @@
1
1
  /** The names a caller may pass to protocol.describe / protocol.validate. */
2
- export const rhoMethods = ["action.cancel", "action.export", "action.list", "action.lookup", "action.observe", "action.output", "action.retry", "action.submit", "agent.activity.capture", "agent.activity.outputs", "agent.activity.read", "agent.sessions.list", "agent.sessions.read", "annotation.create", "annotation.decide", "annotation.list", "annotation.read", "annotation.reply", "artifact.check", "binding.activity", "binding.activity.append", "binding.close", "binding.list", "binding.open", "capability.configure", "capability.index", "capability.list", "capability.resolve", "composition.apply", "composition.put", "composition.read", "composition.undo", "console.events", "console.list", "console.output", "console.run", "console.stop", "context.create", "context.read", "conversation.configure", "conversation.decide", "conversation.delete", "conversation.list", "conversation.permission", "conversation.read", "conversation.restore", "conversation.send", "conversation.settings.check", "conversation.settings.read", "conversation.settings.update", "conversation.start", "conversation.stop", "conversation.trash", "data.compare", "data.page", "data.plot", "document.abandonSave", "document.change.read", "document.edit", "document.history", "document.open", "document.read", "document.revert", "document.save", "document.undo", "document.undoOwn", "evidence.export", "evidence.preview", "extension.call", "extension.content", "extension.describe", "extension.install", "extension.list", "extension.manage", "extension.read", "feedback.read", "feedback.status", "feedback.submit", "interaction.selection.read", "interaction.selection.set", "kernel.events", "kernel.inspect", "kernel.interrupt", "kernel.place.check", "kernel.place.copy", "kernel.place.list", "kernel.place.set", "kernel.places", "kernel.plot", "kernel.read", "kernel.run", "kernel.server.skill", "kernel.servers", "kernel.stop", "media.describe", "object.read", "observation.snapshot", "project.create", "project.createWorkspace", "project.doctor", "project.entries", "project.list", "project.open", "project.openFile", "project.pick", "project.runs", "project.source.add", "project.source.pick", "project.work.read", "protocol.describe", "protocol.validate", "requirements.check", "requirements.prepare", "resource.capture", "resource.list", "resource.read", "resource.register", "selection.set", "session.browser.pair", "session.browser.revoke", "session.connect", "session.grant", "skill.list", "skill.read", "skills.change", "skills.list", "skills.read", "skills.undo", "task.map.declare", "task.map.present", "task.map.read", "task.map.respond", "task.routing.put", "view.close", "view.observations.read", "view.observe", "view.protection.set", "workspace.enhance", "workspace.export", "workspace.observe", "workspace.restore", "workspace.save"];
2
+ export const rhoMethods = ["action.cancel", "action.export", "action.list", "action.lookup", "action.observe", "action.output", "action.retry", "action.submit", "agent.activity.capture", "agent.activity.outputs", "agent.activity.read", "agent.sessions.list", "agent.sessions.read", "annotation.create", "annotation.decide", "annotation.list", "annotation.read", "annotation.reply", "artifact.check", "binding.activity", "binding.activity.append", "binding.close", "binding.list", "binding.open", "capability.configure", "capability.index", "capability.list", "capability.resolve", "composition.apply", "composition.put", "composition.read", "composition.undo", "console.events", "console.list", "console.output", "console.run", "console.stop", "context.create", "context.read", "conversation.configure", "conversation.decide", "conversation.delete", "conversation.list", "conversation.permission", "conversation.read", "conversation.restore", "conversation.send", "conversation.settings.check", "conversation.settings.read", "conversation.settings.update", "conversation.start", "conversation.stop", "conversation.trash", "data.compare", "data.page", "data.plot", "document.abandonSave", "document.change.read", "document.edit", "document.history", "document.open", "document.read", "document.revert", "document.save", "document.undo", "document.undoOwn", "evidence.export", "evidence.preview", "extension.call", "extension.content", "extension.describe", "extension.install", "extension.list", "extension.manage", "extension.read", "feedback.read", "feedback.status", "feedback.submit", "interaction.selection.read", "interaction.selection.set", "kernel.events", "kernel.inspect", "kernel.interrupt", "kernel.place.check", "kernel.place.copy", "kernel.place.list", "kernel.place.set", "kernel.places", "kernel.plot", "kernel.read", "kernel.run", "kernel.server.skill", "kernel.servers", "kernel.stop", "media.describe", "object.read", "observation.snapshot", "project.create", "project.createWorkspace", "project.doctor", "project.entries", "project.list", "project.open", "project.openFile", "project.pick", "project.runs", "project.source.add", "project.source.pick", "project.work.read", "protocol.describe", "protocol.validate", "requirements.check", "requirements.prepare", "resource.capture", "resource.list", "resource.read", "resource.register", "selection.set", "session.browser.pair", "session.browser.revoke", "session.connect", "session.grant", "session.instructions", "skill.list", "skill.read", "skills.change", "skills.list", "skills.read", "skills.undo", "task.map.declare", "task.map.present", "task.map.read", "task.map.respond", "task.routing.put", "view.close", "view.observations.read", "view.observe", "view.protection.set", "workspace.enhance", "workspace.export", "workspace.observe", "workspace.restore", "workspace.save"];