@agentmeshhq/agent 0.4.14 → 0.4.16

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 (41) hide show
  1. package/dist/__tests__/bootstrap.test.js +24 -0
  2. package/dist/__tests__/bootstrap.test.js.map +1 -1
  3. package/dist/__tests__/injector.test.js +38 -1
  4. package/dist/__tests__/injector.test.js.map +1 -1
  5. package/dist/__tests__/lead-loop.test.d.ts +1 -0
  6. package/dist/__tests__/lead-loop.test.js +170 -0
  7. package/dist/__tests__/lead-loop.test.js.map +1 -0
  8. package/dist/__tests__/roles.test.d.ts +1 -0
  9. package/dist/__tests__/roles.test.js +78 -0
  10. package/dist/__tests__/roles.test.js.map +1 -0
  11. package/dist/__tests__/start-team-id.test.js +8 -3
  12. package/dist/__tests__/start-team-id.test.js.map +1 -1
  13. package/dist/cli/index.js +54 -5
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/relay.d.ts +10 -0
  16. package/dist/cli/relay.js +209 -0
  17. package/dist/cli/relay.js.map +1 -0
  18. package/dist/cli/start.d.ts +2 -0
  19. package/dist/cli/start.js +42 -7
  20. package/dist/cli/start.js.map +1 -1
  21. package/dist/core/daemon/bootstrap.js +14 -4
  22. package/dist/core/daemon/bootstrap.js.map +1 -1
  23. package/dist/core/daemon/context-template.d.ts +5 -1
  24. package/dist/core/daemon/context-template.js +16 -2
  25. package/dist/core/daemon/context-template.js.map +1 -1
  26. package/dist/core/daemon/lead-loop.d.ts +22 -0
  27. package/dist/core/daemon/lead-loop.js +155 -0
  28. package/dist/core/daemon/lead-loop.js.map +1 -0
  29. package/dist/core/daemon/roles.d.ts +25 -0
  30. package/dist/core/daemon/roles.js +43 -0
  31. package/dist/core/daemon/roles.js.map +1 -0
  32. package/dist/core/daemon.d.ts +2 -0
  33. package/dist/core/daemon.js +48 -1
  34. package/dist/core/daemon.js.map +1 -1
  35. package/dist/core/injector.js +61 -1
  36. package/dist/core/injector.js.map +1 -1
  37. package/dist/core/registry.d.ts +5 -0
  38. package/dist/core/registry.js +19 -0
  39. package/dist/core/registry.js.map +1 -1
  40. package/package.json +12 -11
  41. package/LICENSE +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"context-template.js","sourceRoot":"","sources":["../../../src/core/daemon/context-template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-template.js","sourceRoot":"","sources":["../../../src/core/daemon/context-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface LeadContext {
2
+ hubUrl: string;
3
+ token: string;
4
+ workspace: string;
5
+ teamId: string;
6
+ /** Optional: pre-resolved reviewer agent ID. If omitted, resolved at tick time. */
7
+ reviewerAgentId?: string;
8
+ log: (msg: string) => void;
9
+ /** Optional: supply a custom exec function for testing */
10
+ exec?: (cmd: string) => Promise<{
11
+ stdout: string;
12
+ stderr: string;
13
+ }>;
14
+ }
15
+ /**
16
+ * One coordination tick for a lead agent:
17
+ * 1. Poll open PRs via `gh pr list`
18
+ * 2. Update BEHIND branches via `gh pr update-branch`
19
+ * 3. Route unreviewed PRs to the reviewer via hub handoffs
20
+ * 4. Merge APPROVED + CI-green + MERGEABLE PRs
21
+ */
22
+ export declare function runLeadTick(ctx: LeadContext): Promise<void>;
@@ -0,0 +1,155 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execAsync = promisify(exec);
4
+ function ciGreen(pr) {
5
+ const checks = pr.statusCheckRollup;
6
+ if (!checks || checks.length === 0)
7
+ return true; // no checks = assume green
8
+ return checks.every((c) => {
9
+ if (c.conclusion)
10
+ return c.conclusion === "SUCCESS";
11
+ if (c.state)
12
+ return c.state === "SUCCESS";
13
+ return false;
14
+ });
15
+ }
16
+ /** Fetch the reviewer agent ID from the hub at tick time. */
17
+ async function resolveReviewerAgentId(hubUrl, workspace, token) {
18
+ try {
19
+ const res = await fetch(`${hubUrl}/api/v1/workspaces/${workspace}/agents`, {
20
+ headers: { Authorization: `Bearer ${token}` },
21
+ });
22
+ if (!res.ok)
23
+ return null;
24
+ const body = (await res.json());
25
+ const agents = body.data ?? [];
26
+ // Find agent with role "reviewer" or display_name containing "reviewer"
27
+ const reviewer = agents.find((a) => a.metadata?.role === "reviewer" || a.display_name?.toLowerCase().includes("reviewer"));
28
+ return reviewer?.agent_id ?? null;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /**
35
+ * Check whether an active (non-completed, non-rejected) handoff already exists
36
+ * for this PR number sent from this agent.
37
+ */
38
+ async function handoffExistsForPr(hubUrl, workspace, token, prNumber) {
39
+ try {
40
+ const res = await fetch(`${hubUrl}/api/v1/workspaces/${workspace}/handoffs?limit=50`, {
41
+ headers: { Authorization: `Bearer ${token}` },
42
+ });
43
+ if (!res.ok)
44
+ return false;
45
+ const body = (await res.json());
46
+ const handoffs = body.data ?? [];
47
+ return handoffs.some((h) => h.scope?.includes(`#${prNumber}`) && h.status !== "completed" && h.status !== "rejected");
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /** Create a handoff to the reviewer agent for this PR. */
54
+ async function createReviewHandoff(hubUrl, workspace, token, reviewerAgentId, pr) {
55
+ try {
56
+ const res = await fetch(`${hubUrl}/api/v1/workspaces/${workspace}/handoffs`, {
57
+ method: "POST",
58
+ headers: {
59
+ Authorization: `Bearer ${token}`,
60
+ "Content-Type": "application/json",
61
+ },
62
+ body: JSON.stringify({
63
+ to_agent_id: reviewerAgentId,
64
+ scope: `Review PR #${pr.number}: ${pr.title}`,
65
+ reason: `PR #${pr.number} (${pr.headRefName}) is open and needs review before merge.`,
66
+ metadata: { pr_number: pr.number, watcher_generated: true },
67
+ }),
68
+ });
69
+ if (!res.ok)
70
+ return null;
71
+ const body = (await res.json());
72
+ return body.handoff_id ?? null;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ /**
79
+ * One coordination tick for a lead agent:
80
+ * 1. Poll open PRs via `gh pr list`
81
+ * 2. Update BEHIND branches via `gh pr update-branch`
82
+ * 3. Route unreviewed PRs to the reviewer via hub handoffs
83
+ * 4. Merge APPROVED + CI-green + MERGEABLE PRs
84
+ */
85
+ export async function runLeadTick(ctx) {
86
+ const run = ctx.exec ?? execAsync;
87
+ let prs;
88
+ try {
89
+ const { stdout } = await run("gh pr list --state open --json number,title,headRefName,mergeable,reviewDecision,statusCheckRollup");
90
+ prs = JSON.parse(stdout.trim());
91
+ }
92
+ catch (err) {
93
+ ctx.log(`[lead-tick] Failed to list PRs: ${err.message}`);
94
+ return;
95
+ }
96
+ if (prs.length === 0) {
97
+ ctx.log("[lead-tick] No open PRs.");
98
+ return;
99
+ }
100
+ // Resolve reviewer once per tick
101
+ const reviewerAgentId = ctx.reviewerAgentId ?? (await resolveReviewerAgentId(ctx.hubUrl, ctx.workspace, ctx.token));
102
+ let updated = 0;
103
+ let routed = 0;
104
+ let merged = 0;
105
+ let skipped = 0;
106
+ for (const pr of prs) {
107
+ try {
108
+ // 1. Update BEHIND branches
109
+ if (pr.mergeable === "BEHIND") {
110
+ try {
111
+ await run(`gh pr update-branch ${pr.number}`);
112
+ ctx.log(`[lead-tick] PR #${pr.number}: updated BEHIND branch`);
113
+ updated++;
114
+ }
115
+ catch (err) {
116
+ ctx.log(`[lead-tick] PR #${pr.number}: update-branch failed: ${err.message}`);
117
+ }
118
+ }
119
+ // 2. Route unreviewed PRs to reviewer
120
+ if ((!pr.reviewDecision || pr.reviewDecision === "REVIEW_REQUIRED") && reviewerAgentId) {
121
+ const alreadySent = await handoffExistsForPr(ctx.hubUrl, ctx.workspace, ctx.token, pr.number);
122
+ if (!alreadySent) {
123
+ const handoffId = await createReviewHandoff(ctx.hubUrl, ctx.workspace, ctx.token, reviewerAgentId, pr);
124
+ if (handoffId) {
125
+ ctx.log(`[lead-tick] PR #${pr.number}: review handoff created → ${handoffId}`);
126
+ routed++;
127
+ }
128
+ else {
129
+ ctx.log(`[lead-tick] PR #${pr.number}: failed to create review handoff`);
130
+ }
131
+ }
132
+ }
133
+ // 3. Merge APPROVED + CI-green + MERGEABLE PRs
134
+ if (pr.reviewDecision === "APPROVED" && pr.mergeable === "MERGEABLE" && ciGreen(pr)) {
135
+ try {
136
+ await run(`gh pr merge ${pr.number} --squash --delete-branch`);
137
+ ctx.log(`[lead-tick] PR #${pr.number}: merged`);
138
+ merged++;
139
+ }
140
+ catch (err) {
141
+ ctx.log(`[lead-tick] PR #${pr.number}: merge failed: ${err.message}`);
142
+ }
143
+ }
144
+ else if (pr.reviewDecision === "APPROVED") {
145
+ skipped++;
146
+ ctx.log(`[lead-tick] PR #${pr.number}: approved but not mergeable (mergeable=${pr.mergeable}, ci=${ciGreen(pr)})`);
147
+ }
148
+ }
149
+ catch (err) {
150
+ ctx.log(`[lead-tick] PR #${pr.number}: unexpected error: ${err.message}`);
151
+ }
152
+ }
153
+ ctx.log(`[lead-tick] done — prs=${prs.length} updated=${updated} routed=${routed} merged=${merged} skipped=${skipped}`);
154
+ }
155
+ //# sourceMappingURL=lead-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lead-loop.js","sourceRoot":"","sources":["../../../src/core/daemon/lead-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Predefined agent roles — each role activates specific daemon behaviour and
3
+ * injects a role-scoped system prompt into the agent's CLAUDE.md context.
4
+ *
5
+ * Adding a new role requires updating all three exports below.
6
+ */
7
+ /** Canonical set of predefined roles. Free-form strings are still accepted for
8
+ * hub auto-assignment but will not activate role-specific daemon behaviour. */
9
+ export type AgentRole = "coordinator" | "developer" | "reviewer" | "lead" | "observer";
10
+ export declare const VALID_ROLES: readonly AgentRole[];
11
+ export declare function isKnownRole(role: string): role is AgentRole;
12
+ /**
13
+ * System prompt injected into CLAUDE.md for each predefined role.
14
+ * Injected at session start — works for all runners (opencode, claude, codex, custom).
15
+ */
16
+ export declare const ROLE_SYSTEM_PROMPTS: Record<AgentRole, string>;
17
+ /**
18
+ * Maps each predefined role to a daemon behaviour mode:
19
+ * - "lead-loop" → starts runLeadTick every 2 minutes
20
+ * - "worker" → standard inbox poll + auto-accept handoffs
21
+ * - "observer" → heartbeat only; no auto-accept, no lead loop
22
+ *
23
+ * Replaces inferAttendedFromRole() in bootstrap.ts for known roles.
24
+ */
25
+ export declare const ROLE_DAEMON_BEHAVIOUR: Record<AgentRole, "lead-loop" | "worker" | "observer">;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Predefined agent roles — each role activates specific daemon behaviour and
3
+ * injects a role-scoped system prompt into the agent's CLAUDE.md context.
4
+ *
5
+ * Adding a new role requires updating all three exports below.
6
+ */
7
+ export const VALID_ROLES = [
8
+ "coordinator",
9
+ "developer",
10
+ "reviewer",
11
+ "lead",
12
+ "observer",
13
+ ];
14
+ export function isKnownRole(role) {
15
+ return VALID_ROLES.includes(role);
16
+ }
17
+ /**
18
+ * System prompt injected into CLAUDE.md for each predefined role.
19
+ * Injected at session start — works for all runners (opencode, claude, codex, custom).
20
+ */
21
+ export const ROLE_SYSTEM_PROMPTS = {
22
+ coordinator: "You are a coordinator agent. Your job is to route work, manage PR reviews via handoffs, and merge approved pull requests. Do not implement features yourself — delegate to developer agents.",
23
+ developer: "You are a developer agent. Your job is to implement features and bug fixes assigned via handoffs, write tests, and open pull requests for review.",
24
+ reviewer: "You are a reviewer agent. Your job is to review pull requests and handoff proposals for correctness, quality, and consistency. Approve, request changes, or reject with clear reasoning.",
25
+ lead: "You are a lead agent. You coordinate the team, route work to the right agents, monitor SLAs, and escalate blockers. You also review high-level architecture decisions.",
26
+ observer: "You are an observer agent. You monitor team activity and provide strategic input when asked. You do not accept handoffs automatically and do not modify code directly.",
27
+ };
28
+ /**
29
+ * Maps each predefined role to a daemon behaviour mode:
30
+ * - "lead-loop" → starts runLeadTick every 2 minutes
31
+ * - "worker" → standard inbox poll + auto-accept handoffs
32
+ * - "observer" → heartbeat only; no auto-accept, no lead loop
33
+ *
34
+ * Replaces inferAttendedFromRole() in bootstrap.ts for known roles.
35
+ */
36
+ export const ROLE_DAEMON_BEHAVIOUR = {
37
+ coordinator: "lead-loop",
38
+ developer: "worker",
39
+ reviewer: "worker",
40
+ lead: "lead-loop",
41
+ observer: "observer",
42
+ };
43
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/core/daemon/roles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C,aAAa;IACb,WAAW;IACX,UAAU;IACV,MAAM;IACN,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAQ,WAAiC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA8B;IAC5D,WAAW,EACT,8LAA8L;IAChM,SAAS,EACP,mJAAmJ;IACrJ,QAAQ,EACN,0LAA0L;IAC5L,IAAI,EAAE,wKAAwK;IAC9K,QAAQ,EACN,wKAAwK;CAC3K,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA2D;IAC3F,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,UAAU;CACrB,CAAC"}
@@ -62,6 +62,8 @@ export declare class AgentDaemon {
62
62
  private autonomous;
63
63
  private healthCheckInterval;
64
64
  private inboxPollInterval;
65
+ private leadInterval;
66
+ private leadContext;
65
67
  private stopCleanupScheduler;
66
68
  private authHealthWatcher;
67
69
  private _preStartSessionId;
@@ -13,6 +13,8 @@ import { formatCrashLog } from "./daemon/crash-log.js";
13
13
  import { evaluateRestartState, filterActiveClaimsForAgent, filterCompletedHandoffsForAgent, formatRestartLifecycleLog, } from "./daemon/done-state-guard.js";
14
14
  import { cleanupGitAuth, setupGitAuth } from "./daemon/git-auth.js";
15
15
  import { getStuckDetail } from "./daemon/health-policy.js";
16
+ import { runLeadTick } from "./daemon/lead-loop.js";
17
+ import { isKnownRole, ROLE_DAEMON_BEHAVIOUR, VALID_ROLES } from "./daemon/roles.js";
16
18
  import { writeSandboxOpencodeConfig } from "./daemon/sandbox-config.js";
17
19
  import { isRecoverableSessionFailure } from "./daemon/session-recovery.js";
18
20
  import { captureAgentChildPids, persistRunningState } from "./daemon/state.js";
@@ -21,7 +23,7 @@ import { configureGitIdentity, setupWorkspace, updateWorkspaceFromRemote, valida
21
23
  import { findPendingHandoffBreaches } from "./handoff-sla.js";
22
24
  import { Heartbeat } from "./heartbeat.js";
23
25
  import { handleWebSocketEvent, injectInboxItems, injectOnboardMessage, injectRestoredContext, injectStartupMessage, } from "./injector.js";
24
- import { checkInbox, createClaim, createSelfAssignment, fetchAssignments, fetchHandoffsForAgent, fetchOnboard, fetchProjectByCode, getAgentAutonomyState, getHandoff, listClaims, registerAgent, releaseClaim, updateHandoffStatusWithRetry, } from "./registry.js";
26
+ import { checkInbox, createClaim, createSelfAssignment, fetchAssignments, fetchHandoffsForAgent, fetchOnboard, fetchProjectByCode, getAgentAutonomyState, getHandoff, listClaims, patchAgentMetadata, registerAgent, releaseClaim, updateHandoffStatusWithRetry, } from "./registry.js";
25
27
  import { getRunnerDisplayName } from "./runner.js";
26
28
  import { DockerSandbox } from "./sandbox.js";
27
29
  import { getLatestSessionId, waitForNewSessionId } from "./session-id.js";
@@ -72,6 +74,8 @@ export class AgentDaemon {
72
74
  autonomous;
73
75
  healthCheckInterval = null;
74
76
  inboxPollInterval = null;
77
+ leadInterval = null;
78
+ leadContext = null;
75
79
  stopCleanupScheduler = null;
76
80
  authHealthWatcher = null;
77
81
  // Session resume tracking
@@ -107,6 +111,18 @@ export class AgentDaemon {
107
111
  this.autonomous = options.autonomous ?? false;
108
112
  this.teamId = options.teamId || boot.agentConfig.teamId;
109
113
  this.runnerConfig = boot.runnerConfig;
114
+ // Fail fast for unknown predefined roles — free-form strings are fine
115
+ if (this.projectRole && this.projectRole !== "dev" && isKnownRole(this.projectRole)) {
116
+ // Valid predefined role — log it
117
+ console.log(`Role: ${this.projectRole} (${ROLE_DAEMON_BEHAVIOUR[this.projectRole]})`);
118
+ }
119
+ else if (this.projectRole &&
120
+ this.projectRole !== "dev" &&
121
+ !isKnownRole(this.projectRole) &&
122
+ options.role === this.projectRole) {
123
+ // Explicitly passed unknown role — warn but don't fail (may be free-form auto-assignment role)
124
+ console.log(`Role: ${this.projectRole} (free-form; predefined roles: ${VALID_ROLES.join(", ")})`);
125
+ }
110
126
  const runnerName = getRunnerDisplayName(this.runnerConfig.type);
111
127
  console.log(`Runner: ${runnerName}`);
112
128
  console.log(`Effective model: ${this.runnerConfig.model}`);
@@ -162,6 +178,12 @@ export class AgentDaemon {
162
178
  });
163
179
  this.agentId = registration.agentId;
164
180
  this.token = registration.token;
181
+ // Best-effort: store role in hub agent metadata (once at startup, GH-829)
182
+ if (this.projectRole && isKnownRole(this.projectRole)) {
183
+ patchAgentMetadata(this.config.hubUrl, this.agentId, this.token, {
184
+ role: this.projectRole,
185
+ }).catch(() => { }); // fire-and-forget; non-fatal
186
+ }
165
187
  // Persist the agentId back to config.json so it survives state.json wipes.
166
188
  // On next startup, agentConfig.agentId is the fallback when existingState is absent.
167
189
  upsertAgentConfig({ ...this.agentConfig, agentId: this.agentId });
@@ -427,6 +449,7 @@ export class AgentDaemon {
427
449
  const mdPath = writeClaudeMd({
428
450
  workdir: this.agentConfig.workdir,
429
451
  onboard: this.onboardData,
452
+ role: this.projectRole,
430
453
  options: {
431
454
  hubUrl: this.config.hubUrl,
432
455
  token: this.token ?? "",
@@ -497,6 +520,26 @@ export class AgentDaemon {
497
520
  this.isRunning = true;
498
521
  // Start session health monitoring (every 60 seconds)
499
522
  this.startHealthMonitor();
523
+ // Start lead coordination loop for lead/coordinator roles (GH-824, GH-829)
524
+ const roleBehaviour = isKnownRole(this.projectRole)
525
+ ? ROLE_DAEMON_BEHAVIOUR[this.projectRole]
526
+ : null;
527
+ if (roleBehaviour === "lead-loop" && this.token) {
528
+ this.leadContext = {
529
+ hubUrl: this.config.hubUrl,
530
+ token: this.token,
531
+ workspace: this.config.workspace,
532
+ teamId: this.teamId ?? "",
533
+ log: (msg) => console.log(msg),
534
+ };
535
+ const leadCtx = this.leadContext;
536
+ this.leadInterval = setInterval(() => {
537
+ runLeadTick(leadCtx).catch((err) => {
538
+ console.error(`[lead-loop] tick error: ${err.message}`);
539
+ });
540
+ }, 120_000);
541
+ console.log("[lead-loop] Lead coordination loop started (2-minute tick)");
542
+ }
500
543
  // Start evicted-agent cleanup scheduler (GH-421)
501
544
  if (this.token) {
502
545
  this.stopCleanupScheduler = startCleanupScheduler({
@@ -1026,6 +1069,10 @@ Nudge agent:
1026
1069
  clearInterval(this.inboxPollInterval);
1027
1070
  this.inboxPollInterval = null;
1028
1071
  }
1072
+ if (this.leadInterval) {
1073
+ clearInterval(this.leadInterval);
1074
+ this.leadInterval = null;
1075
+ }
1029
1076
  // Stop evicted-agent cleanup scheduler
1030
1077
  if (this.stopCleanupScheduler) {
1031
1078
  this.stopCleanupScheduler();