@team-agent/installer 0.1.11 → 0.2.1
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/crates/team-agent-core/src/lib.rs +50 -5
- package/package.json +1 -1
- package/schemas/team.schema.json +1 -0
- package/src/team_agent/approvals/__init__.py +65 -0
- package/src/team_agent/approvals/constants.py +6 -0
- package/src/team_agent/approvals/parsing.py +176 -0
- package/src/team_agent/approvals/runtime_prompts.py +171 -0
- package/src/team_agent/approvals/status.py +165 -0
- package/src/team_agent/cli/__init__.py +137 -0
- package/src/team_agent/cli/commands.py +339 -0
- package/src/team_agent/cli/e2e.py +202 -0
- package/src/team_agent/cli/helpers.py +137 -0
- package/src/team_agent/cli/parser.py +477 -0
- package/src/team_agent/compiler.py +98 -33
- package/src/team_agent/coordinator/__init__.py +53 -0
- package/src/team_agent/{coordinator.py → coordinator/__main__.py} +3 -1
- package/src/team_agent/coordinator/lifecycle.py +334 -0
- package/src/team_agent/coordinator/metadata.py +61 -0
- package/src/team_agent/coordinator/paths.py +17 -0
- package/src/team_agent/diagnose/__init__.py +48 -0
- package/src/team_agent/diagnose/checks.py +101 -0
- package/src/team_agent/diagnose/health.py +241 -0
- package/src/team_agent/diagnose/preflight.py +194 -0
- package/src/team_agent/diagnose/quick_start.py +233 -0
- package/src/team_agent/display/__init__.py +61 -0
- package/src/team_agent/display/close.py +147 -0
- package/src/team_agent/display/ghostty.py +77 -0
- package/src/team_agent/display/worker_window.py +110 -0
- package/src/team_agent/display/workspace.py +473 -0
- package/src/team_agent/launch/__init__.py +41 -0
- package/src/team_agent/launch/bootstrap.py +85 -0
- package/src/team_agent/launch/config.py +106 -0
- package/src/team_agent/launch/core.py +291 -0
- package/src/team_agent/launch/requirements.py +57 -0
- package/src/team_agent/leader/__init__.py +320 -0
- package/src/team_agent/lifecycle/__init__.py +5 -0
- package/src/team_agent/lifecycle/agents.py +226 -0
- package/src/team_agent/lifecycle/operations.py +321 -0
- package/src/team_agent/lifecycle/paste_buffer_hygiene.py +39 -0
- package/src/team_agent/lifecycle/start.py +363 -0
- package/src/team_agent/mcp_server/__init__.py +42 -0
- package/src/team_agent/mcp_server/__main__.py +7 -0
- package/src/team_agent/mcp_server/contracts.py +148 -0
- package/src/team_agent/mcp_server/normalize.py +257 -0
- package/src/team_agent/mcp_server/server.py +150 -0
- package/src/team_agent/mcp_server/tools.py +205 -0
- package/src/team_agent/message_store/__init__.py +23 -0
- package/src/team_agent/message_store/agent_health.py +109 -0
- package/src/team_agent/{message_store.py → message_store/core.py} +188 -245
- package/src/team_agent/message_store/result_watchers.py +102 -0
- package/src/team_agent/message_store/schema.py +266 -0
- package/src/team_agent/messaging/__init__.py +1 -0
- package/src/team_agent/messaging/activity_detector.py +190 -0
- package/src/team_agent/messaging/delivery.py +138 -0
- package/src/team_agent/messaging/deps.py +263 -0
- package/src/team_agent/messaging/idle_alerts.py +323 -0
- package/src/team_agent/messaging/internal_delivery.py +46 -0
- package/src/team_agent/messaging/leader.py +317 -0
- package/src/team_agent/messaging/leader_panes.py +343 -0
- package/src/team_agent/messaging/owner_bypass.py +29 -0
- package/src/team_agent/messaging/result_delivery.py +300 -0
- package/src/team_agent/messaging/results.py +456 -0
- package/src/team_agent/messaging/scheduler.py +428 -0
- package/src/team_agent/messaging/send.py +500 -0
- package/src/team_agent/messaging/session_drift.py +94 -0
- package/src/team_agent/messaging/tmux_io.py +337 -0
- package/src/team_agent/messaging/tmux_prompt.py +229 -0
- package/src/team_agent/orchestrator/__init__.py +376 -0
- package/src/team_agent/orchestrator/plan.py +122 -0
- package/src/team_agent/orchestrator/state.py +128 -0
- package/src/team_agent/profiles/__init__.py +82 -0
- package/src/team_agent/profiles/constants.py +19 -0
- package/src/team_agent/profiles/core.py +407 -0
- package/src/team_agent/profiles/helpers.py +69 -0
- package/src/team_agent/profiles/provider_env.py +188 -0
- package/src/team_agent/profiles/smoke.py +201 -0
- package/src/team_agent/provider_cli/__init__.py +43 -0
- package/src/team_agent/provider_cli/adapter.py +167 -0
- package/src/team_agent/provider_cli/base.py +48 -0
- package/src/team_agent/provider_cli/claude.py +457 -0
- package/src/team_agent/provider_cli/codex.py +319 -0
- package/src/team_agent/provider_cli/copilot.py +8 -0
- package/src/team_agent/provider_cli/fake.py +39 -0
- package/src/team_agent/provider_cli/gemini.py +95 -0
- package/src/team_agent/provider_cli/opencode.py +8 -0
- package/src/team_agent/provider_cli/prompt.py +62 -0
- package/src/team_agent/provider_cli/registry.py +18 -0
- package/src/team_agent/provider_cli/unsupported.py +32 -0
- package/src/team_agent/providers.py +67 -949
- package/src/team_agent/quality_gates.py +104 -0
- package/src/team_agent/restart/__init__.py +34 -0
- package/src/team_agent/restart/orchestration.py +328 -0
- package/src/team_agent/restart/selection.py +89 -0
- package/src/team_agent/restart/snapshot.py +70 -0
- package/src/team_agent/runtime.py +809 -5892
- package/src/team_agent/rust_core.py +22 -5
- package/src/team_agent/sessions/__init__.py +25 -0
- package/src/team_agent/sessions/capture.py +93 -0
- package/src/team_agent/sessions/inventory.py +44 -0
- package/src/team_agent/sessions/resume.py +135 -0
- package/src/team_agent/spec.py +3 -1
- package/src/team_agent/state.py +218 -4
- package/src/team_agent/status/__init__.py +63 -0
- package/src/team_agent/status/approvals.py +52 -0
- package/src/team_agent/status/compact.py +158 -0
- package/src/team_agent/status/constants.py +18 -0
- package/src/team_agent/status/inbox.py +28 -0
- package/src/team_agent/status/peek.py +117 -0
- package/src/team_agent/status/queries.py +168 -0
- package/src/team_agent/terminal.py +57 -0
- package/src/team_agent/cli.py +0 -858
- package/src/team_agent/mcp_server.py +0 -579
- package/src/team_agent/profiles.py +0 -882
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from contextlib import closing
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from team_agent.message_store.schema import utcnow
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def upsert_agent_health(
|
|
10
|
+
self,
|
|
11
|
+
agent_id: str,
|
|
12
|
+
status: str,
|
|
13
|
+
last_output_at: str | None = None,
|
|
14
|
+
context_usage_pct: int | None = None,
|
|
15
|
+
current_task_id: str | None = None,
|
|
16
|
+
owner_team_id: str | None = None,
|
|
17
|
+
) -> None:
|
|
18
|
+
now = utcnow()
|
|
19
|
+
with closing(self.connect()) as conn:
|
|
20
|
+
with conn:
|
|
21
|
+
if owner_team_id is None:
|
|
22
|
+
updated = conn.execute(
|
|
23
|
+
"""
|
|
24
|
+
update agent_health
|
|
25
|
+
set status = ?,
|
|
26
|
+
last_output_at = coalesce(?, last_output_at),
|
|
27
|
+
context_usage_pct = ?,
|
|
28
|
+
current_task_id = ?,
|
|
29
|
+
updated_at = ?
|
|
30
|
+
where owner_team_id is null and agent_id = ?
|
|
31
|
+
""",
|
|
32
|
+
(status, last_output_at, context_usage_pct, current_task_id, now, agent_id),
|
|
33
|
+
)
|
|
34
|
+
if updated.rowcount:
|
|
35
|
+
return
|
|
36
|
+
conn.execute(
|
|
37
|
+
"""
|
|
38
|
+
insert into agent_health(owner_team_id, agent_id, status, last_output_at, context_usage_pct, current_task_id, updated_at)
|
|
39
|
+
values (?, ?, ?, ?, ?, ?, ?)
|
|
40
|
+
on conflict(owner_team_id, agent_id) do update set
|
|
41
|
+
status = excluded.status,
|
|
42
|
+
last_output_at = coalesce(excluded.last_output_at, agent_health.last_output_at),
|
|
43
|
+
context_usage_pct = excluded.context_usage_pct,
|
|
44
|
+
current_task_id = excluded.current_task_id,
|
|
45
|
+
updated_at = excluded.updated_at
|
|
46
|
+
""",
|
|
47
|
+
(owner_team_id, agent_id, status, last_output_at, context_usage_pct, current_task_id, now),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def agent_health(self, owner_team_id: str | None = None) -> dict[str, dict[str, Any]]:
|
|
51
|
+
with closing(self.connect()) as conn:
|
|
52
|
+
if owner_team_id is None:
|
|
53
|
+
rows = conn.execute("select * from agent_health order by agent_id").fetchall()
|
|
54
|
+
else:
|
|
55
|
+
rows = conn.execute(
|
|
56
|
+
"select * from agent_health where owner_team_id = ? or owner_team_id is null order by agent_id",
|
|
57
|
+
(owner_team_id,),
|
|
58
|
+
).fetchall()
|
|
59
|
+
return {row["agent_id"]: dict(row) for row in rows}
|
|
60
|
+
|
|
61
|
+
def delete_agent_health(self, agent_id: str, owner_team_id: str | None = None) -> bool:
|
|
62
|
+
with closing(self.connect()) as conn:
|
|
63
|
+
with conn:
|
|
64
|
+
if owner_team_id is None:
|
|
65
|
+
cur = conn.execute("delete from agent_health where agent_id = ?", (agent_id,))
|
|
66
|
+
else:
|
|
67
|
+
cur = conn.execute(
|
|
68
|
+
"delete from agent_health where agent_id = ? and (owner_team_id = ? or owner_team_id is null)",
|
|
69
|
+
(agent_id, owner_team_id),
|
|
70
|
+
)
|
|
71
|
+
return cur.rowcount > 0
|
|
72
|
+
|
|
73
|
+
def gc_agent_health(self, valid_agent_ids: Any, owner_team_id: str | None = None) -> list[str]:
|
|
74
|
+
# Caller must pass the workspace-wide set of live agent_ids across every
|
|
75
|
+
# team sharing this team.db. Rows whose agent_id is not in the set are
|
|
76
|
+
# deleted. If two teams share a workspace, the caller is responsible for
|
|
77
|
+
# computing the union before invoking this helper; otherwise live agents
|
|
78
|
+
# from a sibling team will be swept. Input is validated before any DB
|
|
79
|
+
# mutation so a derivation bug that silently produces None or non-str
|
|
80
|
+
# entries cannot delete sibling-team rows by accident.
|
|
81
|
+
valid: set[str] = set()
|
|
82
|
+
for entry in valid_agent_ids:
|
|
83
|
+
if not isinstance(entry, str):
|
|
84
|
+
raise TypeError(
|
|
85
|
+
f"gc_agent_health requires str agent_ids; got {type(entry).__name__}"
|
|
86
|
+
)
|
|
87
|
+
if not entry:
|
|
88
|
+
raise ValueError("gc_agent_health does not accept empty agent_ids")
|
|
89
|
+
valid.add(entry)
|
|
90
|
+
with closing(self.connect()) as conn:
|
|
91
|
+
with conn:
|
|
92
|
+
if owner_team_id is None:
|
|
93
|
+
rows = conn.execute("select agent_id from agent_health").fetchall()
|
|
94
|
+
else:
|
|
95
|
+
rows = conn.execute(
|
|
96
|
+
"select agent_id from agent_health where owner_team_id = ? or owner_team_id is null",
|
|
97
|
+
(owner_team_id,),
|
|
98
|
+
).fetchall()
|
|
99
|
+
stale = [row["agent_id"] for row in rows if row["agent_id"] not in valid]
|
|
100
|
+
if stale:
|
|
101
|
+
placeholders = ",".join("?" for _ in stale)
|
|
102
|
+
if owner_team_id is None:
|
|
103
|
+
conn.execute(f"delete from agent_health where agent_id in ({placeholders})", stale)
|
|
104
|
+
else:
|
|
105
|
+
conn.execute(
|
|
106
|
+
f"delete from agent_health where agent_id in ({placeholders}) and (owner_team_id = ? or owner_team_id is null)",
|
|
107
|
+
[*stale, owner_team_id],
|
|
108
|
+
)
|
|
109
|
+
return stale
|