@rho-workspace/rho 0.5.4 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/browser-access.js +3 -2
  2. package/dist/capabilities.d.ts +2 -2
  3. package/dist/capabilities.js +6 -1
  4. package/dist/cli.js +186 -173
  5. package/dist/contract.generated.d.ts +329 -4
  6. package/dist/contract.generated.js +1 -1
  7. package/dist/contracts/owners.generated.js +360 -6
  8. package/dist/discovery.d.ts +1 -0
  9. package/dist/discovery.js +3 -3
  10. package/dist/extension-contract.d.ts +99 -0
  11. package/dist/extension-contract.js +52 -0
  12. package/dist/extension-directory.d.ts +9 -0
  13. package/dist/extension-directory.js +11 -0
  14. package/dist/extension-worker.d.ts +1 -0
  15. package/dist/extension-worker.js +36 -0
  16. package/dist/extensions.d.ts +157 -0
  17. package/dist/extensions.js +349 -0
  18. package/dist/plugin-cli.d.ts +1 -0
  19. package/dist/plugin-cli.js +139 -0
  20. package/dist/plugin-inventory.json +18 -0
  21. package/dist/plugins.d.ts +3 -3
  22. package/dist/project-work.d.ts +3 -1
  23. package/dist/project-work.js +15 -2
  24. package/dist/protocol.d.ts +7 -0
  25. package/dist/protocol.js +4 -2
  26. package/dist/server.d.ts +4 -1
  27. package/dist/server.js +55 -8
  28. package/dist/web/.vite/manifest.json +61 -61
  29. package/dist/web/assets/{canvas-BXhC8RDZ.js → canvas-D8rDdfDz.js} +1 -1
  30. package/dist/web/assets/choices-b0XhrGQV.js +1 -0
  31. package/dist/web/assets/{console-Dbdo-5oO.js → console-BSjLGe0T.js} +1 -1
  32. package/dist/web/assets/{dist-B2V0VDO0.js → dist-Buk0lwzI.js} +2 -2
  33. package/dist/web/assets/dist-Cw8hRIlT.js +1 -0
  34. package/dist/web/assets/dist-Tzoe_zm-.js +3 -0
  35. package/dist/web/assets/{dist-D25Vn17i.js → dist-foH9IKc6.js} +1 -1
  36. package/dist/web/assets/explore-in-BVUy3ZW_.js +1 -0
  37. package/dist/web/assets/graph-1OdIJ9l7.js +2 -0
  38. package/dist/web/assets/index-CsC3sTRq.css +1 -0
  39. package/dist/web/assets/{index-BHQIaDsx.js → index-CxmItXqa.js} +85 -85
  40. package/dist/web/assets/{notes-meaning-DdPbtNzJ.js → notes-meaning-pVbbQUGP.js} +1 -1
  41. package/dist/web/assets/overview-B9UtVJ32.js +6 -0
  42. package/dist/web/assets/preview-CksD_5KS.js +1 -0
  43. package/dist/web/assets/{review-CmWou4Iv.js → review-CMxQlQ-C.js} +1 -1
  44. package/dist/web/assets/{skills-Dy7n3L9d.js → skills-BFNSyrnD.js} +1 -1
  45. package/dist/web/assets/{skills-work-Cj0W6b-I.js → skills-work-BGPSnF_I.js} +1 -1
  46. package/dist/web/assets/{studio-process-QOY_n2_8.js → studio-process-CsRoTHOh.js} +2 -2
  47. package/dist/web/assets/{timeline-events-DmX1BCh3.js → timeline-events-BbuuFWHV.js} +1 -1
  48. package/dist/web/assets/{work-turns-Co0C71rJ.js → work-turns-BvJlIMmA.js} +1 -1
  49. package/dist/web/assets/workspace-CWlkjLNx.js +5 -0
  50. package/dist/web/composition.json +67 -67
  51. package/dist/web/index.html +3 -3
  52. package/dist/web/renderer.json +1 -1
  53. package/dist/web-assets.d.ts +2 -1
  54. package/dist/web-assets.js +3 -2
  55. package/dist/work-contract.js +2 -2
  56. package/docs/HEADLESS.md +1 -1
  57. package/docs/PLUGIN-AUTHORING.md +4 -0
  58. package/docs/THIRD-PARTY-PLUGINS.md +190 -0
  59. package/node_modules/@rho-workspace/plugin-agent/README.md +39 -0
  60. package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.d.ts +1 -0
  61. package/node_modules/@rho-workspace/plugin-agent/dist/activity-normalize.js +2 -2
  62. package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.d.ts +6 -0
  63. package/node_modules/@rho-workspace/plugin-agent/dist/dsh-session.js +174 -0
  64. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.d.ts +82 -0
  65. package/node_modules/@rho-workspace/plugin-agent/dist/external-session-contract.js +15 -0
  66. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.d.ts +73 -0
  67. package/node_modules/@rho-workspace/plugin-agent/dist/external-session.js +190 -0
  68. package/node_modules/@rho-workspace/plugin-agent/dist/index.d.ts +373 -0
  69. package/node_modules/@rho-workspace/plugin-agent/dist/index.js +1 -0
  70. package/node_modules/@rho-workspace/plugin-agent/dist/operations.d.ts +33 -0
  71. package/node_modules/@rho-workspace/plugin-agent/dist/operations.js +3 -0
  72. package/node_modules/@rho-workspace/plugin-agent/dist/presentation.d.ts +14 -0
  73. package/node_modules/@rho-workspace/plugin-agent/dist/presentation.js +2 -0
  74. package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.d.ts +15 -0
  75. package/node_modules/@rho-workspace/plugin-agent/dist/ui-external-session.js +37 -0
  76. package/node_modules/@rho-workspace/plugin-agent/package.json +5 -1
  77. package/package.json +5 -3
  78. package/protocol/index.json +58 -4
  79. package/protocol/operations/agent.sessions.list.json +100 -0
  80. package/protocol/operations/agent.sessions.read.json +266 -0
  81. package/protocol/operations/extension.call.json +132 -0
  82. package/protocol/operations/extension.content.json +78 -0
  83. package/protocol/operations/extension.describe.json +195 -0
  84. package/protocol/operations/extension.install.json +198 -0
  85. package/protocol/operations/extension.list.json +123 -0
  86. package/protocol/operations/extension.manage.json +55 -0
  87. package/protocol/operations/extension.read.json +112 -0
  88. package/protocol/operations/project.work.read.json +3 -2
  89. package/protocol/operations/session.grant.json +9 -0
  90. package/scripts/third-party-acceptance.mjs +77 -0
  91. package/vendor/composition.json +85 -85
  92. package/vendor/rho-workspace-plugin-agent-0.4.29.tgz +0 -0
  93. package/dist/web/assets/choices-DU9kHlyQ.js +0 -1
  94. package/dist/web/assets/dist-BV3hWfn_.js +0 -3
  95. package/dist/web/assets/dist-CLNF2g-E.js +0 -1
  96. package/dist/web/assets/explore-in-8Q5ftt-E.js +0 -1
  97. package/dist/web/assets/graph-hS2kvHTI.js +0 -2
  98. package/dist/web/assets/index-Cj1_iqyK.css +0 -1
  99. package/dist/web/assets/overview-BV6ZO5TO.js +0 -6
  100. package/dist/web/assets/preview-n5lOOdjN.js +0 -1
  101. package/dist/web/assets/workspace-BKFefRfJ.js +0 -5
  102. package/vendor/rho-workspace-plugin-agent-0.4.28.tgz +0 -0
@@ -0,0 +1,190 @@
1
+ import fs, { constants } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { Ajv } from 'ajv';
5
+ import { externalSessionLimits as limits, externalSessionSummarySchema, externalTurnSchema } from './external-session-contract.js';
6
+ export { externalSessionLimits } from './external-session-contract.js';
7
+ export const externalSessionId = (producer, session) => 'x-' + createHash('sha256').update(producer + '\0' + session).digest('hex');
8
+ const schema = new Ajv({ strict: false }).compile({ type: 'object', additionalProperties: false, required: ['format', 'projectRoot', 'summary', 'turns', 'sourceDigest'], properties: {
9
+ format: { const: 1 }, projectRoot: { type: 'string' }, summary: externalSessionSummarySchema,
10
+ turns: { type: 'array', maxItems: limits.maxTurns, items: externalTurnSchema }, sourceDigest: { type: 'string', pattern: '^[a-f0-9]{64}$' }
11
+ } });
12
+ function directory(root, create = false) {
13
+ let dir = fs.realpathSync(root);
14
+ for (const part of ['.rho', 'agent', 'external']) {
15
+ dir = path.join(dir, part);
16
+ if (create) {
17
+ try {
18
+ fs.mkdirSync(dir, { mode: 0o700 });
19
+ }
20
+ catch (e) {
21
+ if (e.code !== 'EEXIST')
22
+ throw e;
23
+ }
24
+ }
25
+ const stat = fs.lstatSync(dir);
26
+ if (!stat.isDirectory() || stat.isSymbolicLink() || fs.realpathSync(dir) !== dir)
27
+ throw new Error('External session storage must stay in the project.');
28
+ }
29
+ return dir;
30
+ }
31
+ function read(file, root) {
32
+ const fd = fs.openSync(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
33
+ try {
34
+ const stat = fs.fstatSync(fd);
35
+ if (!stat.isFile() || stat.size > limits.maxRecordBytes)
36
+ throw new Error('External session record exceeds 4 MiB.');
37
+ const b = Buffer.alloc(stat.size + 1), n = fs.readSync(fd, b, 0, b.length, 0);
38
+ if (n !== stat.size)
39
+ throw new Error('External session changed during observation.');
40
+ const v = JSON.parse(b.subarray(0, n).toString('utf8'));
41
+ if (!schema(v) || v.projectRoot !== root || v.summary.id !== externalSessionId(v.summary.producer, v.summary.sessionId))
42
+ throw new Error('Invalid external session record.');
43
+ return v;
44
+ }
45
+ finally {
46
+ fs.closeSync(fd);
47
+ }
48
+ }
49
+ function observed(v) {
50
+ // No heartbeat proves the model or its native subprocess is alive.
51
+ if (v.summary.state !== 'running' || Date.now() - Date.parse(v.summary.observedAt) < 10000)
52
+ return v;
53
+ return { ...v, summary: { ...v.summary, state: 'unknown' }, turns: v.turns.map(t => t.state !== 'running' ? t : { ...t, state: 'unknown', tools: t.tools.map(tool => tool.outcome === 'requested' ? { ...tool, outcome: 'unknown' } : tool) }) };
54
+ }
55
+ export function listExternalSessions(root) {
56
+ root = fs.realpathSync(root);
57
+ const sessions = [];
58
+ let omitted = 0;
59
+ try {
60
+ const dir = directory(root), entries = fs.opendirSync(dir);
61
+ try {
62
+ let e, scanned = 0;
63
+ while ((e = entries.readSync())) {
64
+ if (++scanned > limits.maxSessions * 4) {
65
+ omitted++;
66
+ break;
67
+ }
68
+ if (!/^x-[a-f0-9]{64}\.json$/.test(e.name))
69
+ continue;
70
+ if (sessions.length >= limits.maxSessions) {
71
+ omitted++;
72
+ continue;
73
+ }
74
+ try {
75
+ sessions.push(observed(read(path.join(dir, e.name), root)).summary);
76
+ }
77
+ catch {
78
+ omitted++;
79
+ }
80
+ }
81
+ }
82
+ finally {
83
+ entries.closeSync();
84
+ }
85
+ }
86
+ catch (e) {
87
+ if (e.code !== 'ENOENT')
88
+ omitted++;
89
+ }
90
+ return { sessions: sessions.sort((a, b) => b.lastAt.localeCompare(a.lastAt)), omitted };
91
+ }
92
+ export function readExternalSession(root, input) {
93
+ if (!/^x-[a-f0-9]{64}$/.test(input.session))
94
+ throw new Error('Invalid external session identity.');
95
+ root = fs.realpathSync(root);
96
+ const v = observed(read(path.join(directory(root), input.session + '.json'), root));
97
+ const end = Math.min(v.turns.length, input.before ?? v.turns.length), first = Math.max(0, end - Math.min(20, Math.max(1, input.limit ?? 4)));
98
+ return { session: v.summary, first, turns: v.turns.slice(first, end) };
99
+ }
100
+ /** Native adapters retain an observation under their existing filesystem authority.
101
+ * No managed execution, Agent input, grant change or runtime startup is involved. */
102
+ export function saveExternalSession(root, value, previousDigest) {
103
+ root = fs.realpathSync(root);
104
+ if (value.projectRoot !== root || !schema(value) || value.summary.id !== externalSessionId(value.summary.producer, value.summary.sessionId))
105
+ throw new Error('Invalid external session observation.');
106
+ const bytes = JSON.stringify(value);
107
+ if (Buffer.byteLength(bytes) > limits.maxRecordBytes)
108
+ throw new Error('External session exceeds maxRecordBytes; previous observation retained.');
109
+ const dir = directory(root, true), file = path.join(dir, value.summary.id + '.json');
110
+ // The lock covers only a small local observation write; never steal a live writer's lock.
111
+ const lock = file + '.lock';
112
+ let fd;
113
+ try {
114
+ fd = fs.openSync(lock, 'wx', 0o600);
115
+ }
116
+ catch {
117
+ // Recover only a positively dead writer. Unknown owners and live PIDs retain the lock.
118
+ try {
119
+ const stat = fs.lstatSync(lock);
120
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 32)
121
+ throw new Error();
122
+ const pid = Number(fs.readFileSync(lock, 'utf8'));
123
+ if (!Number.isSafeInteger(pid) || pid <= 0)
124
+ throw new Error();
125
+ try {
126
+ process.kill(pid, 0);
127
+ throw new Error();
128
+ }
129
+ catch (e) {
130
+ if (e.code !== 'ESRCH')
131
+ throw e;
132
+ }
133
+ const now = fs.lstatSync(lock);
134
+ if (now.ino !== stat.ino || now.dev !== stat.dev)
135
+ throw new Error();
136
+ fs.unlinkSync(lock);
137
+ fd = fs.openSync(lock, 'wx', 0o600);
138
+ }
139
+ catch {
140
+ throw new Error('External session observation is busy; previous observation retained.');
141
+ }
142
+ }
143
+ fs.writeFileSync(fd, String(process.pid));
144
+ const temp = file + '.' + randomUUID() + '.tmp';
145
+ try {
146
+ let old;
147
+ try {
148
+ old = read(file, root);
149
+ }
150
+ catch (e) {
151
+ if (e.code !== 'ENOENT')
152
+ throw e;
153
+ }
154
+ if (old) {
155
+ if (value.summary.sourceCursor < old.summary.sourceCursor)
156
+ throw new Error('External source moved backwards; previous observation retained.');
157
+ if (value.summary.sourceCursor === old.summary.sourceCursor && old.sourceDigest !== value.sourceDigest)
158
+ throw new Error('External source identity conflicts with retained content.');
159
+ if (value.summary.sourceCursor > old.summary.sourceCursor && previousDigest !== old.sourceDigest)
160
+ throw new Error('External source prefix conflicts with retained content.');
161
+ }
162
+ else {
163
+ const entries = fs.readdirSync(dir).filter(n => /^x-[a-f0-9]{64}\.json$/.test(n));
164
+ if (entries.length >= limits.maxSessions)
165
+ throw new Error('External session maxSessions reached; previous observations retained.');
166
+ }
167
+ fs.writeFileSync(temp, bytes, { flag: 'wx', mode: 0o600 });
168
+ fs.renameSync(temp, file);
169
+ }
170
+ finally {
171
+ fs.closeSync(fd);
172
+ fs.unlinkSync(lock);
173
+ try {
174
+ fs.unlinkSync(temp);
175
+ }
176
+ catch { }
177
+ }
178
+ return value.summary;
179
+ }
180
+ export function retainedExternalSession(root, producer, sessionId) {
181
+ root = fs.realpathSync(root);
182
+ try {
183
+ return read(path.join(directory(root), externalSessionId(producer, sessionId) + '.json'), root);
184
+ }
185
+ catch (e) {
186
+ if (e.code === 'ENOENT')
187
+ return undefined;
188
+ throw e;
189
+ }
190
+ }
@@ -141,6 +141,18 @@ export declare const plugin: {
141
141
  description: string;
142
142
  readOnly: true;
143
143
  runsCode: false;
144
+ } | {
145
+ order: number;
146
+ displayName: string;
147
+ description: string;
148
+ readOnly: true;
149
+ runsCode: false;
150
+ } | {
151
+ order: number;
152
+ displayName: string;
153
+ description: string;
154
+ readOnly: true;
155
+ runsCode: false;
144
156
  } | {
145
157
  order: number;
146
158
  displayName: string;
@@ -237,6 +249,18 @@ export declare const plugin: {
237
249
  description: string;
238
250
  readOnly: true;
239
251
  runsCode: false;
252
+ } | {
253
+ order: number;
254
+ displayName: string;
255
+ description: string;
256
+ readOnly: true;
257
+ runsCode: false;
258
+ } | {
259
+ order: number;
260
+ displayName: string;
261
+ description: string;
262
+ readOnly: true;
263
+ runsCode: false;
240
264
  } | {
241
265
  order: number;
242
266
  displayName: string;
@@ -333,6 +357,234 @@ export declare const plugin: {
333
357
  description: string;
334
358
  readOnly: true;
335
359
  runsCode: false;
360
+ } | {
361
+ order: number;
362
+ displayName: string;
363
+ description: string;
364
+ readOnly: true;
365
+ runsCode: false;
366
+ } | {
367
+ order: number;
368
+ displayName: string;
369
+ description: string;
370
+ readOnly: true;
371
+ runsCode: false;
372
+ } | {
373
+ order: number;
374
+ displayName: string;
375
+ description: string;
376
+ readOnly: false;
377
+ runsCode: false;
378
+ } | {
379
+ order: number;
380
+ displayName: string;
381
+ description: string;
382
+ readOnly: false;
383
+ runsCode: false;
384
+ } | {
385
+ order: number;
386
+ displayName: string;
387
+ description: string;
388
+ readOnly: false;
389
+ runsCode: false;
390
+ } | {
391
+ order: number;
392
+ displayName: string;
393
+ description: string;
394
+ readOnly: true;
395
+ runsCode: false;
396
+ } | {
397
+ order: number;
398
+ displayName: string;
399
+ description: string;
400
+ readOnly: false;
401
+ runsCode: false;
402
+ } | {
403
+ order: number;
404
+ displayName: string;
405
+ description: string;
406
+ readOnly: true;
407
+ runsCode: false;
408
+ } | {
409
+ order: number;
410
+ displayName: string;
411
+ description: string;
412
+ readOnly: true;
413
+ runsCode: false;
414
+ } | {
415
+ order: number;
416
+ displayName: string;
417
+ description: string;
418
+ readOnly: false;
419
+ runsCode: false;
420
+ } | {
421
+ order: number;
422
+ displayName: string;
423
+ description: string;
424
+ readOnly: false;
425
+ runsCode: false;
426
+ } | {
427
+ order: number;
428
+ displayName: string;
429
+ description: string;
430
+ readOnly: false;
431
+ runsCode: false;
432
+ } | {
433
+ order: number;
434
+ displayName: string;
435
+ description: string;
436
+ readOnly: true;
437
+ runsCode: false;
438
+ };
439
+ version: "2.0";
440
+ } | {
441
+ requires: string[];
442
+ inputSchema: {
443
+ type: string;
444
+ properties: Record<string, any>;
445
+ required: string[];
446
+ additionalProperties: boolean;
447
+ };
448
+ outputSchema: {
449
+ type: string;
450
+ properties: Record<string, any>;
451
+ required: string[];
452
+ additionalProperties: boolean;
453
+ };
454
+ effect: "read";
455
+ method: string;
456
+ presentation: {
457
+ order: number;
458
+ displayName: string;
459
+ description: string;
460
+ readOnly: true;
461
+ runsCode: false;
462
+ } | {
463
+ order: number;
464
+ displayName: string;
465
+ description: string;
466
+ readOnly: true;
467
+ runsCode: false;
468
+ } | {
469
+ order: number;
470
+ displayName: string;
471
+ description: string;
472
+ readOnly: true;
473
+ runsCode: false;
474
+ } | {
475
+ order: number;
476
+ displayName: string;
477
+ description: string;
478
+ readOnly: true;
479
+ runsCode: false;
480
+ } | {
481
+ order: number;
482
+ displayName: string;
483
+ description: string;
484
+ readOnly: false;
485
+ runsCode: false;
486
+ } | {
487
+ order: number;
488
+ displayName: string;
489
+ description: string;
490
+ readOnly: false;
491
+ runsCode: false;
492
+ } | {
493
+ order: number;
494
+ displayName: string;
495
+ description: string;
496
+ readOnly: false;
497
+ runsCode: false;
498
+ } | {
499
+ order: number;
500
+ displayName: string;
501
+ description: string;
502
+ readOnly: true;
503
+ runsCode: false;
504
+ } | {
505
+ order: number;
506
+ displayName: string;
507
+ description: string;
508
+ readOnly: false;
509
+ runsCode: false;
510
+ } | {
511
+ order: number;
512
+ displayName: string;
513
+ description: string;
514
+ readOnly: true;
515
+ runsCode: false;
516
+ } | {
517
+ order: number;
518
+ displayName: string;
519
+ description: string;
520
+ readOnly: true;
521
+ runsCode: false;
522
+ } | {
523
+ order: number;
524
+ displayName: string;
525
+ description: string;
526
+ readOnly: false;
527
+ runsCode: false;
528
+ } | {
529
+ order: number;
530
+ displayName: string;
531
+ description: string;
532
+ readOnly: false;
533
+ runsCode: false;
534
+ } | {
535
+ order: number;
536
+ displayName: string;
537
+ description: string;
538
+ readOnly: false;
539
+ runsCode: false;
540
+ } | {
541
+ order: number;
542
+ displayName: string;
543
+ description: string;
544
+ readOnly: true;
545
+ runsCode: false;
546
+ };
547
+ version: "2.0";
548
+ } | {
549
+ requires: string[];
550
+ inputSchema: {
551
+ type: string;
552
+ properties: Record<string, any>;
553
+ required: string[];
554
+ additionalProperties: boolean;
555
+ };
556
+ outputSchema: {
557
+ type: string;
558
+ properties: Record<string, any>;
559
+ required: string[];
560
+ additionalProperties: boolean;
561
+ };
562
+ effect: "read";
563
+ method: string;
564
+ presentation: {
565
+ order: number;
566
+ displayName: string;
567
+ description: string;
568
+ readOnly: true;
569
+ runsCode: false;
570
+ } | {
571
+ order: number;
572
+ displayName: string;
573
+ description: string;
574
+ readOnly: true;
575
+ runsCode: false;
576
+ } | {
577
+ order: number;
578
+ displayName: string;
579
+ description: string;
580
+ readOnly: true;
581
+ runsCode: false;
582
+ } | {
583
+ order: number;
584
+ displayName: string;
585
+ description: string;
586
+ readOnly: true;
587
+ runsCode: false;
336
588
  } | {
337
589
  order: number;
338
590
  displayName: string;
@@ -541,6 +793,18 @@ export declare const plugin: {
541
793
  description: string;
542
794
  readOnly: true;
543
795
  runsCode: false;
796
+ } | {
797
+ order: number;
798
+ displayName: string;
799
+ description: string;
800
+ readOnly: true;
801
+ runsCode: false;
802
+ } | {
803
+ order: number;
804
+ displayName: string;
805
+ description: string;
806
+ readOnly: true;
807
+ runsCode: false;
544
808
  } | {
545
809
  order: number;
546
810
  displayName: string;
@@ -639,6 +903,18 @@ export declare const plugin: {
639
903
  description: string;
640
904
  readOnly: true;
641
905
  runsCode: false;
906
+ } | {
907
+ order: number;
908
+ displayName: string;
909
+ description: string;
910
+ readOnly: true;
911
+ runsCode: false;
912
+ } | {
913
+ order: number;
914
+ displayName: string;
915
+ description: string;
916
+ readOnly: true;
917
+ runsCode: false;
642
918
  } | {
643
919
  order: number;
644
920
  displayName: string;
@@ -765,6 +1041,18 @@ export declare const plugin: {
765
1041
  description: string;
766
1042
  readOnly: true;
767
1043
  runsCode: false;
1044
+ } | {
1045
+ order: number;
1046
+ displayName: string;
1047
+ description: string;
1048
+ readOnly: true;
1049
+ runsCode: false;
1050
+ } | {
1051
+ order: number;
1052
+ displayName: string;
1053
+ description: string;
1054
+ readOnly: true;
1055
+ runsCode: false;
768
1056
  } | {
769
1057
  order: number;
770
1058
  displayName: string;
@@ -893,6 +1181,18 @@ export declare const plugin: {
893
1181
  description: string;
894
1182
  readOnly: true;
895
1183
  runsCode: false;
1184
+ } | {
1185
+ order: number;
1186
+ displayName: string;
1187
+ description: string;
1188
+ readOnly: true;
1189
+ runsCode: false;
1190
+ } | {
1191
+ order: number;
1192
+ displayName: string;
1193
+ description: string;
1194
+ readOnly: true;
1195
+ runsCode: false;
896
1196
  } | {
897
1197
  order: number;
898
1198
  displayName: string;
@@ -979,6 +1279,18 @@ export declare const plugin: {
979
1279
  description: string;
980
1280
  readOnly: true;
981
1281
  runsCode: false;
1282
+ } | {
1283
+ order: number;
1284
+ displayName: string;
1285
+ description: string;
1286
+ readOnly: true;
1287
+ runsCode: false;
1288
+ } | {
1289
+ order: number;
1290
+ displayName: string;
1291
+ description: string;
1292
+ readOnly: true;
1293
+ runsCode: false;
982
1294
  } | {
983
1295
  order: number;
984
1296
  displayName: string;
@@ -1065,6 +1377,18 @@ export declare const plugin: {
1065
1377
  description: string;
1066
1378
  readOnly: true;
1067
1379
  runsCode: false;
1380
+ } | {
1381
+ order: number;
1382
+ displayName: string;
1383
+ description: string;
1384
+ readOnly: true;
1385
+ runsCode: false;
1386
+ } | {
1387
+ order: number;
1388
+ displayName: string;
1389
+ description: string;
1390
+ readOnly: true;
1391
+ runsCode: false;
1068
1392
  } | {
1069
1393
  order: number;
1070
1394
  displayName: string;
@@ -1151,6 +1475,18 @@ export declare const plugin: {
1151
1475
  description: string;
1152
1476
  readOnly: true;
1153
1477
  runsCode: false;
1478
+ } | {
1479
+ order: number;
1480
+ displayName: string;
1481
+ description: string;
1482
+ readOnly: true;
1483
+ runsCode: false;
1484
+ } | {
1485
+ order: number;
1486
+ displayName: string;
1487
+ description: string;
1488
+ readOnly: true;
1489
+ runsCode: false;
1154
1490
  } | {
1155
1491
  order: number;
1156
1492
  displayName: string;
@@ -1239,6 +1575,18 @@ export declare const plugin: {
1239
1575
  description: string;
1240
1576
  readOnly: true;
1241
1577
  runsCode: false;
1578
+ } | {
1579
+ order: number;
1580
+ displayName: string;
1581
+ description: string;
1582
+ readOnly: true;
1583
+ runsCode: false;
1584
+ } | {
1585
+ order: number;
1586
+ displayName: string;
1587
+ description: string;
1588
+ readOnly: true;
1589
+ runsCode: false;
1242
1590
  } | {
1243
1591
  order: number;
1244
1592
  displayName: string;
@@ -1327,6 +1675,18 @@ export declare const plugin: {
1327
1675
  description: string;
1328
1676
  readOnly: true;
1329
1677
  runsCode: false;
1678
+ } | {
1679
+ order: number;
1680
+ displayName: string;
1681
+ description: string;
1682
+ readOnly: true;
1683
+ runsCode: false;
1684
+ } | {
1685
+ order: number;
1686
+ displayName: string;
1687
+ description: string;
1688
+ readOnly: true;
1689
+ runsCode: false;
1330
1690
  } | {
1331
1691
  order: number;
1332
1692
  displayName: string;
@@ -1413,6 +1773,18 @@ export declare const plugin: {
1413
1773
  description: string;
1414
1774
  readOnly: true;
1415
1775
  runsCode: false;
1776
+ } | {
1777
+ order: number;
1778
+ displayName: string;
1779
+ description: string;
1780
+ readOnly: true;
1781
+ runsCode: false;
1782
+ } | {
1783
+ order: number;
1784
+ displayName: string;
1785
+ description: string;
1786
+ readOnly: true;
1787
+ runsCode: false;
1416
1788
  } | {
1417
1789
  order: number;
1418
1790
  displayName: string;
@@ -1601,3 +1973,4 @@ export declare const plugin: {
1601
1973
  proactivePush: string;
1602
1974
  };
1603
1975
  };
1976
+ export { listExternalSessions, readExternalSession } from './external-session.js';
@@ -307,3 +307,4 @@ export const plugin = { entryVersion: '1.0', id: 'agent', package: '@rho-workspa
307
307
  components: [{ id: 'rho.agent-note', version: '0.2.0', owner: 'rho-plugins.agent', bindings: {}, propsSchema: layeredSchemas.AgentNoteProps, ui: './ui', presentation: { displayName: 'Agent note', description: 'A plain presentation explanation with authenticated author and binding basis.', readOnly: true, runsCode: false } }],
308
308
  skills: [{ ...agentSkill, presentation: skillPresentation }, { ...feedbackSkill, presentation: { displayName: 'Business feedback', description: 'Reads original feedback, preserves current human edits and links an explicit reply.' } }, { ...presentationSkill, presentation: { displayName: 'Presentation', description: 'Enhances the assigned visible layout without business feedback or document access.' } }],
309
309
  agent: { id: 'claude-code-mcp', transport: 'stdio', modelLoop: 'external-client', contextDelivery: 'pull-tool-result', proactivePush: 'unsupported' } };
310
+ export { listExternalSessions, readExternalSession } from './external-session.js';
@@ -1,3 +1,4 @@
1
+ export { externalSessionSchemas } from './external-session-contract.js';
1
2
  export declare const operationContracts: {
2
3
  'feedback.submit': {
3
4
  inputSchema: any;
@@ -327,4 +328,36 @@ export declare const operationContracts: {
327
328
  requires: string[];
328
329
  effect: "metadata";
329
330
  };
331
+ 'agent.sessions.list': {
332
+ inputSchema: {
333
+ type: string;
334
+ properties: Record<string, any>;
335
+ required: string[];
336
+ additionalProperties: boolean;
337
+ };
338
+ outputSchema: {
339
+ type: string;
340
+ properties: Record<string, any>;
341
+ required: string[];
342
+ additionalProperties: boolean;
343
+ };
344
+ requires: never[];
345
+ effect: "read";
346
+ };
347
+ 'agent.sessions.read': {
348
+ inputSchema: {
349
+ type: string;
350
+ properties: Record<string, any>;
351
+ required: string[];
352
+ additionalProperties: boolean;
353
+ };
354
+ outputSchema: {
355
+ type: string;
356
+ properties: Record<string, any>;
357
+ required: string[];
358
+ additionalProperties: boolean;
359
+ };
360
+ requires: never[];
361
+ effect: "read";
362
+ };
330
363
  };