@team-agent/installer 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +1 -1
- package/Cargo.toml +1 -1
- package/crates/team-agent/src/cli/adapters.rs +9 -1
- package/crates/team-agent/src/cli/diagnose.rs +191 -31
- package/crates/team-agent/src/cli/mod.rs +93 -34
- package/crates/team-agent/src/cli/send.rs +69 -2
- package/crates/team-agent/src/cli/status_port.rs +62 -0
- package/crates/team-agent/src/cli/tests/status_send.rs +12 -19
- package/crates/team-agent/src/coordinator/tick.rs +13 -0
- package/crates/team-agent/src/lifecycle/launch.rs +14 -6
- package/crates/team-agent/src/lifecycle/restart/agent.rs +44 -1
- package/crates/team-agent/src/lifecycle/restart/common.rs +53 -2
- package/crates/team-agent/src/lifecycle/restart/rebuild.rs +108 -6
- package/crates/team-agent/src/lifecycle/restart/selection.rs +47 -18
- package/crates/team-agent/src/lifecycle/restart.rs +16 -6
- package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +287 -53
- package/crates/team-agent/src/lifecycle/tests/restart.rs +144 -5
- package/crates/team-agent/src/lifecycle/types.rs +1 -0
- package/crates/team-agent/src/messaging/delivery.rs +209 -30
- package/crates/team-agent/src/messaging/leader_receiver.rs +60 -25
- package/crates/team-agent/src/messaging/tests/runtime.rs +446 -0
- package/crates/team-agent/src/messaging/watchers.rs +36 -19
- package/crates/team-agent/src/provider/adapter.rs +103 -41
- package/crates/team-agent/src/provider/session/capture.rs +328 -66
- package/crates/team-agent/src/provider/session/resume.rs +30 -28
- package/crates/team-agent/src/provider/session_scan/common.rs +117 -1
- package/crates/team-agent/src/provider/session_scan/copilot.rs +1 -0
- package/crates/team-agent/src/provider/session_scan.rs +1 -0
- package/crates/team-agent/src/state/persist.rs +17 -0
- package/crates/team-agent/src/state/projection.rs +59 -4
- 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
|
-
|
|
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::{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
239
|
-
|
|
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|
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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,
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
696
|
+
return Err(ProviderError::ResumeUnavailable(
|
|
697
|
+
"resume requires session_id".to_string(),
|
|
698
|
+
));
|
|
667
699
|
};
|
|
668
|
-
let managed = ctx
|
|
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(
|
|
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
|
-
|
|
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 =>
|
|
796
|
-
|
|
797
|
-
|
|
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(
|
|
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
|
|
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 =>
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
Provider::
|
|
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
|
|