@khorsheed/dsh-room 0.1.0 → 0.2.0

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 (40) hide show
  1. package/CHANGELOG.md +18 -2
  2. package/README.en.md +84 -0
  3. package/README.i18n.yaml +3 -3
  4. package/README.md +62 -26
  5. package/lib/client.js +952 -285
  6. package/lib/index.js +88 -12
  7. package/lib/{journal-CuRnWk66.js → journal-BWL3-i0s.js} +27 -0
  8. package/lib/tool.js +63 -11
  9. package/lib/typert.host.js +184 -37
  10. package/lib/typert.remote-client.d.ts +2 -0
  11. package/lib/typert.remote-client.js +151 -31
  12. package/lib/types/client/RoomActivityDock.d.ts +19 -0
  13. package/lib/types/client/RoomActivityDock.js +105 -0
  14. package/lib/types/client/RoomComposer.d.ts +1 -1
  15. package/lib/types/client/RoomComposer.js +3 -3
  16. package/lib/types/client/RoomPlanTab.d.ts +15 -0
  17. package/lib/types/client/RoomPlanTab.js +13 -0
  18. package/lib/types/client/RoomPlanView.d.ts +3 -2
  19. package/lib/types/client/RoomPlanView.js +5 -6
  20. package/lib/types/client/executions.d.ts +50 -0
  21. package/lib/types/client/executions.js +70 -0
  22. package/lib/types/client/index.d.ts +1 -1
  23. package/lib/types/client/index.js +33 -1
  24. package/lib/types/client/locales.d.ts +50 -0
  25. package/lib/types/client/locales.js +50 -0
  26. package/lib/types/client/preset-visibility.d.ts +3 -3
  27. package/lib/types/client/preset-visibility.js +2 -2
  28. package/lib/types/client/slots.d.ts +6 -1
  29. package/lib/types/dispatch.js +30 -6
  30. package/lib/types/index.d.ts +5 -0
  31. package/lib/types/index.js +42 -7
  32. package/lib/types/journal.d.ts +1 -1
  33. package/lib/types/journal.js +27 -1
  34. package/lib/types/tool-definition.d.ts +56 -0
  35. package/lib/types/tool-definition.js +393 -0
  36. package/lib/types/tool.d.ts +37 -49
  37. package/lib/types/tool.js +47 -381
  38. package/lib/types/types.d.ts +28 -0
  39. package/package.json +10 -9
  40. package/README.zh.md +0 -48
@@ -83,6 +83,8 @@ const _khorsheed_dsh_room_room_addTask_result$schema = () => (_khorsheed_dsh_roo
83
83
  })]))
84
84
  let _khorsheed_dsh_room_room_cancel_parameter_0$schema$value
85
85
  const _khorsheed_dsh_room_room_cancel_parameter_0$schema = () => (_khorsheed_dsh_room_room_cancel_parameter_0$schema$value ??= z.object({
86
+ 'expectedRunId': z.string().readonly().optional(),
87
+ 'expectedStartedAt': z.number().readonly().optional(),
86
88
  'sessionId': z.intersection(z.string(), z.unknown()).readonly(),
87
89
  'name': z.string().readonly(),
88
90
  }))
@@ -157,11 +159,87 @@ const _khorsheed_dsh_room_room_cancel_result$schema = () => (_khorsheed_dsh_room
157
159
  'message': z.string().readonly(),
158
160
  })]).readonly(),
159
161
  })]))
162
+ let _khorsheed_dsh_room_room_cancelChild_parameter_0$schema$value
163
+ const _khorsheed_dsh_room_room_cancelChild_parameter_0$schema = () => (_khorsheed_dsh_room_room_cancelChild_parameter_0$schema$value ??= z.object({
164
+ 'sessionId': z.intersection(z.string(), z.unknown()),
165
+ 'childSessionId': z.intersection(z.string(), z.unknown()),
166
+ }))
167
+ let _khorsheed_dsh_room_room_cancelChild_result$schema$value
168
+ const _khorsheed_dsh_room_room_cancelChild_result$schema = () => (_khorsheed_dsh_room_room_cancelChild_result$schema$value ??= z.union([z.object({
169
+ 'ok': z.literal(true).readonly(),
170
+ 'value': z.object({
171
+ 'cancelled': z.boolean().readonly(),
172
+ }).readonly(),
173
+ }), z.object({
174
+ 'ok': z.literal(false).readonly(),
175
+ 'error': z.union([z.object({
176
+ 'code': z.literal("request-conflict").readonly(),
177
+ }), z.object({
178
+ 'code': z.literal("member-cwd-bound").readonly(),
179
+ }), z.object({
180
+ 'code': z.literal("not-coordinator").readonly(),
181
+ }), z.object({
182
+ 'code': z.literal("delivery-not-uncertain").readonly(),
183
+ }), z.object({
184
+ 'code': z.literal("plan-reconciliation-required").readonly(),
185
+ }), z.object({
186
+ 'code': z.literal("coordinator-busy").readonly(),
187
+ }), z.object({
188
+ 'code': z.literal("coordinator-not-ready").readonly(),
189
+ 'message': z.string().readonly(),
190
+ }), z.object({
191
+ 'code': z.literal("coordinator-conflict").readonly(),
192
+ }), z.object({
193
+ 'code': z.literal("active-coordinator").readonly(),
194
+ }), z.object({
195
+ 'code': z.literal("configuration-owned-by-core").readonly(),
196
+ }), z.object({
197
+ 'code': z.literal("session-not-found").readonly(),
198
+ }), z.object({
199
+ 'code': z.literal("not-a-room").readonly(),
200
+ }), z.object({
201
+ 'code': z.literal("invalid-name").readonly(),
202
+ }), z.object({
203
+ 'code': z.literal("duplicate-name").readonly(),
204
+ }), z.object({
205
+ 'code': z.literal("empty-provider").readonly(),
206
+ }), z.object({
207
+ 'code': z.literal("member-not-found").readonly(),
208
+ }), z.object({
209
+ 'code': z.literal("empty-text").readonly(),
210
+ }), z.object({
211
+ 'code': z.literal("nothing-to-update").readonly(),
212
+ }), z.object({
213
+ 'code': z.literal("local-agent-unavailable").readonly(),
214
+ }), z.object({
215
+ 'code': z.literal("unknown-provider").readonly(),
216
+ 'provider': z.string().readonly(),
217
+ 'available': z.array(z.string()).readonly(),
218
+ }), z.object({
219
+ 'code': z.literal("unknown-targets").readonly(),
220
+ 'names': z.array(z.string()).readonly(),
221
+ }), z.object({
222
+ 'code': z.literal("no-targets").readonly(),
223
+ }), z.object({
224
+ 'code': z.literal("relay-not-found").readonly(),
225
+ }), z.object({
226
+ 'code': z.literal("relay-not-pending").readonly(),
227
+ }), z.object({
228
+ 'code': z.literal("main-member").readonly(),
229
+ }), z.object({
230
+ 'code': z.literal("task-not-found").readonly(),
231
+ }), z.object({
232
+ 'code': z.literal("task-closed").readonly(),
233
+ }), z.object({
234
+ 'code': z.literal("resume-failed").readonly(),
235
+ 'message': z.string().readonly(),
236
+ })]).readonly(),
237
+ })]))
160
238
  let _khorsheed_dsh_room_room_closeTask_parameter_0$schema$value
161
239
  const _khorsheed_dsh_room_room_closeTask_parameter_0$schema = () => (_khorsheed_dsh_room_room_closeTask_parameter_0$schema$value ??= z.object({
162
240
  'sessionId': z.intersection(z.string(), z.unknown()).readonly(),
163
241
  'taskId': z.string().readonly(),
164
- 'status': z.union([z.literal("cancelled"), z.literal("done")]).readonly().optional(),
242
+ 'status': z.union([z.literal("done"), z.literal("cancelled")]).readonly().optional(),
165
243
  }))
166
244
  let _khorsheed_dsh_room_room_closeTask_result$schema$value
167
245
  const _khorsheed_dsh_room_room_closeTask_result$schema = () => (_khorsheed_dsh_room_room_closeTask_result$schema$value ??= z.union([z.object({
@@ -394,12 +472,31 @@ let _khorsheed_dsh_room_room_getState_result$schema$value
394
472
  const _khorsheed_dsh_room_room_getState_result$schema = () => (_khorsheed_dsh_room_room_getState_result$schema$value ??= z.union([z.object({
395
473
  'ok': z.literal(true).readonly(),
396
474
  'value': z.object({
475
+ 'executions': z.array(z.object({
476
+ 'id': z.string().readonly(),
477
+ 'memberId': z.string().readonly().optional(),
478
+ 'childSessionId': z.intersection(z.string(), z.unknown()).readonly().optional(),
479
+ 'provider': z.string().readonly().optional(),
480
+ 'model': z.string().readonly().optional(),
481
+ 'effort': z.string().readonly().optional(),
482
+ 'tokens': z.number().readonly().optional(),
483
+ 'runId': z.string().readonly().optional(),
484
+ 'member': z.string().readonly(),
485
+ 'state': z.union([z.literal("running"), z.literal("done"), z.literal("cancelled"), z.literal("failed")]).readonly(),
486
+ 'startedAt': z.number().readonly(),
487
+ 'elapsedMs': z.number().readonly().optional(),
488
+ 'error': z.string().readonly().optional(),
489
+ })).readonly().optional(),
397
490
  'plan': z.object({
491
+ 'stages': z.array(z.object({
492
+ 'id': z.string(),
493
+ 'title': z.string(),
494
+ })),
398
495
  'version': z.literal(1),
399
496
  'id': z.string(),
400
497
  'revision': z.number(),
401
498
  'objective': z.string(),
402
- 'status': z.union([z.literal("cancelled"), z.literal("running"), z.literal("draft"), z.literal("paused"), z.literal("completed")]),
499
+ 'status': z.union([z.literal("draft"), z.literal("running"), z.literal("cancelled"), z.literal("paused"), z.literal("completed")]),
403
500
  'reason': z.string().optional(),
404
501
  'budget': z.object({
405
502
  'maxParallel': z.number(),
@@ -409,28 +506,24 @@ const _khorsheed_dsh_room_room_getState_result$schema = () => (_khorsheed_dsh_ro
409
506
  }),
410
507
  'activeMs': z.number(),
411
508
  'resumedAt': z.number().optional(),
412
- 'stages': z.array(z.object({
413
- 'id': z.string(),
414
- 'title': z.string(),
415
- })),
416
509
  'tasks': z.array(z.object({
417
510
  'id': z.string(),
418
511
  'title': z.string(),
419
512
  'stageId': z.string(),
420
513
  'parentId': z.string().optional(),
421
- 'kind': z.union([z.literal("group"), z.literal("task")]),
514
+ 'kind': z.union([z.literal("task"), z.literal("group")]),
422
515
  'ownerMemberId': z.string().optional(),
423
516
  'instruction': z.string(),
424
517
  'criteria': z.array(z.string()),
425
518
  'inputRefs': z.array(z.string()),
426
519
  'artifactPaths': z.array(z.string()),
427
520
  'dependsOn': z.array(z.string()),
428
- 'status': z.union([z.literal("pending"), z.literal("failed"), z.literal("cancelled"), z.literal("running"), z.literal("submitted"), z.literal("accepted")]),
521
+ 'status': z.union([z.literal("running"), z.literal("cancelled"), z.literal("pending"), z.literal("failed"), z.literal("submitted"), z.literal("accepted")]),
429
522
  'attempts': z.array(z.object({
430
523
  'id': z.string(),
431
524
  'deliveryId': z.string(),
432
525
  'number': z.number(),
433
- 'status': z.union([z.literal("failed"), z.literal("rejected"), z.literal("cancelled"), z.literal("queued"), z.literal("running"), z.literal("uncertain"), z.literal("submitted"), z.literal("accepted")]),
526
+ 'status': z.union([z.literal("running"), z.literal("cancelled"), z.literal("failed"), z.literal("rejected"), z.literal("queued"), z.literal("uncertain"), z.literal("submitted"), z.literal("accepted")]),
434
527
  'createdAt': z.number(),
435
528
  'startedAt': z.number().optional(),
436
529
  'settledAt': z.number().optional(),
@@ -464,7 +557,7 @@ const _khorsheed_dsh_room_room_getState_result$schema = () => (_khorsheed_dsh_ro
464
557
  'id': z.string().readonly(),
465
558
  'dispatchSeq': z.number().readonly(),
466
559
  'memberId': z.string().readonly(),
467
- 'status': z.union([z.literal("failed"), z.literal("cancelled"), z.literal("queued"), z.literal("running"), z.literal("done"), z.literal("uncertain")]).readonly(),
560
+ 'status': z.union([z.literal("running"), z.literal("done"), z.literal("cancelled"), z.literal("failed"), z.literal("queued"), z.literal("uncertain")]).readonly(),
468
561
  'origin': z.union([z.literal("human"), z.literal("coordinator"), z.literal("report"), z.literal("relay")]).readonly(),
469
562
  'text': z.string().readonly(),
470
563
  'error': z.string().readonly().optional(),
@@ -487,7 +580,7 @@ const _khorsheed_dsh_room_room_getState_result$schema = () => (_khorsheed_dsh_ro
487
580
  'kind': z.union([z.literal("main-agent"), z.literal("cli")]).readonly(),
488
581
  'provider': z.string().readonly().optional(),
489
582
  'instructions': z.string().readonly().optional(),
490
- 'invitedBy': z.union([z.literal("human"), z.literal("agent")]).readonly(),
583
+ 'invitedBy': z.union([z.literal("agent"), z.literal("human")]).readonly(),
491
584
  'cwd': z.string().readonly().optional(),
492
585
  'model': z.string().readonly().optional(),
493
586
  'childSessionId': z.intersection(z.string(), z.unknown()).readonly().optional(),
@@ -505,14 +598,14 @@ const _khorsheed_dsh_room_room_getState_result$schema = () => (_khorsheed_dsh_ro
505
598
  'id': z.string().readonly(),
506
599
  'member': z.string().readonly(),
507
600
  'title': z.string().readonly(),
508
- 'status': z.union([z.literal("pending"), z.literal("failed"), z.literal("cancelled"), z.literal("done"), z.literal("in_progress")]).readonly(),
601
+ 'status': z.union([z.literal("done"), z.literal("cancelled"), z.literal("pending"), z.literal("failed"), z.literal("in_progress")]).readonly(),
509
602
  'blockedBy': z.string().readonly().optional(),
510
603
  'updatedAt': z.number().readonly(),
511
604
  })).readonly(),
512
605
  'runs': z.array(z.object({
513
606
  'runId': z.string().readonly().optional(),
514
607
  'member': z.string().readonly(),
515
- 'state': z.union([z.literal("failed"), z.literal("cancelled"), z.literal("running"), z.literal("done")]).readonly(),
608
+ 'state': z.union([z.literal("running"), z.literal("done"), z.literal("cancelled"), z.literal("failed")]).readonly(),
516
609
  'startedAt': z.number().readonly(),
517
610
  'elapsedMs': z.number().readonly().optional(),
518
611
  'error': z.string().readonly().optional(),
@@ -858,7 +951,7 @@ let _khorsheed_dsh_room_room_reconcileDelivery_parameter_0$schema$value
858
951
  const _khorsheed_dsh_room_room_reconcileDelivery_parameter_0$schema = () => (_khorsheed_dsh_room_room_reconcileDelivery_parameter_0$schema$value ??= z.object({
859
952
  'sessionId': z.intersection(z.string(), z.unknown()).readonly(),
860
953
  'deliveryId': z.string().readonly(),
861
- 'outcome': z.union([z.literal("cancelled"), z.literal("done")]).readonly(),
954
+ 'outcome': z.union([z.literal("done"), z.literal("cancelled")]).readonly(),
862
955
  'evidence': z.string().readonly(),
863
956
  }))
864
957
  let _khorsheed_dsh_room_room_reconcileDelivery_result$schema$value
@@ -1271,7 +1364,7 @@ export const TYPERT_REMOTE = {
1271
1364
  create: _khorsheed_dsh_room_room_addTask_result$schema,
1272
1365
  schema: _khorsheed_dsh_room_room_addTask_result$schema(),
1273
1366
  },
1274
- sourceLocation: {"file":"packages/room/src/index.ts","line":946,"column":9},
1367
+ sourceLocation: {"file":"packages/room/src/index.ts","line":948,"column":9},
1275
1368
  },
1276
1369
  {
1277
1370
  id: '@khorsheed/dsh-room#room/cancel',
@@ -1298,7 +1391,34 @@ export const TYPERT_REMOTE = {
1298
1391
  create: _khorsheed_dsh_room_room_cancel_result$schema,
1299
1392
  schema: _khorsheed_dsh_room_room_cancel_result$schema(),
1300
1393
  },
1301
- sourceLocation: {"file":"packages/room/src/index.ts","line":1051,"column":9},
1394
+ sourceLocation: {"file":"packages/room/src/index.ts","line":1053,"column":9},
1395
+ },
1396
+ {
1397
+ id: '@khorsheed/dsh-room#room/cancelChild',
1398
+ service: 'room',
1399
+ namespace: 'room',
1400
+ method: 'cancelChild',
1401
+ invocation: { kind: 'direct' },
1402
+ parameters: [
1403
+ {
1404
+ name: 'request',
1405
+ wire: 'request',
1406
+ source: 'json',
1407
+ codec: {
1408
+ mode: 'strict',
1409
+ typeSymbol: '@khorsheed/dsh-room#room/cancelChild:request',
1410
+ create: _khorsheed_dsh_room_room_cancelChild_parameter_0$schema,
1411
+ schema: _khorsheed_dsh_room_room_cancelChild_parameter_0$schema(),
1412
+ },
1413
+ },
1414
+ ],
1415
+ result: {
1416
+ mode: 'strict',
1417
+ typeSymbol: '@khorsheed/dsh-room/types#RoomCancelResult',
1418
+ create: _khorsheed_dsh_room_room_cancelChild_result$schema,
1419
+ schema: _khorsheed_dsh_room_room_cancelChild_result$schema(),
1420
+ },
1421
+ sourceLocation: {"file":"packages/room/src/index.ts","line":1093,"column":9},
1302
1422
  },
1303
1423
  {
1304
1424
  id: '@khorsheed/dsh-room#room/closeTask',
@@ -1325,7 +1445,7 @@ export const TYPERT_REMOTE = {
1325
1445
  create: _khorsheed_dsh_room_room_closeTask_result$schema,
1326
1446
  schema: _khorsheed_dsh_room_room_closeTask_result$schema(),
1327
1447
  },
1328
- sourceLocation: {"file":"packages/room/src/index.ts","line":974,"column":9},
1448
+ sourceLocation: {"file":"packages/room/src/index.ts","line":976,"column":9},
1329
1449
  },
1330
1450
  {
1331
1451
  id: '@khorsheed/dsh-room#room/confirmRelay',
@@ -1352,7 +1472,7 @@ export const TYPERT_REMOTE = {
1352
1472
  create: _khorsheed_dsh_room_room_confirmRelay_result$schema,
1353
1473
  schema: _khorsheed_dsh_room_room_confirmRelay_result$schema(),
1354
1474
  },
1355
- sourceLocation: {"file":"packages/room/src/index.ts","line":903,"column":9},
1475
+ sourceLocation: {"file":"packages/room/src/index.ts","line":905,"column":9},
1356
1476
  },
1357
1477
  {
1358
1478
  id: '@khorsheed/dsh-room#room/dismissRelay',
@@ -1379,7 +1499,7 @@ export const TYPERT_REMOTE = {
1379
1499
  create: _khorsheed_dsh_room_room_dismissRelay_result$schema,
1380
1500
  schema: _khorsheed_dsh_room_room_dismissRelay_result$schema(),
1381
1501
  },
1382
- sourceLocation: {"file":"packages/room/src/index.ts","line":926,"column":9},
1502
+ sourceLocation: {"file":"packages/room/src/index.ts","line":928,"column":9},
1383
1503
  },
1384
1504
  {
1385
1505
  id: '@khorsheed/dsh-room#room/getState',
@@ -1406,7 +1526,7 @@ export const TYPERT_REMOTE = {
1406
1526
  create: _khorsheed_dsh_room_room_getState_result$schema,
1407
1527
  schema: _khorsheed_dsh_room_room_getState_result$schema(),
1408
1528
  },
1409
- sourceLocation: {"file":"packages/room/src/index.ts","line":347,"column":9},
1529
+ sourceLocation: {"file":"packages/room/src/index.ts","line":349,"column":9},
1410
1530
  },
1411
1531
  {
1412
1532
  id: '@khorsheed/dsh-room#room/invite',
@@ -1433,7 +1553,7 @@ export const TYPERT_REMOTE = {
1433
1553
  create: _khorsheed_dsh_room_room_invite_result$schema,
1434
1554
  schema: _khorsheed_dsh_room_room_invite_result$schema(),
1435
1555
  },
1436
- sourceLocation: {"file":"packages/room/src/index.ts","line":448,"column":3},
1556
+ sourceLocation: {"file":"packages/room/src/index.ts","line":450,"column":3},
1437
1557
  },
1438
1558
  {
1439
1559
  id: '@khorsheed/dsh-room#room/isRoom',
@@ -1460,7 +1580,7 @@ export const TYPERT_REMOTE = {
1460
1580
  create: _khorsheed_dsh_room_room_isRoom_result$schema,
1461
1581
  schema: _khorsheed_dsh_room_room_isRoom_result$schema(),
1462
1582
  },
1463
- sourceLocation: {"file":"packages/room/src/index.ts","line":270,"column":9},
1583
+ sourceLocation: {"file":"packages/room/src/index.ts","line":272,"column":9},
1464
1584
  },
1465
1585
  {
1466
1586
  id: '@khorsheed/dsh-room#room/listProviders',
@@ -1487,7 +1607,7 @@ export const TYPERT_REMOTE = {
1487
1607
  create: _khorsheed_dsh_room_room_listProviders_result$schema,
1488
1608
  schema: _khorsheed_dsh_room_room_listProviders_result$schema(),
1489
1609
  },
1490
- sourceLocation: {"file":"packages/room/src/index.ts","line":319,"column":9},
1610
+ sourceLocation: {"file":"packages/room/src/index.ts","line":321,"column":9},
1491
1611
  },
1492
1612
  {
1493
1613
  id: '@khorsheed/dsh-room#room/planCommand',
@@ -1514,7 +1634,7 @@ export const TYPERT_REMOTE = {
1514
1634
  create: _khorsheed_dsh_room_room_planCommand_result$schema,
1515
1635
  schema: _khorsheed_dsh_room_room_planCommand_result$schema(),
1516
1636
  },
1517
- sourceLocation: {"file":"packages/room/src/index.ts","line":787,"column":9},
1637
+ sourceLocation: {"file":"packages/room/src/index.ts","line":789,"column":9},
1518
1638
  },
1519
1639
  {
1520
1640
  id: '@khorsheed/dsh-room#room/postMessage',
@@ -1541,7 +1661,7 @@ export const TYPERT_REMOTE = {
1541
1661
  create: _khorsheed_dsh_room_room_postMessage_result$schema,
1542
1662
  schema: _khorsheed_dsh_room_room_postMessage_result$schema(),
1543
1663
  },
1544
- sourceLocation: {"file":"packages/room/src/index.ts","line":666,"column":9},
1664
+ sourceLocation: {"file":"packages/room/src/index.ts","line":668,"column":9},
1545
1665
  },
1546
1666
  {
1547
1667
  id: '@khorsheed/dsh-room#room/prepareMember',
@@ -1568,7 +1688,7 @@ export const TYPERT_REMOTE = {
1568
1688
  create: _khorsheed_dsh_room_room_prepareMember_result$schema,
1569
1689
  schema: _khorsheed_dsh_room_room_prepareMember_result$schema(),
1570
1690
  },
1571
- sourceLocation: {"file":"packages/room/src/index.ts","line":516,"column":9},
1691
+ sourceLocation: {"file":"packages/room/src/index.ts","line":518,"column":9},
1572
1692
  },
1573
1693
  {
1574
1694
  id: '@khorsheed/dsh-room#room/reconcileDelivery',
@@ -1595,7 +1715,7 @@ export const TYPERT_REMOTE = {
1595
1715
  create: _khorsheed_dsh_room_room_reconcileDelivery_result$schema,
1596
1716
  schema: _khorsheed_dsh_room_room_reconcileDelivery_result$schema(),
1597
1717
  },
1598
- sourceLocation: {"file":"packages/room/src/index.ts","line":542,"column":9},
1718
+ sourceLocation: {"file":"packages/room/src/index.ts","line":544,"column":9},
1599
1719
  },
1600
1720
  {
1601
1721
  id: '@khorsheed/dsh-room#room/removeMember',
@@ -1622,7 +1742,7 @@ export const TYPERT_REMOTE = {
1622
1742
  create: _khorsheed_dsh_room_room_removeMember_result$schema,
1623
1743
  schema: _khorsheed_dsh_room_room_removeMember_result$schema(),
1624
1744
  },
1625
- sourceLocation: {"file":"packages/room/src/index.ts","line":629,"column":9},
1745
+ sourceLocation: {"file":"packages/room/src/index.ts","line":631,"column":9},
1626
1746
  },
1627
1747
  {
1628
1748
  id: '@khorsheed/dsh-room#room/setCoordinator',
@@ -1649,7 +1769,7 @@ export const TYPERT_REMOTE = {
1649
1769
  create: _khorsheed_dsh_room_room_setCoordinator_result$schema,
1650
1770
  schema: _khorsheed_dsh_room_room_setCoordinator_result$schema(),
1651
1771
  },
1652
- sourceLocation: {"file":"packages/room/src/index.ts","line":559,"column":9},
1772
+ sourceLocation: {"file":"packages/room/src/index.ts","line":561,"column":9},
1653
1773
  },
1654
1774
  {
1655
1775
  id: '@khorsheed/dsh-room#room/setGoal',
@@ -1676,7 +1796,7 @@ export const TYPERT_REMOTE = {
1676
1796
  create: _khorsheed_dsh_room_room_setGoal_result$schema,
1677
1797
  schema: _khorsheed_dsh_room_room_setGoal_result$schema(),
1678
1798
  },
1679
- sourceLocation: {"file":"packages/room/src/index.ts","line":1032,"column":9},
1799
+ sourceLocation: {"file":"packages/room/src/index.ts","line":1034,"column":9},
1680
1800
  },
1681
1801
  {
1682
1802
  id: '@khorsheed/dsh-room#room/updateMember',
@@ -1703,7 +1823,7 @@ export const TYPERT_REMOTE = {
1703
1823
  create: _khorsheed_dsh_room_room_updateMember_result$schema,
1704
1824
  schema: _khorsheed_dsh_room_room_updateMember_result$schema(),
1705
1825
  },
1706
- sourceLocation: {"file":"packages/room/src/index.ts","line":471,"column":9},
1826
+ sourceLocation: {"file":"packages/room/src/index.ts","line":473,"column":9},
1707
1827
  },
1708
1828
  ],
1709
1829
  }
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { RoomState } from '../types.ts';
3
+ import type { RoomComposerProps } from './slots.ts';
4
+ export interface RoomActivityDockProps {
5
+ sessionId?: string;
6
+ backgroundSessions?: RoomComposerProps['backgroundSessions'];
7
+ activeChildren?: RoomComposerProps['activeChildren'];
8
+ stopChild?: RoomComposerProps['stopChild'];
9
+ state: RoomState;
10
+ openSession?: RoomComposerProps['openPlanSession'];
11
+ stopExecution?: RoomComposerProps['stopExecution'];
12
+ planCommand?: RoomComposerProps['planCommand'];
13
+ openPlan?: RoomComposerProps['openPlan'];
14
+ stopMember?: RoomComposerProps['stopMember'];
15
+ t: RoomComposerProps['t'];
16
+ }
17
+ /** Composer-owned capsules: panels grow above their triggers, never into the input. */
18
+ export declare function RoomActivityDock({ state, sessionId, backgroundSessions, activeChildren, stopChild, openSession, stopExecution, planCommand, openPlan, stopMember, t }: RoomActivityDockProps): ReactNode;
19
+ //# sourceMappingURL=RoomActivityDock.d.ts.map
@@ -0,0 +1,105 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState, useSyncExternalStore } from 'react';
3
+ import { IconAgentPresetOutlineMedium, IconChecklistOutlineMedium, IconStopFillMedium } from './icons.js';
4
+ import { descendantRows, executionRows } from './executions.js';
5
+ import { formatDurationMs } from './format.js';
6
+ import { RoomPlanView } from './RoomPlanView.js';
7
+ import css from './RoomActivityDock.module.css';
8
+ const EMPTY_SESSIONS = { byId: {} };
9
+ const NO_SESSIONS = { subscribe: () => () => { }, getSnapshot: () => EMPTY_SESSIONS };
10
+ /** Composer-owned capsules: panels grow above their triggers, never into the input. */
11
+ export function RoomActivityDock({ state, sessionId, backgroundSessions = NO_SESSIONS, activeChildren, stopChild, openSession, stopExecution, planCommand, openPlan, stopMember, t }) {
12
+ const [expanded, setExpanded] = useState(null);
13
+ const [filter, setFilter] = useState('recent');
14
+ const [detail, setDetail] = useState(false);
15
+ const [pending, setPending] = useState(null);
16
+ const [error, setError] = useState(null);
17
+ const [now, setNow] = useState(Date.now);
18
+ const [active, setActive] = useState([]);
19
+ const root = useRef(null);
20
+ const id = useId();
21
+ const sessions = useSyncExternalStore(backgroundSessions.subscribe, backgroundSessions.getSnapshot);
22
+ const descendants = sessionId === undefined ? [] : descendantRows(sessions.byId, sessionId, state, now, active);
23
+ const rows = [...executionRows(state), ...descendants];
24
+ const hasChildren = Object.values(sessions.byId).some(child => child.parentId === sessionId && child.origin === 'subagent');
25
+ useEffect(() => {
26
+ if (!activeChildren || !hasChildren)
27
+ return;
28
+ let disposed = false;
29
+ let pending = false;
30
+ const refresh = async () => {
31
+ if (pending)
32
+ return;
33
+ pending = true;
34
+ try {
35
+ const value = await activeChildren();
36
+ if (!disposed && value !== undefined)
37
+ setActive(value);
38
+ }
39
+ catch { /* Unknown is not evidence that a delegation stopped. */ }
40
+ finally {
41
+ pending = false;
42
+ }
43
+ };
44
+ void refresh();
45
+ const timer = setInterval(() => { void refresh(); }, 2000);
46
+ return () => { disposed = true; clearInterval(timer); };
47
+ }, [activeChildren, hasChildren]);
48
+ const running = rows.filter(row => row.status === 'running');
49
+ useEffect(() => {
50
+ if (expanded === null)
51
+ return;
52
+ const close = (event) => { if (event.target instanceof Node && !root.current?.contains(event.target))
53
+ setExpanded(null); };
54
+ const escape = (event) => { if (event.key === 'Escape') {
55
+ setExpanded(null);
56
+ root.current?.querySelector('[aria-expanded="true"]')?.focus();
57
+ } };
58
+ document.addEventListener('pointerdown', close);
59
+ document.addEventListener('keydown', escape);
60
+ return () => { document.removeEventListener('pointerdown', close); document.removeEventListener('keydown', escape); };
61
+ }, [expanded]);
62
+ useEffect(() => {
63
+ if (expanded !== 'agents' || running.length === 0)
64
+ return;
65
+ setNow(Date.now());
66
+ const timer = setInterval(() => setNow(Date.now()), 1000);
67
+ return () => clearInterval(timer);
68
+ }, [expanded, running.length]);
69
+ const stop = async (row) => {
70
+ if (pending !== null)
71
+ return;
72
+ setPending(row.id);
73
+ setError(null);
74
+ try {
75
+ const result = row.sessionTotal && row.childSessionId ? await stopChild?.(row.childSessionId) : row.execution ? await stopExecution?.(row.member, row.execution) : undefined;
76
+ if (!result)
77
+ return;
78
+ if (!result.ok)
79
+ setError(result.message);
80
+ }
81
+ catch {
82
+ setError(t('composer.error.generic'));
83
+ }
84
+ finally {
85
+ setPending(null);
86
+ }
87
+ };
88
+ const leaf = state.plan?.tasks.filter(task => task.kind === 'task' && task.status !== 'cancelled') ?? [];
89
+ const accepted = leaf.filter(task => task.status === 'accepted').length;
90
+ const visible = filter === 'running' ? running : filter === 'attention'
91
+ ? rows.filter(row => ['failed', 'uncertain', 'submitted'].includes(row.status)) : filter === 'recent' ? rows.slice(0, 6) : rows;
92
+ if (rows.length === 0 && state.plan === undefined)
93
+ return null;
94
+ return _jsxs("div", { ref: root, className: css.root, "data-testid": "room-activity-dock", children: [expanded === 'agents' && _jsxs("section", { className: css.panel, id: `${id}-agents`, "aria-label": t('activity.agents'), children: [_jsxs("div", { className: css.heading, children: [_jsx("strong", { children: t('activity.agents') }), _jsx("div", { className: css.filters, children: ['recent', 'running', 'attention', 'all'].map(value => _jsx("button", { type: "button", "aria-pressed": filter === value, onClick: () => setFilter(value), children: t(`activity.filter.${value}`) }, value)) })] }), error && _jsx("p", { role: "alert", children: error }), _jsx("div", { className: css.grid, children: visible.map(row => _jsxs("article", { className: css.card, children: [_jsxs("button", { type: "button", className: css.cardMain, disabled: !row.childSessionId || !openSession, onClick: () => row.childSessionId && openSession?.(row.childSessionId), "aria-label": `${t('activity.session')}: ${row.title}`, children: [_jsxs("span", { className: css.meta, children: [_jsx("span", { children: row.member }), _jsx("span", { "data-status": row.status, children: t(`activity.status.${row.status}`) })] }), _jsx("span", { className: css.title, title: row.title, children: row.title }), _jsx("span", { className: css.secondary, children: [row.provider, row.model, row.effort].filter(Boolean).join(' · ') })] }), row.error && _jsx("p", { className: css.error, children: row.error }), _jsxs("div", { className: css.footer, children: [_jsxs("span", { children: [row.sessionTotal ? `${t('activity.sessionTotal')} · ` : '', row.status === 'queued' ? t('activity.notStarted') : row.status === 'running' && row.startedAt !== undefined ? formatDurationMs(Math.max(0, now - row.startedAt)) : row.elapsedMs === undefined ? '—' : formatDurationMs(row.elapsedMs), row.tokens === undefined ? '' : ` · ${Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 }).format(row.tokens)} tok`] }), row.status === 'running' && ((row.execution && stopExecution) || (row.sessionTotal && stopChild)) ? _jsxs("button", { type: "button", disabled: pending !== null, onClick: () => { void stop(row); }, "aria-label": `${t('activity.stop')}: ${row.title}`, children: [_jsx(IconStopFillMedium, { size: 12 }), t('activity.stop')] })
95
+ : row.childSessionId && openSession && _jsx("button", { type: "button", onClick: () => openSession(row.childSessionId), children: t('activity.session') })] })] }, row.id)) }), visible.length === 0 && _jsx("p", { className: css.empty, children: t('activity.empty') })] }), expanded === 'plan' && state.plan && _jsxs("section", { className: css.panel, id: `${id}-plan`, "aria-label": t('activity.plan'), children: [_jsxs("div", { className: css.heading, children: [_jsx("strong", { children: state.plan.objective }), _jsxs("span", { className: css.secondary, children: [t(`plan.status.${state.plan.status}`), " \u00B7 ", t('plan.acceptedCount', { done: accepted, total: leaf.length })] })] }), state.plan.reason && _jsx("p", { className: css.error, children: state.plan.reason }), _jsx("div", { className: css.planList, children: leaf.map(task => {
96
+ const member = state.members.find(member => member.id === task.ownerMemberId);
97
+ return _jsxs("button", { type: "button", className: css.planRow, onClick: () => { if (openPlan)
98
+ openPlan();
99
+ else
100
+ setDetail(true); }, children: [_jsx("span", { className: css.taskDot, "data-status": task.status, "aria-hidden": true }), _jsx("span", { children: task.title }), _jsxs("span", { className: css.secondary, children: [member?.name, " \u00B7 ", t(`plan.status.${task.status}`)] })] }, task.id);
101
+ }) }), leaf.length === 0 && _jsx("p", { className: css.empty, children: t('activity.planning') }), _jsxs("div", { className: css.footer, children: [_jsx("span", {}), _jsx("button", { type: "button", onClick: () => { if (openPlan)
102
+ openPlan();
103
+ else
104
+ setDetail(value => !value); }, children: t('activity.planDetails') })] }), detail && !openPlan && planCommand && _jsx(RoomPlanView, { expanded: true, plan: state.plan, members: state.members, command: planCommand, openSession: openSession, stopMember: stopMember, t: t })] }), _jsxs("div", { className: css.capsules, children: [rows.length > 0 && _jsxs("button", { type: "button", className: css.capsule, "aria-expanded": expanded === 'agents', "aria-controls": `${id}-agents`, title: running.length > 0 ? t('activity.runningHint', { count: new Set(running.map(row => row.member)).size }) : t('activity.agents'), onClick: () => setExpanded(value => value === 'agents' ? null : 'agents'), children: [_jsx("span", { className: css.icon, children: running.length > 0 ? _jsx("span", { className: css.runningDot, "data-testid": "room-running-dot", "aria-hidden": true }) : _jsx(IconAgentPresetOutlineMedium, { size: 16 }) }), t('activity.agents')] }), state.plan && _jsxs("button", { type: "button", className: css.capsule, "aria-expanded": expanded === 'plan', "aria-controls": `${id}-plan`, onClick: () => setExpanded(value => value === 'plan' ? null : 'plan'), children: [_jsx(IconChecklistOutlineMedium, { size: 16 }), t('activity.plan'), " ", _jsxs("span", { className: css.secondary, children: [accepted, "/", leaf.length] })] })] })] });
105
+ }
@@ -17,5 +17,5 @@ import type { RoomComposerMatch, RoomComposerProps } from './slots.ts';
17
17
  */
18
18
  export declare function selectRoomComposer(owner: ComposerChainProps, isRoomCached: (sessionId: SessionId) => boolean): RoomComposerMatch | null;
19
19
  /** The room composer takeover component. */
20
- export declare function RoomComposer({ sessionId, roomStore, submit, stop, addTask, closeTask, setGoal, planCommand, openPlanSession, reconcileDelivery, roomCwd, invite, listProviders, listNames, browseDirectory, modelSurface, renderHarnessModelPicker, roomChrome, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, useSession, useProjection, t, }: RoomComposerProps): ReactNode;
20
+ export declare function RoomComposer({ sessionId, roomStore, submit, stop, addTask, closeTask, setGoal, planCommand, openPlanSession, openPlan, stopExecution, backgroundSessions, activeChildren, stopChild, reconcileDelivery, roomCwd, invite, listProviders, listNames, browseDirectory, modelSurface, renderHarnessModelPicker, roomChrome, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, useSession, useProjection, t, }: RoomComposerProps): ReactNode;
21
21
  //# sourceMappingURL=RoomComposer.d.ts.map
@@ -41,7 +41,7 @@ import { memberColor } from './member-color.js';
41
41
  import { RoomStatsLine } from './RoomStatsLine.js';
42
42
  import { RoomDockCapsules } from './RoomDockCapsules.js';
43
43
  import { RoomTodoStrip } from './RoomTodoStrip.js';
44
- import { RoomPlanView } from './RoomPlanView.js';
44
+ import { RoomActivityDock } from './RoomActivityDock.js';
45
45
  import { RoomQueueStrip } from './RoomQueueStrip.js';
46
46
  import { RoomRecoveryView } from './RoomRecoveryView.js';
47
47
  import { RoomModelPicker } from './RoomModelPicker.js';
@@ -91,7 +91,7 @@ export function selectRoomComposer(owner, isRoomCached) {
91
91
  return sessionId !== undefined && isRoomCached(sessionId) ? { room: true } : null;
92
92
  }
93
93
  /** The room composer takeover component. */
94
- export function RoomComposer({ sessionId, roomStore, submit, stop, addTask, closeTask, setGoal, planCommand, openPlanSession, reconcileDelivery, roomCwd, invite, listProviders, listNames, browseDirectory, modelSurface, renderHarnessModelPicker, roomChrome, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, useSession, useProjection, t, }) {
94
+ export function RoomComposer({ sessionId, roomStore, submit, stop, addTask, closeTask, setGoal, planCommand, openPlanSession, openPlan, stopExecution, backgroundSessions, activeChildren, stopChild, reconcileDelivery, roomCwd, invite, listProviders, listNames, browseDirectory, modelSurface, renderHarnessModelPicker, roomChrome, modelDirectory, renderMemberConfiguration, renderMemberInbox, stopMember, useSession, useProjection, t, }) {
95
95
  const state = useSyncExternalStore(roomStore.subscribe, () => roomStore.getCached(sessionId));
96
96
  const [draft, setDraft] = useState('');
97
97
  const [busy, setBusy] = useState(false);
@@ -201,7 +201,7 @@ export function RoomComposer({ sessionId, roomStore, submit, stop, addTask, clos
201
201
  void send();
202
202
  }
203
203
  };
204
- return (_jsxs("div", { className: css.root, children: [_jsxs("div", { className: css.dock, children: [!external && useProjection !== undefined && _jsx(RoomTodoStrip, { useProjection: useProjection, t: t }), _jsx(RoomDockCapsules, { sessionId: sessionId, roomStore: roomStore, addTask: addTask, closeTask: closeTask, setGoal: setGoal, formalPlans: planCommand !== undefined, roomCwd: roomCwd, invite: invite, listProviders: listProviders, listNames: listNames, browseDirectory: browseDirectory, modelSurface: modelSurface, renderHarnessModelPicker: renderHarnessModelPicker, roomChrome: roomChrome, t: t }), state !== undefined && planCommand !== undefined && _jsx(RoomPlanView, { plan: state.plan, members: state.members, command: planCommand, openSession: openPlanSession, stopMember: stopMember, t: t }), state !== undefined && reconcileDelivery !== undefined && _jsx(RoomRecoveryView, { deliveries: state.deliveries ?? [], members: state.members, reconcile: reconcileDelivery, openSession: openPlanSession, t: t }), _jsx(RoomQueueStrip, { items: [...external ? [] : queued, ...(state?.deliveries ?? []).filter(row => row.memberId === coordinator?.id && (row.status === 'queued' || row.status === 'uncertain')).map(row => ({ id: row.id, preview: row.status === 'uncertain' ? `${row.error ?? 'Outcome unknown'}: ${row.text}` : row.text }))], t: t })] }), error !== null && _jsx("div", { className: css.error, role: "alert", children: error }), external && coordinator.childSessionId !== undefined && renderMemberInbox?.(coordinator.childSessionId), _jsxs("div", { className: css.card, children: [_jsxs("div", { className: css.coordinator, children: [t('coordinator.label'), " \u00B7 ", coordinator?.name ?? 'dsh', external ? ` · ${coordinator.provider}` : ' · DSH'] }), mention !== null && candidates.length > 0 && (_jsx("ul", { className: css.menu, role: "listbox", "aria-label": "members", children: candidates.map((member, index) => (_jsx("li", { children: _jsxs("button", { type: "button", role: "option", "aria-selected": index === mention.index, className: index === mention.index ? css.itemActive : css.item, onMouseDown: (event) => {
204
+ return (_jsxs("div", { className: css.root, children: [_jsxs("div", { className: css.dock, children: [!external && useProjection !== undefined && _jsx(RoomTodoStrip, { useProjection: useProjection, t: t }), (state === undefined || (state.plan === undefined && (state.executions?.length ?? 0) === 0)) && _jsx(RoomDockCapsules, { sessionId: sessionId, roomStore: roomStore, addTask: addTask, closeTask: closeTask, setGoal: setGoal, formalPlans: planCommand !== undefined, roomCwd: roomCwd, invite: invite, listProviders: listProviders, listNames: listNames, browseDirectory: browseDirectory, modelSurface: modelSurface, renderHarnessModelPicker: renderHarnessModelPicker, roomChrome: roomChrome, t: t }), state !== undefined && reconcileDelivery !== undefined && _jsx(RoomRecoveryView, { deliveries: state.deliveries ?? [], members: state.members, reconcile: reconcileDelivery, openSession: openPlanSession, t: t }), _jsx(RoomQueueStrip, { items: [...external ? [] : queued, ...(state?.deliveries ?? []).filter(row => row.memberId === coordinator?.id && (row.status === 'queued' || row.status === 'uncertain')).map(row => ({ id: row.id, preview: row.status === 'uncertain' ? `${row.error ?? 'Outcome unknown'}: ${row.text}` : row.text }))], t: t }), state !== undefined && _jsx(RoomActivityDock, { sessionId: sessionId, state: state, backgroundSessions: backgroundSessions, activeChildren: activeChildren, stopChild: stopChild, openSession: openPlanSession, stopExecution: stopExecution, planCommand: planCommand, openPlan: openPlan, stopMember: stopMember, t: t }, sessionId)] }), error !== null && _jsx("div", { className: css.error, role: "alert", children: error }), external && coordinator.childSessionId !== undefined && renderMemberInbox?.(coordinator.childSessionId), _jsxs("div", { className: css.card, children: [_jsxs("div", { className: css.coordinator, children: [t('coordinator.label'), " \u00B7 ", coordinator?.name ?? 'dsh', external ? ` · ${coordinator.provider}` : ' · DSH'] }), mention !== null && candidates.length > 0 && (_jsx("ul", { className: css.menu, role: "listbox", "aria-label": "members", children: candidates.map((member, index) => (_jsx("li", { children: _jsxs("button", { type: "button", role: "option", "aria-selected": index === mention.index, className: index === mention.index ? css.itemActive : css.item, onMouseDown: (event) => {
205
205
  event.preventDefault();
206
206
  applyMention(member.name);
207
207
  }, children: [_jsx("span", { className: css.dot, style: { background: memberColor(member.name) }, "aria-hidden": true }), _jsx("span", { children: member.name }), _jsx("span", { className: css.hint, children: member.kind === 'main-agent' ? t('member.kind.main') : member.provider ?? '' })] }) }, member.name))) })), _jsx("textarea", { ref: areaRef, className: css.input, rows: 2, value: draft, placeholder: t('composer.placeholder'), onChange: onChange, onKeyDown: onKeyDown }), _jsxs("div", { className: css.row, children: [external && coordinator.childSessionId !== undefined && renderMemberConfiguration?.(coordinator.childSessionId), !external && modelDirectory !== undefined && (_jsx(RoomModelPicker, { directory: modelDirectory, onError: setError, t: t })), running && (_jsx("button", { type: "button", className: css.primary, "aria-label": t('composer.stop'), onMouseDown: (event) => { event.preventDefault(); }, onClick: () => { if (external)
@@ -0,0 +1,15 @@
1
+ import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { RoomComposerInjected } from './slots.ts';
3
+ export declare const ROOM_PLAN_KIND = "room-plan";
4
+ export declare const ROOM_PLAN_TAB_ID = "@khorsheed/dsh-room/plan";
5
+ declare module '@deepseek-ai/dsh-client-ui-sidebar-right/client' {
6
+ interface SidebarRightTabParamsMap {
7
+ 'room-plan': Record<string, never>;
8
+ }
9
+ }
10
+ type Injected = Pick<RoomComposerInjected, 'roomStore' | 'planCommand' | 'openPlanSession' | 'stopMember'>;
11
+ type Props = PropsRuntime<'sidebar.right.pane.tab'> & InjectFace<Injected> & PropsLocale<'room'>;
12
+ /** Uses the host's session-scoped sidebar, with the same review commands as the dock. */
13
+ export declare function RoomPlanTab({ sessionId, roomStore, planCommand, openPlanSession, stopMember, t }: Props): import("react").JSX.Element | null;
14
+ export {};
15
+ //# sourceMappingURL=RoomPlanTab.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useSyncExternalStore } from 'react';
3
+ import { RoomPlanView } from './RoomPlanView.js';
4
+ export const ROOM_PLAN_KIND = 'room-plan';
5
+ export const ROOM_PLAN_TAB_ID = '@khorsheed/dsh-room/plan';
6
+ /** Uses the host's session-scoped sidebar, with the same review commands as the dock. */
7
+ export function RoomPlanTab({ sessionId, roomStore, planCommand, openPlanSession, stopMember, t }) {
8
+ const state = useSyncExternalStore(roomStore.subscribe, () => roomStore.getCached(sessionId));
9
+ useEffect(() => { void roomStore.ensure(sessionId); }, [roomStore, sessionId]);
10
+ if (!state || !planCommand)
11
+ return null;
12
+ return _jsx(RoomPlanView, { expanded: true, plan: state.plan, members: state.members, command: planCommand, openSession: openPlanSession, stopMember: stopMember, t: t }, sessionId);
13
+ }
@@ -4,14 +4,15 @@ import type { RoomMember } from '../types.ts';
4
4
  import type { RoomComposerProps, RoomMutationOutcome } from './slots.ts';
5
5
  type PlanView = Omit<RoomPlan, 'requests'>;
6
6
  export interface RoomPlanViewProps {
7
+ expanded?: boolean;
7
8
  plan?: PlanView | undefined;
8
9
  members: readonly RoomMember[];
9
10
  command: (json: string) => Promise<RoomMutationOutcome>;
10
11
  openSession?: ((id: string) => void) | undefined;
11
- stopMember?: ((name: string) => void) | undefined;
12
+ stopMember?: ((name: string, expectedRunId?: string) => void) | undefined;
12
13
  t: RoomComposerProps['t'];
13
14
  }
14
15
  /** Goal review is optional room chrome; ordinary chat never opens this form. */
15
- export declare function RoomPlanView({ plan, members, command, openSession, stopMember, t }: RoomPlanViewProps): ReactNode;
16
+ export declare function RoomPlanView({ plan, members, command, openSession, stopMember, expanded, t }: RoomPlanViewProps): ReactNode;
16
17
  export {};
17
18
  //# sourceMappingURL=RoomPlanView.d.ts.map