@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 CHANGED
@@ -566,7 +566,7 @@ dependencies = [
566
566
 
567
567
  [[package]]
568
568
  name = "team-agent"
569
- version = "0.3.3"
569
+ version = "0.3.4"
570
570
  dependencies = [
571
571
  "anyhow",
572
572
  "chrono",
package/Cargo.toml CHANGED
@@ -9,7 +9,7 @@ members = ["crates/team-agent"]
9
9
 
10
10
  [workspace.package]
11
11
  edition = "2021"
12
- version = "0.3.3"
12
+ version = "0.3.4"
13
13
  license = "AGPL-3.0"
14
14
  rust-version = "1.95"
15
15
 
@@ -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("adaptive");
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":"adaptive","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"}]}"#;
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":"adaptive","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"}]}"#;
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(|| "adaptive".to_string()),
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 e = serde_json::json!({"event": "leader.api_error", "error_class": "Overloaded", "provider": "claude_code", "matched_pattern_snippet": "529 too many"});
50
- assert_eq!(render_event_line(&e), Some("leader.api_error: Overloaded provider=claude_code snippet=529 too many".to_string()));
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
- /// adaptive;非默认非静默发 `display.backend_resolved`。
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::Adaptive);
19
+ let backend = requested.or(recorded).unwrap_or(DisplayBackend::None);
20
20
  ResolvedBackend {
21
21
  backend,
22
- non_default: backend != DisplayBackend::Adaptive,
22
+ non_default: backend != DisplayBackend::None,
23
23
  }
24
24
  }
25
25