@wowyuarm/dsh-agent-team 0.1.5 → 0.1.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 (47) hide show
  1. package/README.md +15 -1
  2. package/README.zh.md +15 -1
  3. package/package.json +7 -2
  4. package/packages/agent-team/README.md +6 -0
  5. package/packages/agent-team/README.zh.md +6 -0
  6. package/packages/agent-team/core-skills/member-skill-manager/SKILL.md +41 -0
  7. package/packages/agent-team/core-skills/member-skill-manager/references/auth-and-config.md +30 -0
  8. package/packages/agent-team/core-skills/member-skill-manager/references/writing-great-skills.md +17 -0
  9. package/packages/agent-team/lib/index.js +255 -2
  10. package/packages/agent-team/lib/ledger.js +139 -5
  11. package/packages/agent-team/lib/member-context.js +2 -2
  12. package/packages/agent-team/lib/member-skills.js +94 -0
  13. package/packages/agent-team/lib/spec.js +26 -0
  14. package/packages/agent-team/lib/typert.host.js +131 -28
  15. package/packages/agent-team/lib/typert.remote-client.d.ts.map +1 -1
  16. package/packages/agent-team/lib/typert.remote-client.js +99 -23
  17. package/packages/agent-team/lib/types/index.d.ts +69 -1
  18. package/packages/agent-team/lib/types/index.d.ts.map +1 -1
  19. package/packages/agent-team/lib/types/ledger.d.ts +29 -1
  20. package/packages/agent-team/lib/types/ledger.d.ts.map +1 -1
  21. package/packages/agent-team/lib/types/member-skills.d.ts +45 -0
  22. package/packages/agent-team/lib/types/member-skills.d.ts.map +1 -0
  23. package/packages/agent-team/lib/types/spec.d.ts.map +1 -1
  24. package/packages/agent-team/lib/types/types.d.ts +87 -2
  25. package/packages/agent-team/lib/types/types.d.ts.map +1 -1
  26. package/packages/agent-team/preset/team-member/agent.cordis.yml +7 -4
  27. package/packages/client-agent-team/README.md +1 -1
  28. package/packages/client-agent-team/README.zh.md +1 -1
  29. package/packages/client-agent-team/lib/client.js +217 -299
  30. package/packages/client-agent-team/lib/client.js.map +1 -1
  31. package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts +1 -4
  32. package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.d.ts.map +1 -1
  33. package/packages/client-agent-team/lib/types/client/TeamAgentsPanel.js +11 -23
  34. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts +4 -8
  35. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.d.ts.map +1 -1
  36. package/packages/client-agent-team/lib/types/client/TeamMemberEditor.js +7 -40
  37. package/packages/client-agent-team/lib/types/client/TeamThreadPage.d.ts.map +1 -1
  38. package/packages/client-agent-team/lib/types/client/TeamThreadPage.js +61 -20
  39. package/packages/client-agent-team/lib/types/client/TeamWorkspaceBrowser.js +1 -1
  40. package/packages/client-agent-team/lib/types/client/locales.d.ts +4 -16
  41. package/packages/client-agent-team/lib/types/client/locales.d.ts.map +1 -1
  42. package/packages/client-agent-team/lib/types/client/locales.js +4 -16
  43. package/packages/client-agent-team/lib/types/client/timeline-scroll.d.ts +5 -7
  44. package/packages/client-agent-team/lib/types/client/timeline-scroll.d.ts.map +1 -1
  45. package/packages/client-agent-team/lib/types/client/timeline-scroll.js +9 -22
  46. package/packages/tool-agent-team/lib/index.js +25 -5
  47. package/packages/tool-agent-team/lib/types/index.d.ts.map +1 -1
@@ -4092,6 +4092,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4092
4092
  "model": string().readonly(),
4093
4093
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
4094
4094
  }).readonly().optional(),
4095
+ "capabilities": object({
4096
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
4097
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
4098
+ }).readonly().optional(),
4095
4099
  "channelRefs": array(intersection(string(), unknown())).readonly()
4096
4100
  });
4097
4101
  const _wowyuarm_dsh_agent_team_agentTeam_addMember_result$schema = object({
@@ -4113,6 +4117,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4113
4117
  "model": string().readonly(),
4114
4118
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
4115
4119
  })]).readonly().optional(),
4120
+ "capabilities": union([_undefined(), object({
4121
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
4122
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
4123
+ })]).readonly().optional(),
4116
4124
  "privateMemoryPath": string().readonly(),
4117
4125
  "state": union([
4118
4126
  literal("enabled"),
@@ -4132,7 +4140,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4132
4140
  literal("working"),
4133
4141
  literal("error")
4134
4142
  ]).readonly(),
4135
- "diagnostic": string().readonly().optional()
4143
+ "diagnostic": string().readonly().optional(),
4144
+ "capabilityWarnings": union([_undefined(), array(object({
4145
+ "name": string().readonly(),
4146
+ "knownNames": array(string()).readonly()
4147
+ }))]).readonly().optional()
4136
4148
  }).readonly()
4137
4149
  });
4138
4150
  const _wowyuarm_dsh_agent_team_agentTeam_changeAttention_parameter_0$schema = object({
@@ -4305,6 +4317,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4305
4317
  "model": string().readonly(),
4306
4318
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
4307
4319
  })]).readonly().optional(),
4320
+ "capabilities": union([_undefined(), object({
4321
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
4322
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
4323
+ })]).readonly().optional(),
4308
4324
  "privateMemoryPath": string().readonly(),
4309
4325
  "state": union([
4310
4326
  literal("enabled"),
@@ -4324,7 +4340,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4324
4340
  literal("working"),
4325
4341
  literal("error")
4326
4342
  ]).readonly(),
4327
- "diagnostic": string().readonly().optional()
4343
+ "diagnostic": string().readonly().optional(),
4344
+ "capabilityWarnings": union([_undefined(), array(object({
4345
+ "name": string().readonly(),
4346
+ "knownNames": array(string()).readonly()
4347
+ }))]).readonly().optional()
4328
4348
  }).readonly()
4329
4349
  });
4330
4350
  const _wowyuarm_dsh_agent_team_agentTeam_createChannel_parameter_0$schema = object({
@@ -4427,6 +4447,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4427
4447
  "model": string().readonly(),
4428
4448
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
4429
4449
  })]).readonly().optional(),
4450
+ "capabilities": union([_undefined(), object({
4451
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
4452
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
4453
+ })]).readonly().optional(),
4430
4454
  "state": union([
4431
4455
  literal("enabled"),
4432
4456
  literal("suspended"),
@@ -4445,7 +4469,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4445
4469
  literal("working"),
4446
4470
  literal("error")
4447
4471
  ]).readonly(),
4448
- "diagnostic": string().readonly().optional()
4472
+ "diagnostic": string().readonly().optional(),
4473
+ "capabilityWarnings": union([_undefined(), array(object({
4474
+ "name": string().readonly(),
4475
+ "knownNames": array(string()).readonly()
4476
+ }))]).readonly().optional()
4449
4477
  }));
4450
4478
  const _wowyuarm_dsh_agent_team_agentTeam_promoteThread_parameter_0$schema = object({
4451
4479
  "requestId": intersection(string(), unknown()).readonly(),
@@ -4695,6 +4723,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4695
4723
  "model": string().readonly(),
4696
4724
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
4697
4725
  })]).readonly().optional(),
4726
+ "capabilities": union([_undefined(), object({
4727
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
4728
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
4729
+ })]).readonly().optional(),
4698
4730
  "privateMemoryPath": string().readonly(),
4699
4731
  "state": union([
4700
4732
  literal("enabled"),
@@ -4714,7 +4746,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4714
4746
  literal("working"),
4715
4747
  literal("error")
4716
4748
  ]).readonly(),
4717
- "diagnostic": string().readonly().optional()
4749
+ "diagnostic": string().readonly().optional(),
4750
+ "capabilityWarnings": union([_undefined(), array(object({
4751
+ "name": string().readonly(),
4752
+ "knownNames": array(string()).readonly()
4753
+ }))]).readonly().optional()
4718
4754
  }).readonly() });
4719
4755
  const _wowyuarm_dsh_agent_team_agentTeam_removeChannelMember_parameter_0$schema = object({
4720
4756
  "requestId": intersection(string(), unknown()).readonly(),
@@ -5127,6 +5163,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5127
5163
  "provider": string().readonly(),
5128
5164
  "model": string().readonly(),
5129
5165
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
5166
+ }).readonly().optional(),
5167
+ "capabilities": object({
5168
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
5169
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
5130
5170
  }).readonly().optional()
5131
5171
  });
5132
5172
  const _wowyuarm_dsh_agent_team_agentTeam_updateMember_result$schema = object({
@@ -5148,6 +5188,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5148
5188
  "model": string().readonly(),
5149
5189
  "reasoningEffort": intersection(string(), unknown()).readonly().optional()
5150
5190
  })]).readonly().optional(),
5191
+ "capabilities": union([_undefined(), object({
5192
+ "tools": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional(),
5193
+ "skills": union([_undefined(), object({ "allow": array(string()).readonly().optional() })]).readonly().optional()
5194
+ })]).readonly().optional(),
5151
5195
  "privateMemoryPath": string().readonly(),
5152
5196
  "state": union([
5153
5197
  literal("enabled"),
@@ -5167,7 +5211,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5167
5211
  literal("working"),
5168
5212
  literal("error")
5169
5213
  ]).readonly(),
5170
- "diagnostic": string().readonly().optional()
5214
+ "diagnostic": string().readonly().optional(),
5215
+ "capabilityWarnings": union([_undefined(), array(object({
5216
+ "name": string().readonly(),
5217
+ "knownNames": array(string()).readonly()
5218
+ }))]).readonly().optional()
5171
5219
  }).readonly()
5172
5220
  });
5173
5221
  const _wowyuarm_dsh_agent_team_agentTeam_view_parameter_0$schema = object({
@@ -5344,7 +5392,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5344
5392
  },
5345
5393
  sourceLocation: {
5346
5394
  "file": "packages/agent-team/src/index.ts",
5347
- "line": 397,
5395
+ "line": 460,
5348
5396
  "column": 9
5349
5397
  }
5350
5398
  },
@@ -5371,7 +5419,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5371
5419
  },
5372
5420
  sourceLocation: {
5373
5421
  "file": "packages/agent-team/src/index.ts",
5374
- "line": 738,
5422
+ "line": 848,
5375
5423
  "column": 9
5376
5424
  }
5377
5425
  },
@@ -5399,7 +5447,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5399
5447
  },
5400
5448
  sourceLocation: {
5401
5449
  "file": "packages/agent-team/src/index.ts",
5402
- "line": 334,
5450
+ "line": 397,
5403
5451
  "column": 9
5404
5452
  }
5405
5453
  },
@@ -5426,7 +5474,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5426
5474
  },
5427
5475
  sourceLocation: {
5428
5476
  "file": "packages/agent-team/src/index.ts",
5429
- "line": 628,
5477
+ "line": 738,
5430
5478
  "column": 9
5431
5479
  }
5432
5480
  },
@@ -5453,7 +5501,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5453
5501
  },
5454
5502
  sourceLocation: {
5455
5503
  "file": "packages/agent-team/src/index.ts",
5456
- "line": 489,
5504
+ "line": 553,
5457
5505
  "column": 9
5458
5506
  }
5459
5507
  },
@@ -5480,7 +5528,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5480
5528
  },
5481
5529
  sourceLocation: {
5482
5530
  "file": "packages/agent-team/src/index.ts",
5483
- "line": 375,
5531
+ "line": 438,
5484
5532
  "column": 9
5485
5533
  }
5486
5534
  },
@@ -5507,7 +5555,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5507
5555
  },
5508
5556
  sourceLocation: {
5509
5557
  "file": "packages/agent-team/src/index.ts",
5510
- "line": 724,
5558
+ "line": 834,
5511
5559
  "column": 9
5512
5560
  }
5513
5561
  },
@@ -5534,7 +5582,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5534
5582
  },
5535
5583
  sourceLocation: {
5536
5584
  "file": "packages/agent-team/src/index.ts",
5537
- "line": 747,
5585
+ "line": 857,
5538
5586
  "column": 3
5539
5587
  }
5540
5588
  },
@@ -5561,7 +5609,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5561
5609
  },
5562
5610
  sourceLocation: {
5563
5611
  "file": "packages/agent-team/src/index.ts",
5564
- "line": 648,
5612
+ "line": 758,
5565
5613
  "column": 9
5566
5614
  }
5567
5615
  },
@@ -5589,7 +5637,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5589
5637
  },
5590
5638
  sourceLocation: {
5591
5639
  "file": "packages/agent-team/src/index.ts",
5592
- "line": 325,
5640
+ "line": 388,
5593
5641
  "column": 3
5594
5642
  }
5595
5643
  },
@@ -5616,7 +5664,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5616
5664
  },
5617
5665
  sourceLocation: {
5618
5666
  "file": "packages/agent-team/src/index.ts",
5619
- "line": 638,
5667
+ "line": 748,
5620
5668
  "column": 9
5621
5669
  }
5622
5670
  },
@@ -5643,7 +5691,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5643
5691
  },
5644
5692
  sourceLocation: {
5645
5693
  "file": "packages/agent-team/src/index.ts",
5646
- "line": 711,
5694
+ "line": 821,
5647
5695
  "column": 9
5648
5696
  }
5649
5697
  },
@@ -5670,7 +5718,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5670
5718
  },
5671
5719
  sourceLocation: {
5672
5720
  "file": "packages/agent-team/src/index.ts",
5673
- "line": 754,
5721
+ "line": 864,
5674
5722
  "column": 9
5675
5723
  }
5676
5724
  },
@@ -5697,7 +5745,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5697
5745
  },
5698
5746
  sourceLocation: {
5699
5747
  "file": "packages/agent-team/src/index.ts",
5700
- "line": 450,
5748
+ "line": 514,
5701
5749
  "column": 9
5702
5750
  }
5703
5751
  },
@@ -5724,7 +5772,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5724
5772
  },
5725
5773
  sourceLocation: {
5726
5774
  "file": "packages/agent-team/src/index.ts",
5727
- "line": 659,
5775
+ "line": 769,
5728
5776
  "column": 9
5729
5777
  }
5730
5778
  },
@@ -5751,7 +5799,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5751
5799
  },
5752
5800
  sourceLocation: {
5753
5801
  "file": "packages/agent-team/src/index.ts",
5754
- "line": 732,
5802
+ "line": 842,
5755
5803
  "column": 9
5756
5804
  }
5757
5805
  },
@@ -5778,7 +5826,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5778
5826
  },
5779
5827
  sourceLocation: {
5780
5828
  "file": "packages/agent-team/src/index.ts",
5781
- "line": 312,
5829
+ "line": 375,
5782
5830
  "column": 3
5783
5831
  }
5784
5832
  },
@@ -5805,7 +5853,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5805
5853
  },
5806
5854
  sourceLocation: {
5807
5855
  "file": "packages/agent-team/src/index.ts",
5808
- "line": 668,
5856
+ "line": 778,
5809
5857
  "column": 9
5810
5858
  }
5811
5859
  },
@@ -5832,7 +5880,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5832
5880
  },
5833
5881
  sourceLocation: {
5834
5882
  "file": "packages/agent-team/src/index.ts",
5835
- "line": 770,
5883
+ "line": 880,
5836
5884
  "column": 3
5837
5885
  }
5838
5886
  },
@@ -5859,7 +5907,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5859
5907
  },
5860
5908
  sourceLocation: {
5861
5909
  "file": "packages/agent-team/src/index.ts",
5862
- "line": 763,
5910
+ "line": 873,
5863
5911
  "column": 3
5864
5912
  }
5865
5913
  },
@@ -5886,7 +5934,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5886
5934
  },
5887
5935
  sourceLocation: {
5888
5936
  "file": "packages/agent-team/src/index.ts",
5889
- "line": 387,
5937
+ "line": 450,
5890
5938
  "column": 9
5891
5939
  }
5892
5940
  },
@@ -5913,7 +5961,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5913
5961
  },
5914
5962
  sourceLocation: {
5915
5963
  "file": "packages/agent-team/src/index.ts",
5916
- "line": 598,
5964
+ "line": 665,
5917
5965
  "column": 9
5918
5966
  }
5919
5967
  },
@@ -5940,7 +5988,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5940
5988
  },
5941
5989
  sourceLocation: {
5942
5990
  "file": "packages/agent-team/src/index.ts",
5943
- "line": 777,
5991
+ "line": 887,
5944
5992
  "column": 3
5945
5993
  }
5946
5994
  }
@@ -7750,46 +7798,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7750
7798
  //#endregion
7751
7799
  //#region src/client/timeline-scroll.ts
7752
7800
  const BOTTOM_MARGIN_PX = 48;
7753
- const BOUNDARY_OFFSET_PX = 12;
7754
7801
  /**
7755
7802
  * Chat-timeline scroll policy shared by the Channel and Thread pages: follow
7756
- * new facts only while the reader stays pinned to the bottom, keep prepended
7757
- * history visually stable, and honor explicit jump requests exactly once per
7758
- * content commit. The content key must change whenever rendered facts change.
7803
+ * new facts only while the reader stays pinned to the bottom, and keep
7804
+ * prepended history visually stable. The content key must change whenever
7805
+ * rendered facts change.
7759
7806
  */
7760
7807
  function useTimelineScroll(contentKey) {
7761
7808
  const ref = (0, react.useRef)(null);
7762
7809
  const pinnedRef = (0, react.useRef)(true);
7763
7810
  const heightRef = (0, react.useRef)(0);
7764
- const jumpRef = (0, react.useRef)();
7765
7811
  const onScroll = (0, react.useCallback)(() => {
7766
7812
  const element = ref.current;
7767
7813
  if (element === null) return;
7768
7814
  pinnedRef.current = element.scrollHeight - element.scrollTop - element.clientHeight < BOTTOM_MARGIN_PX;
7769
7815
  }, []);
7770
- const jumpToBoundary = (0, react.useCallback)(() => {
7771
- jumpRef.current = "boundary";
7772
- pinnedRef.current = false;
7773
- }, []);
7774
- const jumpToLatest = (0, react.useCallback)(() => {
7775
- jumpRef.current = "latest";
7816
+ const scrollToBottom = (0, react.useCallback)(() => {
7817
+ const element = ref.current;
7776
7818
  pinnedRef.current = true;
7819
+ if (element !== null) element.scrollTop = element.scrollHeight;
7777
7820
  }, []);
7778
7821
  (0, react.useEffect)(() => {
7779
7822
  const element = ref.current;
7780
7823
  if (element === null) return;
7781
7824
  const previousHeight = heightRef.current;
7782
7825
  heightRef.current = element.scrollHeight;
7783
- const jump = jumpRef.current;
7784
- jumpRef.current = void 0;
7785
- if (jump === "boundary") {
7786
- const marker = element.querySelector("[data-thread-boundary]");
7787
- if (marker !== null) {
7788
- element.scrollTop += marker.getBoundingClientRect().top - element.getBoundingClientRect().top - BOUNDARY_OFFSET_PX;
7789
- return;
7790
- }
7791
- }
7792
- if (jump === "latest" || pinnedRef.current) {
7826
+ if (pinnedRef.current) {
7793
7827
  element.scrollTop = element.scrollHeight;
7794
7828
  return;
7795
7829
  }
@@ -7799,8 +7833,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7799
7833
  ref,
7800
7834
  onScroll,
7801
7835
  isPinned: () => pinnedRef.current,
7802
- jumpToBoundary,
7803
- jumpToLatest
7836
+ scrollToBottom
7804
7837
  };
7805
7838
  }
7806
7839
  /**
@@ -7900,7 +7933,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7900
7933
  };
7901
7934
  //#endregion
7902
7935
  //#region \0dsh-css:/home/yu/projects/dsh-agent-team/packages/client-agent-team/src/client/thread.module.css.mjs
7903
- const css$2 = ".-Qiwua_titleLine{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.-Qiwua_titleLine h1{margin:0}.-Qiwua_workSection{border-top:1px solid var(--dsw-alias-border-l2);max-width:880px;margin:12px auto 0;padding-top:8px}.-Qiwua_riskSection{border-top:1px solid var(--dsw-alias-border-l2);max-width:880px;margin:12px auto 0;padding-top:10px}.-Qiwua_riskSection h2{color:var(--dsw-alias-state-error-primary);margin:0 0 5px;font-size:12px;font-weight:600;line-height:18px}.-Qiwua_riskRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin:3px 0;font-size:12px;line-height:18px;display:flex}.-Qiwua_claimList{gap:4px;padding:4px 0 2px 22px;display:grid}.-Qiwua_claimRow{border-radius:6px;grid-template-columns:14px minmax(96px,auto) minmax(0,1fr) auto auto;align-items:center;gap:4px 8px;min-height:36px;padding:4px 6px;display:grid}.-Qiwua_claimRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.-Qiwua_claimOwner{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;line-height:18px;overflow:hidden}.-Qiwua_claimDirection{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;min-width:0;font-size:12px;line-height:18px}.-Qiwua_claimState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:18px}.-Qiwua_emptyClaims{color:var(--dsw-alias-label-tertiary);margin:0;padding:5px 6px;font-size:11px;line-height:18px}.-Qiwua_activityRow{color:var(--dsw-alias-label-tertiary);text-align:center;justify-content:center;align-items:center;gap:8px;max-width:100%;margin:4px auto;padding:5px 12px;font-size:11px;line-height:18px;display:flex}.-Qiwua_activityText{overflow-wrap:anywhere;min-width:0}.-Qiwua_activityMark{background:var(--dsw-alias-border-l3);border-radius:50%;flex:0 0 5px;width:5px;height:5px}.-Qiwua_activityRow:has(+.-Qiwua_activityRow),.-Qiwua_activityRow+.-Qiwua_activityRow{text-align:left;justify-content:flex-start;padding-left:38px}.-Qiwua_historySection{border-bottom:1px solid var(--dsw-alias-border-l2);max-width:100%;margin:0 auto 12px;padding-bottom:10px}.-Qiwua_historySection h2{color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;text-transform:uppercase;margin:0 0 4px;font-size:11px;font-weight:600;line-height:16px}.-Qiwua_publicSection{min-width:0}.-Qiwua_unreadBoundary{color:var(--dsw-alias-label-tertiary);align-items:center;gap:10px;margin:10px 0 6px;font-size:11px;line-height:16px;display:flex}.-Qiwua_unreadBoundary:before,.-Qiwua_unreadBoundary:after{background:var(--dsw-alias-border-l3);content:\"\";flex:1;height:1px}.-Qiwua_unreadBoundary span{flex:none}.-Qiwua_daySeparator{color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;align-items:center;gap:10px;margin:12px 0 4px;font-size:11px;line-height:16px;display:flex}.-Qiwua_daySeparator:before,.-Qiwua_daySeparator:after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;height:1px}.-Qiwua_daySeparator span{flex:none}.-Qiwua_newUpdates{background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));border:1px solid var(--dsw-alias-border-l2-darkmode-thin);box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-secondary);z-index:2;border-radius:999px;justify-content:center;align-items:center;gap:8px;width:fit-content;margin:8px auto;padding:4px 6px 4px 12px;font-size:12px;line-height:18px;display:flex;position:sticky;bottom:8px}.-Qiwua_taskTitle{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;margin:2px 0 0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.-Qiwua_closedBar{flex-direction:column;align-items:center;display:flex}.-Qiwua_closedNotice{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px;padding:10px 16px 14px;font-size:13px;line-height:20px;display:flex}@media (width<=600px){.-Qiwua_claimRow{grid-template-columns:14px minmax(0,1fr) auto;align-items:start}.-Qiwua_claimState{grid-area:1/3;justify-self:end}.-Qiwua_claimDirection{grid-column:2/-1}.-Qiwua_activityRow{padding-inline:0}.-Qiwua_newUpdates{max-width:calc(100% - 16px)}}";
7936
+ const css$2 = ".-Qiwua_titleLine{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.-Qiwua_titleLine h1{margin:0}.-Qiwua_workSection{border-top:1px solid var(--dsw-alias-border-l2);max-width:880px;margin:12px auto 0;padding-top:8px}.-Qiwua_riskSection{border-top:1px solid var(--dsw-alias-border-l2);max-width:880px;margin:12px auto 0;padding-top:10px}.-Qiwua_riskSection h2{color:var(--dsw-alias-state-error-primary);margin:0 0 5px;font-size:12px;font-weight:600;line-height:18px}.-Qiwua_riskRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin:3px 0;font-size:12px;line-height:18px;display:flex}.-Qiwua_claimList{gap:4px;padding:4px 0 2px 22px;display:grid}.-Qiwua_claimRow{border-radius:6px;grid-template-columns:14px minmax(96px,auto) minmax(0,1fr) auto auto;align-items:center;gap:4px 8px;min-height:36px;padding:4px 6px;display:grid}.-Qiwua_claimRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.-Qiwua_claimOwner{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;line-height:18px;overflow:hidden}.-Qiwua_claimDirection{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;min-width:0;font-size:12px;line-height:18px}.-Qiwua_claimState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:18px}.-Qiwua_emptyClaims{color:var(--dsw-alias-label-tertiary);margin:0;padding:5px 6px;font-size:11px;line-height:18px}.-Qiwua_activityRow{color:var(--dsw-alias-label-tertiary);text-align:center;justify-content:center;align-items:center;gap:8px;max-width:100%;margin:4px auto;padding:5px 12px;font-size:11px;line-height:18px;display:flex}.-Qiwua_activityText{overflow-wrap:anywhere;min-width:0}.-Qiwua_activityMark{background:var(--dsw-alias-border-l3);border-radius:50%;flex:0 0 5px;width:5px;height:5px}.-Qiwua_activityRow:has(+.-Qiwua_activityRow),.-Qiwua_activityRow+.-Qiwua_activityRow{text-align:left;justify-content:flex-start;padding-left:38px}.-Qiwua_historySection{border-bottom:1px solid var(--dsw-alias-border-l2);max-width:100%;margin:0 auto 12px;padding-bottom:10px}.-Qiwua_historySection h2{color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;text-transform:uppercase;margin:0 0 4px;font-size:11px;font-weight:600;line-height:16px}.-Qiwua_publicSection{min-width:0}.-Qiwua_unreadBoundary{color:var(--dsw-alias-label-tertiary);align-items:center;gap:10px;margin:10px 0 6px;font-size:11px;line-height:16px;display:flex}.-Qiwua_unreadBoundary:before,.-Qiwua_unreadBoundary:after{background:var(--dsw-alias-border-l3);content:\"\";flex:1;height:1px}.-Qiwua_unreadBoundary span{flex:none}.-Qiwua_daySeparator{color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;align-items:center;gap:10px;margin:12px 0 4px;font-size:11px;line-height:16px;display:flex}.-Qiwua_daySeparator:before,.-Qiwua_daySeparator:after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;height:1px}.-Qiwua_daySeparator span{flex:none}.-Qiwua_newUpdates{background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));border:1px solid var(--dsw-alias-border-l2-darkmode-thin);box-shadow:var(--dsw-shadow-lv2);z-index:2;border-radius:999px;justify-content:center;align-items:center;width:fit-content;margin:8px auto;padding:4px 12px;font-size:12px;line-height:18px;display:flex;position:sticky;bottom:8px}.-Qiwua_newUpdatesJump{color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;line-height:inherit;background:0 0;border:0;padding:0}.-Qiwua_newUpdatesJump:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:6px}.-Qiwua_taskTitle{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;margin:2px 0 0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.-Qiwua_closedBar{flex-direction:column;align-items:center;display:flex}.-Qiwua_closedNotice{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px;padding:10px 16px 14px;font-size:13px;line-height:20px;display:flex}@media (width<=600px){.-Qiwua_claimRow{grid-template-columns:14px minmax(0,1fr) auto;align-items:start}.-Qiwua_claimState{grid-area:1/3;justify-self:end}.-Qiwua_claimDirection{grid-column:2/-1}.-Qiwua_activityRow{padding-inline:0}.-Qiwua_newUpdates{max-width:calc(100% - 16px)}}";
7904
7937
  const tagId$2 = "@wowyuarm/dsh-agent-team/thread.module.css";
7905
7938
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
7906
7939
  const tag = document.createElement("style");
@@ -7924,6 +7957,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7924
7957
  "emptyClaims": "-Qiwua_emptyClaims",
7925
7958
  "historySection": "-Qiwua_historySection",
7926
7959
  "newUpdates": "-Qiwua_newUpdates",
7960
+ "newUpdatesJump": "-Qiwua_newUpdatesJump",
7927
7961
  "publicSection": "-Qiwua_publicSection",
7928
7962
  "riskRow": "-Qiwua_riskRow",
7929
7963
  "riskSection": "-Qiwua_riskSection",
@@ -8487,7 +8521,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8487
8521
  const [readFacts, setReadFacts] = (0, react.useState)([]);
8488
8522
  const [historyCursor, setHistoryCursor] = (0, react.useState)();
8489
8523
  const [historyHasMore, setHistoryHasMore] = (0, react.useState)(false);
8490
- const [remainingUnreadCount, setRemainingUnreadCount] = (0, react.useState)(0);
8524
+ const MAX_AUTO_READ_ROUNDS = 50;
8525
+ const [autoReadExhausted, setAutoReadExhausted] = (0, react.useState)(false);
8491
8526
  const [newFactsCount, setNewFactsCount] = (0, react.useState)(0);
8492
8527
  const draftKey = `thread:${threadRef}`;
8493
8528
  const { draft, recipients } = (0, react.useSyncExternalStore)(drafts.subscribe, () => drafts.getSnapshot(draftKey));
@@ -8507,20 +8542,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8507
8542
  const currentFactsRef = (0, react.useRef)([]);
8508
8543
  const sequenceRef = (0, react.useRef)(0);
8509
8544
  const readRequestIdRef = (0, react.useRef)(mintRequestId());
8545
+ const projectionRef = (0, react.useRef)();
8510
8546
  const mutationRequests = (0, react.useRef)(/* @__PURE__ */ new Map());
8511
8547
  const threadLastFact = currentFacts[currentFacts.length - 1];
8512
8548
  const timeline = useTimelineScroll(`${currentFacts.length}:${olderFacts.length}:${threadLastFact === void 0 ? "" : factKey(threadLastFact)}`);
8513
8549
  const updateProjection = (next) => {
8550
+ projectionRef.current = next;
8514
8551
  setProjection(next);
8515
8552
  setReadFacts(next.facts);
8516
- setRemainingUnreadCount(next.remainingUnreadCount);
8517
8553
  const batch = [messageFact(next.anchor, next.anchorMentions), ...next.facts.map((fact) => fact.fact)];
8518
8554
  setCurrentFacts((current) => {
8519
8555
  const merged = mergeFacts(current, batch);
8520
8556
  currentFactsRef.current = merged;
8521
8557
  return merged;
8522
8558
  });
8523
- setNewFactsCount(0);
8559
+ };
8560
+ const drainUnread = async () => {
8561
+ for (let round = 1; round <= MAX_AUTO_READ_ROUNDS; round += 1) {
8562
+ const snapshot = projectionRef.current;
8563
+ if (snapshot === void 0 || snapshot.remainingUnreadCount <= 0) return;
8564
+ const beforeSequence = sequenceRef.current;
8565
+ if (!await readCurrent(true)) return;
8566
+ if (!mountedRef.current || sequenceRef.current !== beforeSequence + 1) return;
8567
+ if (projectionRef.current?.remainingUnreadCount === snapshot.remainingUnreadCount) return;
8568
+ }
8569
+ setAutoReadExhausted(true);
8524
8570
  };
8525
8571
  const readCurrent = async (newRequest = false) => {
8526
8572
  if (!mountedRef.current) return false;
@@ -8586,17 +8632,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8586
8632
  currentFactsRef.current = merged;
8587
8633
  return merged;
8588
8634
  });
8589
- setProjection((current) => current === void 0 ? current : {
8590
- ...current,
8591
- ...result.value.task === void 0 ? {} : { task: result.value.task },
8592
- thread: result.value.thread,
8593
- claims: result.value.claims
8635
+ setProjection((current) => {
8636
+ const next = current === void 0 ? current : {
8637
+ ...current,
8638
+ ...result.value.task === void 0 ? {} : { task: result.value.task },
8639
+ thread: result.value.thread,
8640
+ claims: result.value.claims
8641
+ };
8642
+ if (next !== void 0) projectionRef.current = next;
8643
+ return next;
8594
8644
  });
8595
8645
  if (additions.length === 0) return;
8596
- if (!timeline.isPinned()) {
8597
- setNewFactsCount((current) => current + additions.length);
8598
- return;
8599
- }
8646
+ if (!timeline.isPinned()) setNewFactsCount((current) => current + additions.length);
8600
8647
  const priorSequence = sequenceRef.current;
8601
8648
  if (await readCurrent(true)) return;
8602
8649
  if (!mountedRef.current || sequenceRef.current !== priorSequence + 1) return;
@@ -8605,6 +8652,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8605
8652
  };
8606
8653
  (0, react.useEffect)(() => {
8607
8654
  mountedRef.current = true;
8655
+ projectionRef.current = void 0;
8608
8656
  setProjection(void 0);
8609
8657
  setChannelView(void 0);
8610
8658
  setMembers([]);
@@ -8614,7 +8662,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8614
8662
  setReadFacts([]);
8615
8663
  setHistoryCursor(void 0);
8616
8664
  setHistoryHasMore(false);
8617
- setRemainingUnreadCount(0);
8665
+ setAutoReadExhausted(false);
8618
8666
  setNewFactsCount(0);
8619
8667
  setError(void 0);
8620
8668
  setStatusMessage(void 0);
@@ -8638,7 +8686,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8638
8686
  return;
8639
8687
  }
8640
8688
  updateProjection(read.value);
8641
- if (read.value.facts.some((fact) => fact.unread)) timeline.jumpToBoundary();
8689
+ timeline.scrollToBottom();
8642
8690
  if (history !== void 0 && history.ok) {
8643
8691
  setCurrentFacts((current) => {
8644
8692
  const merged = mergeFacts(current, history.value.facts);
@@ -8650,6 +8698,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8650
8698
  }
8651
8699
  setError(void 0);
8652
8700
  setLoading(false);
8701
+ await drainUnread();
8653
8702
  })();
8654
8703
  refreshSupplemental();
8655
8704
  const disposers = [subscribeChanges({
@@ -8683,6 +8732,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8683
8732
  taskRef,
8684
8733
  threadRef
8685
8734
  ]);
8735
+ (0, react.useEffect)(() => {
8736
+ if (newFactsCount > 0 && timeline.isPinned()) setNewFactsCount(0);
8737
+ }, [
8738
+ newFactsCount,
8739
+ currentFacts,
8740
+ olderFacts,
8741
+ timeline
8742
+ ]);
8686
8743
  const loadOlder = async () => {
8687
8744
  if (historyHasMore === false && historyCursor === void 0) return;
8688
8745
  const beforeSequence = historyCursor ?? minSequence(currentFactsRef.current);
@@ -8831,7 +8888,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8831
8888
  if (boundaryIndex === index) nodes.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8832
8889
  className: thread_module_css_default.unreadBoundary,
8833
8890
  role: "separator",
8834
- "data-thread-boundary": true,
8835
8891
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("unreadBoundary") })
8836
8892
  }, `boundary-${index}`));
8837
8893
  if (sender !== void 0) run.push(fact);
@@ -8841,9 +8897,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8841
8897
  return nodes;
8842
8898
  };
8843
8899
  const refreshAfterFence = async () => {
8844
- timeline.jumpToLatest();
8900
+ timeline.scrollToBottom();
8845
8901
  await readCurrent(true);
8846
8902
  await refreshSupplemental();
8903
+ await drainUnread();
8847
8904
  };
8848
8905
  const convertToTask = async () => {
8849
8906
  if (pending || thread === void 0 || task !== void 0) return;
@@ -9280,32 +9337,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9280
9337
  className: thread_module_css_default.publicSection,
9281
9338
  children: renderFactBlocks(currentFactsWithAnchor, unreadBoundary)
9282
9339
  }),
9283
- newFactsCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9284
- className: thread_module_css_default.newUpdates,
9285
- role: "status",
9286
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("readNewUpdates", { count: newFactsCount }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9287
- size: "sm",
9288
- variant: "outline",
9289
- disabled: loading,
9290
- onClick: () => {
9291
- timeline.jumpToLatest();
9292
- readCurrent(true);
9293
- },
9294
- children: t("markRead")
9295
- })]
9296
- }),
9297
- remainingUnreadCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9340
+ autoReadExhausted && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9298
9341
  className: conversation_module_css_default.timelineAction,
9299
- role: "status",
9300
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("remainingUnread", { count: remainingUnreadCount }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9342
+ role: "alert",
9343
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("autoReadIncomplete") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9301
9344
  size: "sm",
9302
9345
  onClick: () => {
9303
- timeline.jumpToBoundary();
9304
- readCurrent(true);
9346
+ setAutoReadExhausted(false);
9347
+ drainUnread();
9305
9348
  },
9306
9349
  disabled: loading,
9307
- children: t("continueReading")
9350
+ children: t("retry")
9308
9351
  })]
9352
+ }),
9353
+ newFactsCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9354
+ className: thread_module_css_default.newUpdates,
9355
+ role: "status",
9356
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
9357
+ type: "button",
9358
+ className: thread_module_css_default.newUpdatesJump,
9359
+ onClick: timeline.scrollToBottom,
9360
+ children: t("newUpdatesJump", { count: newFactsCount })
9361
+ })
9309
9362
  })
9310
9363
  ]
9311
9364
  })
@@ -9952,69 +10005,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9952
10005
  "unavailableDot": "_1henIG_unavailableDot"
9953
10006
  };
9954
10007
  //#endregion
9955
- //#region src/client/multi-menu-field.tsx
9956
- /**
9957
- * Render the labeled multi-select Menu field.
9958
- * @param props.label - field caption; doubles as the trigger's accessible name.
9959
- * @param props.options - selectable entries in display order.
9960
- * @param props.selected - currently checked ids.
9961
- * @param props.onToggle - invoked with an id when its row is clicked.
9962
- * @param props.disabled - disables the trigger while a mutation is in flight.
9963
- * @param props.emptyText - shown instead of the picker when there is nothing to pick.
9964
- * @param props.triggerEmptyLabel - trigger caption when nothing is selected.
9965
- * @param props.formatCount - builds the trigger caption for N selections.
9966
- */
9967
- function MultiMenuField({ label, options, selected, onToggle, disabled = false, emptyText, triggerEmptyLabel, formatCount }) {
9968
- const [open, setOpen] = (0, react.useState)(false);
9969
- const items = options.map((option) => ({
9970
- id: option.id,
9971
- label: option.hint === void 0 ? option.label : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [option.label, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
9972
- className: sidebar_module_css_default.menuHint,
9973
- children: ` ${option.hint}`
9974
- })] }),
9975
- ...option.disabled === true ? { disabled: true } : {},
9976
- ...option.icon === void 0 ? {} : { icon: option.icon }
9977
- }));
9978
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9979
- className: create_module_css_default.field,
9980
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), options.length === 0 && emptyText !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
9981
- className: sidebar_module_css_default.editHint,
9982
- children: emptyText
9983
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
9984
- open,
9985
- portal: true,
9986
- className: create_module_css_default.menuCap,
9987
- items,
9988
- selectedIds: selected,
9989
- onSelect: (id) => {
9990
- onToggle(id);
9991
- },
9992
- onClose: () => {
9993
- setOpen(false);
9994
- },
9995
- anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
9996
- type: "button",
9997
- className: create_module_css_default.selectTrigger,
9998
- "aria-label": label,
9999
- "aria-haspopup": "listbox",
10000
- "aria-expanded": open,
10001
- disabled,
10002
- onClick: () => {
10003
- setOpen((value) => !value);
10004
- },
10005
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10006
- className: create_module_css_default.selectValue,
10007
- children: selected.length === 0 ? triggerEmptyLabel : formatCount(selected.length)
10008
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10009
- className: `${create_module_css_default.chevron} ${open ? create_module_css_default.chevronOpen : ""}`,
10010
- "aria-hidden": true,
10011
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
10012
- })]
10013
- })
10014
- })]
10015
- });
10016
- }
10017
- //#endregion
10018
10008
  //#region src/client/TeamMemberEditor.tsx
10019
10009
  /** Model option key inside one editor; opaque and resolved against the loaded groups. */
10020
10010
  function modelKey(provider, model) {
@@ -10175,10 +10165,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10175
10165
  }
10176
10166
  /**
10177
10167
  * Agent editor: handle, description, and per-Member model selection commit
10178
- * through one durable update; Channel membership below keeps its own
10179
- * immediate add/remove flow.
10168
+ * through one durable update. Channel membership is managed from the Channel
10169
+ * side, not here.
10180
10170
  */
10181
- function AgentEditorDialog({ status, channels, loadChannels, updateMember, joinChannel, removeChannelMember, loadModels, onCommitted, onClose, t }) {
10171
+ function AgentEditorDialog({ status, updateMember, loadModels, onCommitted, onClose, t }) {
10182
10172
  const memberId = status.member.memberId;
10183
10173
  const [handle, setHandle] = (0, react.useState)(status.member.handle);
10184
10174
  const [description, setDescription] = (0, react.useState)(status.member.description);
@@ -10186,39 +10176,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10186
10176
  const [saving, setSaving] = (0, react.useState)(false);
10187
10177
  const [error, setError] = (0, react.useState)();
10188
10178
  const pendingRequest = (0, react.useRef)();
10189
- const [memberships, setMemberships] = (0, react.useState)();
10190
- const [loadError, setLoadError] = (0, react.useState)();
10191
- (0, react.useEffect)(() => {
10192
- let mounted = true;
10193
- loadChannels({
10194
- workspaceId: status.member.workspaceId,
10195
- topLevelOnly: true,
10196
- includeActivities: false,
10197
- limit: 1
10198
- }).then((result) => {
10199
- if (!mounted) return;
10200
- if (result.ok) {
10201
- setMemberships(result.value.members);
10202
- setLoadError(void 0);
10203
- } else setLoadError(result.error.message);
10204
- });
10205
- return () => {
10206
- mounted = false;
10207
- };
10208
- }, [loadChannels, status.member.workspaceId]);
10209
- const membership = useChannelMembership({
10210
- joinChannel,
10211
- removeChannelMember
10212
- }, (change) => change.channelRef, (change) => {
10213
- setMemberships((current) => {
10214
- const base = current ?? [];
10215
- return change.joined ? base.filter((item) => !(item.channelRef === change.channelRef && item.memberId === change.memberId)) : [...base, {
10216
- channelRef: change.channelRef,
10217
- memberId: change.memberId
10218
- }];
10219
- });
10220
- });
10221
- const joinedChannels = new Set((memberships ?? []).filter((item) => item.memberId === memberId).map((item) => item.channelRef));
10222
10179
  const dirty = handle.trim() !== status.member.handle || description.trim() !== status.member.description || !sameModel(model, status.member.model);
10223
10180
  const submit = async (event) => {
10224
10181
  event.preventDefault();
@@ -10229,7 +10186,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10229
10186
  memberId,
10230
10187
  handle: normalizedHandle,
10231
10188
  description: normalizedDescription,
10232
- ...model === void 0 ? {} : { model }
10189
+ ...model === void 0 ? {} : { model },
10190
+ ...status.member.capabilities === void 0 ? {} : { capabilities: status.member.capabilities }
10233
10191
  };
10234
10192
  const request = pendingRequest.current !== void 0 && pendingRequest.current.memberId === payload.memberId && pendingRequest.current.handle === payload.handle && pendingRequest.current.description === payload.description && sameModel(pendingRequest.current.model, model) ? pendingRequest.current : {
10235
10193
  requestId: mintRequestId(),
@@ -10313,53 +10271,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10313
10271
  disabled: saving,
10314
10272
  t
10315
10273
  }),
10316
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
10317
- className: create_module_css_default.memberPicker,
10318
- disabled: saving,
10319
- children: [
10320
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("legend", { children: t("channelMembersSection") }),
10321
- channels.map((channel) => {
10322
- const joined = joinedChannels.has(channel.channelRef);
10323
- const rowPending = membership.pending.has(channel.channelRef);
10324
- const disabled = rowPending || !joined && status.presence === "unavailable";
10325
- const rowError = membership.errors.get(channel.channelRef);
10326
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10327
- className: `${sidebar_module_css_default.editMemberRow} ${sidebar_module_css_default.editMemberRowChannels}`,
10328
- children: [
10329
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("strong", {
10330
- className: sidebar_module_css_default.editChannelName,
10331
- children: ["# ", channel.name]
10332
- }),
10333
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
10334
- size: "sm",
10335
- variant: "outline",
10336
- disabled,
10337
- onClick: () => {
10338
- membership.change({
10339
- workspaceId: status.member.workspaceId,
10340
- channelRef: channel.channelRef,
10341
- memberId,
10342
- joined
10343
- });
10344
- },
10345
- children: rowPending ? t("membershipUpdating") : joined ? t("removeFromChannel") : t("addToChannel")
10346
- }),
10347
- rowError !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10348
- className: sidebar_module_css_default.rowError,
10349
- role: "alert",
10350
- children: rowError
10351
- })
10352
- ]
10353
- }, channel.channelRef);
10354
- }),
10355
- channels.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("noChannelsForAgent") }),
10356
- loadError !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10357
- className: sidebar_module_css_default.rowError,
10358
- role: "alert",
10359
- children: loadError
10360
- })
10361
- ]
10362
- }),
10363
10274
  error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10364
10275
  className: create_module_css_default.error,
10365
10276
  role: "alert",
@@ -10376,10 +10287,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10376
10287
  }
10377
10288
  //#endregion
10378
10289
  //#region src/client/TeamAgentsPanel.tsx
10379
- function TeamAgentsPanel({ workspaceId, loadMembers, subscribeChanges, loadChannels, addMember, updateMember, recoverMember, clearMemberContext, joinChannel, removeChannelMember, loadModels, memberSessionId, openMemberSession, onCreatingChange, t }) {
10290
+ function TeamAgentsPanel({ workspaceId, loadMembers, subscribeChanges, addMember, updateMember, recoverMember, clearMemberContext, loadModels, memberSessionId, openMemberSession, onCreatingChange, t }) {
10380
10291
  const [members, setMembers] = (0, react.useState)([]);
10381
- const [channels, setChannels] = (0, react.useState)([]);
10382
- const [channelRefs, setChannelRefs] = (0, react.useState)([]);
10383
10292
  const [loading, setLoading] = (0, react.useState)(true);
10384
10293
  const [error, setError] = (0, react.useState)();
10385
10294
  const [formOpen, setFormOpen] = (0, react.useState)(false);
@@ -10414,18 +10323,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10414
10323
  (0, react.useEffect)(() => {
10415
10324
  refresh();
10416
10325
  }, [refresh]);
10417
- const loadWorkspaceChannels = (0, react.useCallback)(async () => {
10418
- const result = await loadChannels({
10419
- workspaceId,
10420
- topLevelOnly: true,
10421
- includeActivities: false,
10422
- limit: 1
10423
- });
10424
- if (result.ok) setChannels(result.value.channels);
10425
- }, [loadChannels, workspaceId]);
10426
- (0, react.useEffect)(() => {
10427
- loadWorkspaceChannels();
10428
- }, [loadWorkspaceChannels]);
10429
10326
  (0, react.useEffect)(() => subscribeChanges({
10430
10327
  kind: "workspace",
10431
10328
  workspaceId
@@ -10435,11 +10332,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10435
10332
  return;
10436
10333
  }
10437
10334
  refresh();
10438
- loadWorkspaceChannels();
10439
10335
  }), [
10440
10336
  subscribeChanges,
10441
10337
  refresh,
10442
- loadWorkspaceChannels,
10443
10338
  workspaceId
10444
10339
  ]);
10445
10340
  const closeForm = () => {
@@ -10463,7 +10358,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10463
10358
  setHandle("");
10464
10359
  setDescription("");
10465
10360
  setModel(void 0);
10466
- setChannelRefs([]);
10467
10361
  setFormOpen(false);
10468
10362
  if (result.value.status.presence === "unavailable") setError(result.value.status.diagnostic ?? t("statusUnavailable"));
10469
10363
  else setRetryRequest(void 0);
@@ -10486,13 +10380,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10486
10380
  const normalizedHandle = handle.trim();
10487
10381
  const normalizedDescription = description.trim();
10488
10382
  if (normalizedHandle.length === 0 || creating) return;
10489
- provision(retryRequest !== void 0 && retryRequest.workspaceId === workspaceId && retryRequest.handle === normalizedHandle && retryRequest.description === normalizedDescription && sameModel(retryRequest.model, model) && retryRequest.channelRefs.length === channelRefs.length && retryRequest.channelRefs.every((ref) => channelRefs.includes(ref)) ? retryRequest : {
10383
+ provision(retryRequest !== void 0 && retryRequest.workspaceId === workspaceId && retryRequest.handle === normalizedHandle && retryRequest.description === normalizedDescription && sameModel(retryRequest.model, model) && retryRequest.channelRefs.length === 0 ? retryRequest : {
10490
10384
  requestId: mintRequestId(),
10491
10385
  workspaceId,
10492
10386
  handle: normalizedHandle,
10493
10387
  description: normalizedDescription,
10494
10388
  presetId: "team-member",
10495
- channelRefs,
10389
+ channelRefs: [],
10496
10390
  ...model === void 0 ? {} : { model }
10497
10391
  });
10498
10392
  };
@@ -10558,22 +10452,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10558
10452
  disabled: creating,
10559
10453
  t
10560
10454
  }),
10561
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MultiMenuField, {
10562
- label: `${t("initialChannels")}${t("optionalSuffix")}`,
10563
- disabled: creating,
10564
- options: channels.map((channel) => ({
10565
- id: channel.channelRef,
10566
- label: channel.name
10567
- })),
10568
- selected: channelRefs,
10569
- onToggle: (ref) => {
10570
- setChannelRefs((current) => current.includes(ref) ? current.filter((item) => item !== ref) : [...current, ref]);
10571
- setRetryRequest(void 0);
10572
- },
10573
- emptyText: t("noChannelsForAgent"),
10574
- triggerEmptyLabel: t("channelsPickerEmpty"),
10575
- formatCount: (count) => t("channelsPickerCount", { count })
10576
- }),
10577
10455
  formOpen && error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10578
10456
  className: create_module_css_default.error,
10579
10457
  role: "alert",
@@ -10620,13 +10498,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10620
10498
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AgentRow, {
10621
10499
  status,
10622
10500
  ...memberSessionId === void 0 ? {} : { current: status.member.sessionId === memberSessionId },
10623
- channels,
10624
- loadChannels,
10625
10501
  updateMember,
10626
10502
  recoverMember,
10627
10503
  clearMemberContext,
10628
- joinChannel,
10629
- removeChannelMember,
10630
10504
  loadModels,
10631
10505
  openMemberSession,
10632
10506
  onUpdated: () => {
@@ -10659,7 +10533,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10659
10533
  * conversation page, the avatar carries identity plus the presence badge, and
10660
10534
  * the row menu opens the editor.
10661
10535
  */
10662
- function AgentRow({ status, current, channels, loadChannels, updateMember, recoverMember, clearMemberContext, joinChannel, removeChannelMember, loadModels, openMemberSession, onUpdated, t }) {
10536
+ function AgentRow({ status, current, updateMember, recoverMember, clearMemberContext, loadModels, openMemberSession, onUpdated, t }) {
10663
10537
  const [menuOpen, setMenuOpen] = (0, react.useState)(false);
10664
10538
  const [editing, setEditing] = (0, react.useState)(false);
10665
10539
  const [clearing, setClearing] = (0, react.useState)(false);
@@ -10801,11 +10675,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10801
10675
  }),
10802
10676
  editing && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AgentEditorDialog, {
10803
10677
  status,
10804
- channels,
10805
- loadChannels,
10806
10678
  updateMember,
10807
- joinChannel,
10808
- removeChannelMember,
10809
10679
  loadModels,
10810
10680
  onCommitted: onUpdated,
10811
10681
  onClose: () => {
@@ -10816,6 +10686,69 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
10816
10686
  ] });
10817
10687
  }
10818
10688
  //#endregion
10689
+ //#region src/client/multi-menu-field.tsx
10690
+ /**
10691
+ * Render the labeled multi-select Menu field.
10692
+ * @param props.label - field caption; doubles as the trigger's accessible name.
10693
+ * @param props.options - selectable entries in display order.
10694
+ * @param props.selected - currently checked ids.
10695
+ * @param props.onToggle - invoked with an id when its row is clicked.
10696
+ * @param props.disabled - disables the trigger while a mutation is in flight.
10697
+ * @param props.emptyText - shown instead of the picker when there is nothing to pick.
10698
+ * @param props.triggerEmptyLabel - trigger caption when nothing is selected.
10699
+ * @param props.formatCount - builds the trigger caption for N selections.
10700
+ */
10701
+ function MultiMenuField({ label, options, selected, onToggle, disabled = false, emptyText, triggerEmptyLabel, formatCount }) {
10702
+ const [open, setOpen] = (0, react.useState)(false);
10703
+ const items = options.map((option) => ({
10704
+ id: option.id,
10705
+ label: option.hint === void 0 ? option.label : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [option.label, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
10706
+ className: sidebar_module_css_default.menuHint,
10707
+ children: ` ${option.hint}`
10708
+ })] }),
10709
+ ...option.disabled === true ? { disabled: true } : {},
10710
+ ...option.icon === void 0 ? {} : { icon: option.icon }
10711
+ }));
10712
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10713
+ className: create_module_css_default.field,
10714
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), options.length === 0 && emptyText !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
10715
+ className: sidebar_module_css_default.editHint,
10716
+ children: emptyText
10717
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
10718
+ open,
10719
+ portal: true,
10720
+ className: create_module_css_default.menuCap,
10721
+ items,
10722
+ selectedIds: selected,
10723
+ onSelect: (id) => {
10724
+ onToggle(id);
10725
+ },
10726
+ onClose: () => {
10727
+ setOpen(false);
10728
+ },
10729
+ anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
10730
+ type: "button",
10731
+ className: create_module_css_default.selectTrigger,
10732
+ "aria-label": label,
10733
+ "aria-haspopup": "listbox",
10734
+ "aria-expanded": open,
10735
+ disabled,
10736
+ onClick: () => {
10737
+ setOpen((value) => !value);
10738
+ },
10739
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10740
+ className: create_module_css_default.selectValue,
10741
+ children: selected.length === 0 ? triggerEmptyLabel : formatCount(selected.length)
10742
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10743
+ className: `${create_module_css_default.chevron} ${open ? create_module_css_default.chevronOpen : ""}`,
10744
+ "aria-hidden": true,
10745
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
10746
+ })]
10747
+ })
10748
+ })]
10749
+ });
10750
+ }
10751
+ //#endregion
10819
10752
  //#region src/client/TeamChannelsPanel.tsx
10820
10753
  function TeamChannelsPanel(props) {
10821
10754
  const { workspaceId, loadMembers, loadChannels, subscribeChanges, createChannel, updateChannel, creatingAgents, selectedChannelRef, selectChannel, t } = props;
@@ -11404,13 +11337,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11404
11337
  workspaceId: selectedId,
11405
11338
  loadMembers,
11406
11339
  subscribeChanges,
11407
- loadChannels,
11408
11340
  addMember,
11409
11341
  updateMember,
11410
11342
  recoverMember,
11411
11343
  clearMemberContext,
11412
- joinChannel,
11413
- removeChannelMember,
11414
11344
  loadModels,
11415
11345
  ...navigationState.memberSessionId === void 0 ? {} : { memberSessionId: navigationState.memberSessionId },
11416
11346
  openMemberSession,
@@ -11707,8 +11637,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11707
11637
  retry: "重试",
11708
11638
  agentName: "名称",
11709
11639
  agentDescription: "说明",
11710
- initialChannels: "初始频道",
11711
- noChannelsForAgent: "请先创建至少一个频道",
11712
11640
  createAgent: "创建 Agent",
11713
11641
  creatingAgent: "正在创建…",
11714
11642
  loadingAgents: "正在加载 Agents…",
@@ -11741,8 +11669,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11741
11669
  clearContextFailed: "清空上下文失败:{message}",
11742
11670
  optionalSuffix: "(可选)",
11743
11671
  agentDescriptionPlaceholder: "留空则暂无描述",
11744
- channelsPickerEmpty: "选择初始频道",
11745
- channelsPickerCount: "已选 {count} 个频道",
11746
11672
  membersPickerEmpty: "选择初始成员",
11747
11673
  membersPickerCount: "已选 {count} 个成员",
11748
11674
  reasoningEffort: "推理强度",
@@ -11804,10 +11730,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11804
11730
  backToWorkspace: "返回工作区",
11805
11731
  loadingThread: "正在加载 Thread…",
11806
11732
  unreadBoundary: "以下是本次打开收到的更新",
11807
- readNewUpdates: "读取 {count} 条新更新",
11808
- markRead: "标记为已读",
11809
- remainingUnread: "还有 {count} 条未读更新",
11810
- continueReading: "继续阅读",
11733
+ newUpdatesJump: " {count} 条新更新",
11734
+ autoReadIncomplete: "仍有未读更新未能自动读取",
11811
11735
  olderHistory: "更早历史",
11812
11736
  runtimeRisk: "当前运行风险",
11813
11737
  runtimeRiskDetail: "@{member} 当前不可用:{diagnostic}",
@@ -11855,8 +11779,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11855
11779
  retry: "Retry",
11856
11780
  agentName: "Name",
11857
11781
  agentDescription: "Description",
11858
- initialChannels: "Initial Channels",
11859
- noChannelsForAgent: "Create at least one Channel first",
11860
11782
  createAgent: "Create Agent",
11861
11783
  creatingAgent: "Creating…",
11862
11784
  loadingAgents: "Loading Agents…",
@@ -11889,8 +11811,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11889
11811
  clearContextFailed: "Failed to clear context: {message}",
11890
11812
  optionalSuffix: " (optional)",
11891
11813
  agentDescriptionPlaceholder: "Leave empty if not needed",
11892
- channelsPickerEmpty: "Choose initial channels",
11893
- channelsPickerCount: "{count} selected",
11894
11814
  membersPickerEmpty: "Choose initial members",
11895
11815
  membersPickerCount: "{count} selected",
11896
11816
  reasoningEffort: "Reasoning effort",
@@ -11952,10 +11872,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
11952
11872
  backToWorkspace: "Back to Workspace",
11953
11873
  loadingThread: "Loading Thread…",
11954
11874
  unreadBoundary: "Updates received when you opened this Thread",
11955
- readNewUpdates: "Read {count} new update(s)",
11956
- markRead: "Mark read",
11957
- remainingUnread: "{count} unread update(s) remain",
11958
- continueReading: "Continue reading",
11875
+ newUpdatesJump: " {count} new update(s)",
11876
+ autoReadIncomplete: "Some unread updates could not be read automatically",
11959
11877
  olderHistory: "Older history",
11960
11878
  runtimeRisk: "Current runtime risk",
11961
11879
  runtimeRiskDetail: "@{member} is unavailable: {diagnostic}",