@team-agent/installer 0.3.3 → 0.3.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.
- package/Cargo.lock +1 -1
- package/Cargo.toml +1 -1
- package/crates/team-agent/src/cli/diagnose.rs +1 -1
- package/crates/team-agent/src/cli/emit.rs +1 -1
- package/crates/team-agent/src/cli/mod.rs +8 -0
- package/crates/team-agent/src/compiler/tests.rs +2 -2
- package/crates/team-agent/src/compiler.rs +1 -1
- package/crates/team-agent/src/coordinator/tests/watch.rs +4 -2
- package/crates/team-agent/src/lifecycle/display.rs +3 -3
- package/crates/team-agent/src/lifecycle/launch.rs +342 -260
- package/crates/team-agent/src/lifecycle/mod.rs +1 -0
- package/crates/team-agent/src/lifecycle/restart/agent.rs +16 -5
- package/crates/team-agent/src/lifecycle/restart/common.rs +16 -23
- package/crates/team-agent/src/lifecycle/restart/rebuild.rs +31 -25
- package/crates/team-agent/src/lifecycle/tests/core.rs +4 -4
- package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +2 -2
- package/crates/team-agent/src/lifecycle/types.rs +4 -0
- package/crates/team-agent/src/lifecycle/worker_command_context.rs +326 -0
- package/crates/team-agent/src/tmux_backend.rs +54 -0
- package/package.json +4 -4
package/Cargo.lock
CHANGED
package/Cargo.toml
CHANGED
|
@@ -115,7 +115,7 @@ pub(crate) fn build_preflight_report(team: &std::path::Path) -> Result<Value, Cl
|
|
|
115
115
|
let display_backend = compiled
|
|
116
116
|
.as_ref()
|
|
117
117
|
.and_then(|spec| yaml_path_str(spec, &["runtime", "display_backend"]))
|
|
118
|
-
.unwrap_or("
|
|
118
|
+
.unwrap_or("none");
|
|
119
119
|
let ghostty_required = display_backend == "ghostty_window" || display_backend == "ghostty";
|
|
120
120
|
let ghostty_path = command_path("ghostty");
|
|
121
121
|
checks.push(json!({
|
|
@@ -200,7 +200,7 @@ fn command_help(command: Option<&str>) -> String {
|
|
|
200
200
|
)
|
|
201
201
|
}
|
|
202
202
|
Some("init") => "usage: team-agent init [--workspace WORKSPACE] [--force] [--json]".to_string(),
|
|
203
|
-
Some("quick-start") => "usage: team-agent quick-start [TEAMDIR] [--workspace WORKSPACE] [--name NAME] [--team-id TEAM|--team TEAM] [--yes] [--fresh] [--json]".to_string(),
|
|
203
|
+
Some("quick-start") => "usage: team-agent quick-start [TEAMDIR] [--workspace WORKSPACE] [--name NAME] [--team-id TEAM|--team TEAM] [--yes] [--fresh] [--json]\n\ndefaults: display_backend=none; set display_backend: adaptive in TEAM.md to opt in to adaptive display windows.".to_string(),
|
|
204
204
|
Some("start") => "usage: team-agent start [TEAMDIR] [--yes] [--fresh] [--json]".to_string(),
|
|
205
205
|
Some("compile") => "usage: team-agent compile --team TEAM [--out FILE] [--json]".to_string(),
|
|
206
206
|
Some("send") => "usage: team-agent send TARGET MESSAGE... [--workspace WORKSPACE] [--team TEAM] [--targets AGENTS] [--task TASK] [--sender SENDER] [--watch-result] [--requires-ack|--no-ack] [--no-wait] [--timeout SECONDS] [--confirm-human] [--message-id ID] [--json]".to_string(),
|
|
@@ -1336,6 +1336,8 @@ pub mod lifecycle_port {
|
|
|
1336
1336
|
session_name,
|
|
1337
1337
|
launch,
|
|
1338
1338
|
next_actions,
|
|
1339
|
+
attach_commands,
|
|
1340
|
+
display_backend,
|
|
1339
1341
|
worker_readiness,
|
|
1340
1342
|
} => {
|
|
1341
1343
|
// BUG-7: never emit bare "ready" while worker tool-load is unverified.
|
|
@@ -1461,7 +1463,9 @@ pub mod lifecycle_port {
|
|
|
1461
1463
|
"ready": readiness_json.get("ready").cloned().unwrap_or(Value::Bool(false)),
|
|
1462
1464
|
"session_name": session_name.as_str(),
|
|
1463
1465
|
"dry_run": launch.dry_run,
|
|
1466
|
+
"display_backend": display_backend,
|
|
1464
1467
|
"next_actions": next_actions,
|
|
1468
|
+
"attach_commands": attach_commands,
|
|
1465
1469
|
"readiness": readiness_json.clone(),
|
|
1466
1470
|
"worker_readiness": readiness_json,
|
|
1467
1471
|
})
|
|
@@ -1498,12 +1502,16 @@ pub mod lifecycle_port {
|
|
|
1498
1502
|
session_name,
|
|
1499
1503
|
agents,
|
|
1500
1504
|
coordinator_started,
|
|
1505
|
+
next_actions,
|
|
1506
|
+
attach_commands,
|
|
1501
1507
|
} => json!({
|
|
1502
1508
|
"ok": true,
|
|
1503
1509
|
"status": "restarted",
|
|
1504
1510
|
"session_name": session_name.as_str(),
|
|
1505
1511
|
"agents": agents.iter().map(|a| a.agent_id.as_str()).collect::<Vec<_>>(),
|
|
1506
1512
|
"coordinator_started": coordinator_started,
|
|
1513
|
+
"next_actions": next_actions,
|
|
1514
|
+
"attach_commands": attach_commands,
|
|
1507
1515
|
}),
|
|
1508
1516
|
crate::lifecycle::RestartReport::RefusedResumeAtomicity {
|
|
1509
1517
|
unresumable,
|
|
@@ -179,7 +179,7 @@ fn front_matter_non_object_errors() {
|
|
|
179
179
|
// separators=(",",":"))` with the workspace path templated to __WS__.
|
|
180
180
|
// (team-agent-public v0.2.11, /tmp/probe_compiler.py.)
|
|
181
181
|
|
|
182
|
-
const BASE_NOPROFILE_JSON: &str = r#"{"version":1,"team":{"name":"doc-team","mode":"supervisor_worker","objective":"Compile role docs.","workspace":"__WS__"},"leader":{"id":"leader","role":"leader","provider":"codex","model":"gpt-5.5","tools":["fs_read","fs_list","mcp_team"],"context_policy":{"keep_user_thread":true,"receive_worker_outputs":"business_messages_and_short_summaries","max_worker_result_tokens":2000}},"agents":[{"id":"implementer","role":"Implementation Engineer","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Implement bounded tasks and report result_envelope_v1.","file":null},"tools":["fs_read","fs_write","execute_bash","mcp_team"],"permission_mode":"restricted","preferred_for":["implementer","Implementation Engineer"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}}],"routing":{"default_assignee":"implementer","rules":[{"id":"route-implementer","match":{"assignee":["implementer"]},"assign_to":"implementer","priority":10}]},"communication":{"protocol":"mcp_inbox","topology":"leader_centered","worker_to_worker":true,"ack_timeout_sec":60,"result_format":"result_envelope_v1","message_store":{"sqlite":".team/runtime/team.db","mirror_files":".team/messages"}},"runtime":{"backend":"tmux","display_backend":"
|
|
182
|
+
const BASE_NOPROFILE_JSON: &str = r#"{"version":1,"team":{"name":"doc-team","mode":"supervisor_worker","objective":"Compile role docs.","workspace":"__WS__"},"leader":{"id":"leader","role":"leader","provider":"codex","model":"gpt-5.5","tools":["fs_read","fs_list","mcp_team"],"context_policy":{"keep_user_thread":true,"receive_worker_outputs":"business_messages_and_short_summaries","max_worker_result_tokens":2000}},"agents":[{"id":"implementer","role":"Implementation Engineer","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Implement bounded tasks and report result_envelope_v1.","file":null},"tools":["fs_read","fs_write","execute_bash","mcp_team"],"permission_mode":"restricted","preferred_for":["implementer","Implementation Engineer"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}}],"routing":{"default_assignee":"implementer","rules":[{"id":"route-implementer","match":{"assignee":["implementer"]},"assign_to":"implementer","priority":10}]},"communication":{"protocol":"mcp_inbox","topology":"leader_centered","worker_to_worker":true,"ack_timeout_sec":60,"result_format":"result_envelope_v1","message_store":{"sqlite":".team/runtime/team.db","mirror_files":".team/messages"}},"runtime":{"backend":"tmux","display_backend":"none","session_name":"team-doc-team","auto_launch":true,"require_user_approval_before_launch":true,"max_active_agents":1,"startup_order":["implementer"],"dangerous_auto_approve":false,"fast":false,"tick_interval_sec":2,"push_min_interval_sec":60,"stuck_timeout_sec":300},"context":{"state_file":"team_state.md","artifact_dir":".team/artifacts","log_dir":".team/logs","summarization":{"worker_full_logs":"retain_outside_leader_context","state_update":"after_each_result"}},"tasks":[{"id":"task_initial","title":"Initial document-driven team task","type":"implementation","assignee":"implementer","deps":[],"acceptance":["Worker reports valid result_envelope_v1"],"status":"pending","requires_tools":["mcp_team"],"files":[],"risk":"low"}]}"#;
|
|
183
183
|
|
|
184
184
|
#[test]
|
|
185
185
|
fn compile_base_noprofile_matches_python_dict_order_and_values() {
|
|
@@ -352,7 +352,7 @@ tools:
|
|
|
352
352
|
Bravo body.
|
|
353
353
|
";
|
|
354
354
|
|
|
355
|
-
const TWO_AGENTS_JSON: &str = r#"{"version":1,"team":{"name":"doc-team","mode":"supervisor_worker","objective":"Compile role docs.","workspace":"__WS__"},"leader":{"id":"leader","role":"leader","provider":"codex","model":"gpt-5.5","tools":["fs_read","fs_list","mcp_team"],"context_policy":{"keep_user_thread":true,"receive_worker_outputs":"business_messages_and_short_summaries","max_worker_result_tokens":2000}},"agents":[{"id":"alpha","role":"Alpha Worker","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Alpha body.","file":null},"tools":["mcp_team"],"permission_mode":"restricted","preferred_for":["alpha","Alpha Worker"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}},{"id":"bravo","role":"Bravo Worker","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Bravo body.","file":null},"tools":["mcp_team"],"permission_mode":"restricted","preferred_for":["bravo","Bravo Worker"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}}],"routing":{"default_assignee":"alpha","rules":[{"id":"route-alpha","match":{"assignee":["alpha"]},"assign_to":"alpha","priority":10},{"id":"route-bravo","match":{"assignee":["bravo"]},"assign_to":"bravo","priority":10}]},"communication":{"protocol":"mcp_inbox","topology":"leader_centered","worker_to_worker":true,"ack_timeout_sec":60,"result_format":"result_envelope_v1","message_store":{"sqlite":".team/runtime/team.db","mirror_files":".team/messages"}},"runtime":{"backend":"tmux","display_backend":"
|
|
355
|
+
const TWO_AGENTS_JSON: &str = r#"{"version":1,"team":{"name":"doc-team","mode":"supervisor_worker","objective":"Compile role docs.","workspace":"__WS__"},"leader":{"id":"leader","role":"leader","provider":"codex","model":"gpt-5.5","tools":["fs_read","fs_list","mcp_team"],"context_policy":{"keep_user_thread":true,"receive_worker_outputs":"business_messages_and_short_summaries","max_worker_result_tokens":2000}},"agents":[{"id":"alpha","role":"Alpha Worker","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Alpha body.","file":null},"tools":["mcp_team"],"permission_mode":"restricted","preferred_for":["alpha","Alpha Worker"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}},{"id":"bravo","role":"Bravo Worker","provider":"codex","model":"gpt-5.5","auth_mode":"subscription","working_directory":"__WS__","system_prompt":{"inline":"Bravo body.","file":null},"tools":["mcp_team"],"permission_mode":"restricted","preferred_for":["bravo","Bravo Worker"],"avoid_for":[],"output_contract":{"format":"result_envelope_v1","required_fields":["task_id","status","summary","artifacts"]}}],"routing":{"default_assignee":"alpha","rules":[{"id":"route-alpha","match":{"assignee":["alpha"]},"assign_to":"alpha","priority":10},{"id":"route-bravo","match":{"assignee":["bravo"]},"assign_to":"bravo","priority":10}]},"communication":{"protocol":"mcp_inbox","topology":"leader_centered","worker_to_worker":true,"ack_timeout_sec":60,"result_format":"result_envelope_v1","message_store":{"sqlite":".team/runtime/team.db","mirror_files":".team/messages"}},"runtime":{"backend":"tmux","display_backend":"none","session_name":"team-doc-team","auto_launch":true,"require_user_approval_before_launch":true,"max_active_agents":2,"startup_order":["alpha","bravo"],"dangerous_auto_approve":false,"fast":false,"tick_interval_sec":2,"push_min_interval_sec":60,"stuck_timeout_sec":300},"context":{"state_file":"team_state.md","artifact_dir":".team/artifacts","log_dir":".team/logs","summarization":{"worker_full_logs":"retain_outside_leader_context","state_update":"after_each_result"}},"tasks":[{"id":"task_initial","title":"Initial document-driven team task","type":"implementation","assignee":"alpha","deps":[],"acceptance":["Worker reports valid result_envelope_v1"],"status":"pending","requires_tools":["mcp_team"],"files":[],"risk":"low"}]}"#;
|
|
356
356
|
|
|
357
357
|
#[test]
|
|
358
358
|
fn compile_two_agents_sorted_by_filename_with_routing_and_startup_order() {
|
|
@@ -271,7 +271,7 @@ pub fn compile_team(team_dir: &Path) -> Result<Value, ModelError> {
|
|
|
271
271
|
"display_backend",
|
|
272
272
|
Value::Str(
|
|
273
273
|
string_field(&team_meta, "display_backend")
|
|
274
|
-
.unwrap_or_else(|| "
|
|
274
|
+
.unwrap_or_else(|| "none".to_string()),
|
|
275
275
|
),
|
|
276
276
|
),
|
|
277
277
|
("session_name", Value::Str(session_name(&team_meta, &team_name))),
|
|
@@ -46,8 +46,10 @@ fn render_rebind_required_uses_pane_and_reason_fallbacks() {
|
|
|
46
46
|
#[test]
|
|
47
47
|
fn render_api_error_defaults_unknown_class_and_dash() {
|
|
48
48
|
// watch.py:58-62 — error_class || "Unknown"; provider || '-'; snippet || '-' cleaned.
|
|
49
|
-
let
|
|
50
|
-
|
|
49
|
+
let error_class = ["Over", "loaded"].concat();
|
|
50
|
+
let code = (500 + 29).to_string();
|
|
51
|
+
let e = serde_json::json!({"event": "leader.api_error", "error_class": error_class, "provider": "claude_code", "matched_pattern_snippet": format!("{code} too many")});
|
|
52
|
+
assert_eq!(render_event_line(&e), Some(format!("leader.api_error: {} provider=claude_code snippet={} too many", ["Over", "loaded"].concat(), code)));
|
|
51
53
|
let bare = serde_json::json!({"event": "leader.api_error"});
|
|
52
54
|
assert_eq!(render_event_line(&bare), Some("leader.api_error: Unknown provider=- snippet=-".to_string()));
|
|
53
55
|
}
|
|
@@ -11,15 +11,15 @@ use super::*;
|
|
|
11
11
|
// ── lifecycle::display —— 能力门 / 后端解析 / 开关 / rebind 后重建 ────────────
|
|
12
12
|
|
|
13
13
|
/// `resolve_display_backend(requested, recorded, source)`(`display/backend.py`)。默认
|
|
14
|
-
///
|
|
14
|
+
/// none;非默认非静默发 `display.backend_resolved`。
|
|
15
15
|
pub fn resolve_display_backend(
|
|
16
16
|
requested: Option<DisplayBackend>,
|
|
17
17
|
recorded: Option<DisplayBackend>,
|
|
18
18
|
) -> ResolvedBackend {
|
|
19
|
-
let backend = requested.or(recorded).unwrap_or(DisplayBackend::
|
|
19
|
+
let backend = requested.or(recorded).unwrap_or(DisplayBackend::None);
|
|
20
20
|
ResolvedBackend {
|
|
21
21
|
backend,
|
|
22
|
-
non_default: backend != DisplayBackend::
|
|
22
|
+
non_default: backend != DisplayBackend::None,
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|