@team-agent/installer 0.5.2 → 0.5.4

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 (51) hide show
  1. package/Cargo.lock +3 -1
  2. package/Cargo.toml +1 -1
  3. package/crates/team-agent/Cargo.toml +20 -0
  4. package/crates/team-agent/src/cli/diagnose.rs +191 -31
  5. package/crates/team-agent/src/cli/emit.rs +5 -0
  6. package/crates/team-agent/src/cli/mod.rs +213 -89
  7. package/crates/team-agent/src/cli/tests/named_address.rs +4 -0
  8. package/crates/team-agent/src/codex_app_server.rs +62 -1
  9. package/crates/team-agent/src/conpty/backend.rs +120 -8
  10. package/crates/team-agent/src/coordinator/backoff.rs +88 -2
  11. package/crates/team-agent/src/coordinator/conpty_shim.rs +730 -0
  12. package/crates/team-agent/src/coordinator/health.rs +97 -11
  13. package/crates/team-agent/src/coordinator/mod.rs +8 -0
  14. package/crates/team-agent/src/coordinator/tests/daemon.rs +2 -1
  15. package/crates/team-agent/src/coordinator/tests/tick_core.rs +6 -0
  16. package/crates/team-agent/src/coordinator/tick.rs +13 -0
  17. package/crates/team-agent/src/diagnose/orphans.rs +18 -7
  18. package/crates/team-agent/src/leader/provider_attribution.rs +19 -34
  19. package/crates/team-agent/src/leader/tests/lease_api.rs +7 -0
  20. package/crates/team-agent/src/lib.rs +14 -1
  21. package/crates/team-agent/src/lifecycle/launch.rs +89 -92
  22. package/crates/team-agent/src/lifecycle/lock.rs +40 -33
  23. package/crates/team-agent/src/lifecycle/restart/agent.rs +25 -19
  24. package/crates/team-agent/src/lifecycle/restart/common.rs +53 -2
  25. package/crates/team-agent/src/lifecycle/restart/rebuild.rs +108 -6
  26. package/crates/team-agent/src/lifecycle/restart/selection.rs +47 -18
  27. package/crates/team-agent/src/lifecycle/restart.rs +16 -6
  28. package/crates/team-agent/src/lifecycle/tests/agent_ops.rs +7 -0
  29. package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +287 -53
  30. package/crates/team-agent/src/lifecycle/tests/restart.rs +144 -5
  31. package/crates/team-agent/src/lifecycle/types.rs +1 -0
  32. package/crates/team-agent/src/mcp_server/wire.rs +6 -7
  33. package/crates/team-agent/src/messaging/tests/runtime.rs +5 -0
  34. package/crates/team-agent/src/packaging/tests.rs +41 -6
  35. package/crates/team-agent/src/packaging/types.rs +31 -3
  36. package/crates/team-agent/src/platform/argv.rs +324 -0
  37. package/crates/team-agent/src/platform/errors.rs +95 -0
  38. package/crates/team-agent/src/platform/file_lock.rs +418 -0
  39. package/crates/team-agent/src/platform/mod.rs +66 -0
  40. package/crates/team-agent/src/platform/process.rs +555 -0
  41. package/crates/team-agent/src/provider/adapter.rs +103 -41
  42. package/crates/team-agent/src/provider/session/capture.rs +328 -66
  43. package/crates/team-agent/src/provider/session/resume.rs +30 -28
  44. package/crates/team-agent/src/provider/session_scan/common.rs +117 -1
  45. package/crates/team-agent/src/provider/session_scan/copilot.rs +1 -0
  46. package/crates/team-agent/src/provider/session_scan.rs +1 -0
  47. package/crates/team-agent/src/state/persist.rs +222 -25
  48. package/crates/team-agent/src/state/projection.rs +59 -4
  49. package/crates/team-agent/src/tmux_backend.rs +63 -13
  50. package/crates/team-agent/src/transport_factory.rs +124 -5
  51. package/package.json +4 -4
@@ -5,12 +5,12 @@ use std::process::Command;
5
5
 
6
6
  use super::helpers::patterns;
7
7
  use super::types::{
8
- AuthHintStatus, CapturedSession, CommandPlan, McpConfig, ProviderCaps,
9
- ProviderCommandContext, ProviderError, SessionId, StatusPatterns,
8
+ AuthHintStatus, CapturedSession, CommandPlan, McpConfig, ProviderCaps, ProviderCommandContext,
9
+ ProviderError, SessionId, StatusPatterns,
10
10
  };
11
11
  use super::{AuthMode, Provider};
12
12
 
13
- pub use crate::provider::session_scan::{CapturedSessionCandidate, CaptureSessionContext};
13
+ pub use crate::provider::session_scan::{CaptureSessionContext, CapturedSessionCandidate};
14
14
 
15
15
  // ===========================================================================
16
16
  // TRAIT: ProviderAdapter (method SIGNATURES only — 无 body)
@@ -70,7 +70,7 @@ pub trait ProviderAdapter {
70
70
  ctx.model,
71
71
  ctx.tools,
72
72
  )
73
- .map(CommandPlan::argv_only)
73
+ .map(CommandPlan::argv_only)
74
74
  }
75
75
 
76
76
  /// 启动后从 provider session 日志捕获 session_id + rollout_path
@@ -95,6 +95,7 @@ pub trait ProviderAdapter {
95
95
  .into_iter()
96
96
  .map(|captured| CapturedSessionCandidate {
97
97
  captured,
98
+ embedded_agent_id: None,
98
99
  positive_agent_id_match: false,
99
100
  agent_path_match: false,
100
101
  })
@@ -183,7 +184,7 @@ pub trait ProviderAdapter {
183
184
  ctx.model,
184
185
  ctx.tools,
185
186
  )
186
- .map(CommandPlan::argv_only)
187
+ .map(CommandPlan::argv_only)
187
188
  }
188
189
 
189
190
  /// 计算本 provider 该用的 MCP server 配置(`adapter.py` mcp_config;claude
@@ -226,19 +227,17 @@ pub trait ProviderAdapter {
226
227
  sleep_s: f64,
227
228
  ) -> super::startup_prompt::StartupPromptOutcome {
228
229
  std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| match self.provider() {
229
- Provider::Codex => {
230
- super::startup_prompt::codex_handle_startup_prompts(transport, target, checks, sleep_s)
231
- }
230
+ Provider::Codex => super::startup_prompt::codex_handle_startup_prompts(
231
+ transport, target, checks, sleep_s,
232
+ ),
232
233
  Provider::Claude | Provider::ClaudeCode => {
233
234
  super::startup_prompt::claude_handle_startup_prompts(
234
235
  transport, target, checks, sleep_s,
235
236
  )
236
237
  }
237
- Provider::Copilot => {
238
- super::startup_prompt::copilot_handle_startup_prompts(
239
- transport, target, checks, sleep_s,
240
- )
241
- }
238
+ Provider::Copilot => super::startup_prompt::copilot_handle_startup_prompts(
239
+ transport, target, checks, sleep_s,
240
+ ),
242
241
  _ => super::startup_prompt::StartupPromptOutcome::default(),
243
242
  }))
244
243
  .unwrap_or_default()
@@ -342,7 +341,9 @@ impl ProviderAdapter for BasicProviderAdapter {
342
341
  let output = Command::new(command_name(self.provider))
343
342
  .arg("--version")
344
343
  .output()
345
- .map_err(|e| ProviderError::Io(format!("{} --version: {e}", command_name(self.provider))))?;
344
+ .map_err(|e| {
345
+ ProviderError::Io(format!("{} --version: {e}", command_name(self.provider)))
346
+ })?;
346
347
  if !output.status.success() {
347
348
  return Ok("unknown".to_string());
348
349
  }
@@ -390,10 +391,24 @@ impl ProviderAdapter for BasicProviderAdapter {
390
391
  tools: &[&str],
391
392
  ) -> Result<Vec<String>, ProviderError> {
392
393
  match self.provider {
393
- Provider::Claude | Provider::ClaudeCode => {
394
- Ok(claude_launch_command(self, auth_mode, mcp_config, system_prompt, model, tools)?)
395
- }
396
- Provider::Codex => Ok(codex_base_command(None, auth_mode, mcp_config, system_prompt, model, tools, None, None)),
394
+ Provider::Claude | Provider::ClaudeCode => Ok(claude_launch_command(
395
+ self,
396
+ auth_mode,
397
+ mcp_config,
398
+ system_prompt,
399
+ model,
400
+ tools,
401
+ )?),
402
+ Provider::Codex => Ok(codex_base_command(
403
+ None,
404
+ auth_mode,
405
+ mcp_config,
406
+ system_prompt,
407
+ model,
408
+ tools,
409
+ None,
410
+ None,
411
+ )),
397
412
  // §C1 worker argv 形态 + C-1/C-5/C-6 cr verdict:
398
413
  // copilot --no-color --no-auto-update [<dangerous|granular>] [--model]
399
414
  // --additional-mcp-config <inline json> --session-id <expected_uuid> -C <cwd>
@@ -401,7 +416,11 @@ impl ProviderAdapter for BasicProviderAdapter {
401
416
  // AGENTS.md(launch 路径写文件,见 lifecycle/launch.rs)注入,**不入 argv**
402
417
  // (B2 灵魂件降级,C-1-2 禁 silent 写全局)。
403
418
  Provider::Copilot => Ok(copilot_base_command(
404
- auth_mode, mcp_config, system_prompt, model, tools,
419
+ auth_mode,
420
+ mcp_config,
421
+ system_prompt,
422
+ model,
423
+ tools,
405
424
  )),
406
425
  Provider::GeminiCli => {
407
426
  let mut argv = vec!["gemini".to_string()];
@@ -439,7 +458,9 @@ impl ProviderAdapter for BasicProviderAdapter {
439
458
  // `--resume <existing_id>` on a session id that already has
440
459
  // a real transcript.
441
460
  let expected = next_session_token();
442
- let managed = ctx.profile_launch.is_some_and(|profile| profile.managed_mcp_config);
461
+ let managed = ctx
462
+ .profile_launch
463
+ .is_some_and(|profile| profile.managed_mcp_config);
443
464
  let projects_root = ctx
444
465
  .profile_launch
445
466
  .and_then(|profile| profile.claude_projects_root.clone());
@@ -614,7 +635,9 @@ impl ProviderAdapter for BasicProviderAdapter {
614
635
  )));
615
636
  }
616
637
  let Some(session_id) = session_id else {
617
- return Err(ProviderError::ResumeUnavailable("resume requires session_id".to_string()));
638
+ return Err(ProviderError::ResumeUnavailable(
639
+ "resume requires session_id".to_string(),
640
+ ));
618
641
  };
619
642
  match self.provider {
620
643
  Provider::Codex => {
@@ -632,8 +655,16 @@ impl ProviderAdapter for BasicProviderAdapter {
632
655
  Ok(argv)
633
656
  }
634
657
  Provider::Claude | Provider::ClaudeCode => {
635
- let mut argv =
636
- claude_base_command(self, auth_mode, mcp_config, system_prompt, model, tools, false, None)?;
658
+ let mut argv = claude_base_command(
659
+ self,
660
+ auth_mode,
661
+ mcp_config,
662
+ system_prompt,
663
+ model,
664
+ tools,
665
+ false,
666
+ None,
667
+ )?;
637
668
  argv.push("--resume".to_string());
638
669
  argv.push(session_id.as_str().to_string());
639
670
  Ok(argv)
@@ -641,9 +672,8 @@ impl ProviderAdapter for BasicProviderAdapter {
641
672
  // §C1 cr verdict:resume 同 base + `--resume <sid>`(去 --session-id,
642
673
  // copilot --resume 接受 id|name)。
643
674
  Provider::Copilot => {
644
- let mut argv = copilot_base_command_resume(
645
- auth_mode, mcp_config, system_prompt, model, tools,
646
- );
675
+ let mut argv =
676
+ copilot_base_command_resume(auth_mode, mcp_config, system_prompt, model, tools);
647
677
  argv.push("--resume".to_string());
648
678
  argv.push(session_id.as_str().to_string());
649
679
  Ok(argv)
@@ -663,9 +693,13 @@ impl ProviderAdapter for BasicProviderAdapter {
663
693
  match self.provider {
664
694
  Provider::Claude | Provider::ClaudeCode => {
665
695
  let Some(session_id) = session_id else {
666
- return Err(ProviderError::ResumeUnavailable("resume requires session_id".to_string()));
696
+ return Err(ProviderError::ResumeUnavailable(
697
+ "resume requires session_id".to_string(),
698
+ ));
667
699
  };
668
- let managed = ctx.profile_launch.is_some_and(|profile| profile.managed_mcp_config);
700
+ let managed = ctx
701
+ .profile_launch
702
+ .is_some_and(|profile| profile.managed_mcp_config);
669
703
  let model = claude_context_model(ctx);
670
704
  let mut argv = claude_base_command(
671
705
  self,
@@ -758,7 +792,9 @@ impl ProviderAdapter for BasicProviderAdapter {
758
792
  )));
759
793
  }
760
794
  let Some(session_id) = session_id else {
761
- return Err(ProviderError::ResumeUnavailable("fork requires session_id".to_string()));
795
+ return Err(ProviderError::ResumeUnavailable(
796
+ "fork requires session_id".to_string(),
797
+ ));
762
798
  };
763
799
  match self.provider {
764
800
  Provider::Codex => {
@@ -776,8 +812,16 @@ impl ProviderAdapter for BasicProviderAdapter {
776
812
  Ok(argv)
777
813
  }
778
814
  Provider::Claude | Provider::ClaudeCode => {
779
- let mut argv =
780
- claude_base_command(self, auth_mode, mcp_config, system_prompt, model, tools, false, None)?;
815
+ let mut argv = claude_base_command(
816
+ self,
817
+ auth_mode,
818
+ mcp_config,
819
+ system_prompt,
820
+ model,
821
+ tools,
822
+ false,
823
+ None,
824
+ )?;
781
825
  argv.push("--session-id".to_string());
782
826
  argv.push(next_session_token());
783
827
  argv.push("--resume".to_string());
@@ -792,10 +836,12 @@ impl ProviderAdapter for BasicProviderAdapter {
792
836
  Provider::Copilot => Err(ProviderError::CapabilityUnsupported(
793
837
  "copilot CLI 无 fork 旗标,session-store 不支持 branched continuation".to_string(),
794
838
  )),
795
- Provider::GeminiCli | Provider::Fake => Err(ProviderError::CapabilityUnsupported(format!(
796
- "{} does not support native session fork",
797
- provider_wire(self.provider)
798
- ))),
839
+ Provider::GeminiCli | Provider::Fake => {
840
+ Err(ProviderError::CapabilityUnsupported(format!(
841
+ "{} does not support native session fork",
842
+ provider_wire(self.provider)
843
+ )))
844
+ }
799
845
  }
800
846
  }
801
847
 
@@ -813,10 +859,14 @@ impl ProviderAdapter for BasicProviderAdapter {
813
859
  )));
814
860
  }
815
861
  let Some(session_id) = session_id else {
816
- return Err(ProviderError::ResumeUnavailable("fork requires session_id".to_string()));
862
+ return Err(ProviderError::ResumeUnavailable(
863
+ "fork requires session_id".to_string(),
864
+ ));
817
865
  };
818
866
  let expected = next_session_token();
819
- let managed = ctx.profile_launch.is_some_and(|profile| profile.managed_mcp_config);
867
+ let managed = ctx
868
+ .profile_launch
869
+ .is_some_and(|profile| profile.managed_mcp_config);
820
870
  let projects_root = ctx
821
871
  .profile_launch
822
872
  .and_then(|profile| profile.claude_projects_root.clone());
@@ -910,10 +960,22 @@ impl ProviderAdapter for BasicProviderAdapter {
910
960
 
911
961
  fn status_patterns(&self) -> Result<StatusPatterns, ProviderError> {
912
962
  match self.provider {
913
- Provider::Claude | Provider::ClaudeCode => patterns(r"[>❯]\s", r"[✶✢✽✻✳·].*…", r"Error|Traceback"),
914
- Provider::Codex => patterns(r"(›|❯|codex>)", r"•.*esc to interrupt", r"Error|Traceback|panic"),
915
- Provider::Copilot => patterns(r"(?m)^\s*❯\s*$| / commands · \? help", r"working|processing", r"Error|panic"),
916
- Provider::GeminiCli | Provider::Fake => patterns(r">", r"working|processing", r"Error|Traceback"),
963
+ Provider::Claude | Provider::ClaudeCode => {
964
+ patterns(r"[>❯]\s", r"[✶✢✽✻✳·].*…", r"Error|Traceback")
965
+ }
966
+ Provider::Codex => patterns(
967
+ r"(›|❯|codex>)",
968
+ r"•.*esc to interrupt",
969
+ r"Error|Traceback|panic",
970
+ ),
971
+ Provider::Copilot => patterns(
972
+ r"(?m)^\s*❯\s*$| / commands · \? help",
973
+ r"working|processing",
974
+ r"Error|panic",
975
+ ),
976
+ Provider::GeminiCli | Provider::Fake => {
977
+ patterns(r">", r"working|processing", r"Error|Traceback")
978
+ }
917
979
  }
918
980
  }
919
981