@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.
- package/dist/__tests__/bootstrap.test.js +24 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -1
- package/dist/__tests__/injector.test.js +38 -1
- package/dist/__tests__/injector.test.js.map +1 -1
- package/dist/__tests__/lead-loop.test.d.ts +1 -0
- package/dist/__tests__/lead-loop.test.js +170 -0
- package/dist/__tests__/lead-loop.test.js.map +1 -0
- package/dist/__tests__/roles.test.d.ts +1 -0
- package/dist/__tests__/roles.test.js +78 -0
- package/dist/__tests__/roles.test.js.map +1 -0
- package/dist/__tests__/start-team-id.test.js +8 -3
- package/dist/__tests__/start-team-id.test.js.map +1 -1
- package/dist/cli/index.js +54 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/relay.d.ts +10 -0
- package/dist/cli/relay.js +209 -0
- package/dist/cli/relay.js.map +1 -0
- package/dist/cli/start.d.ts +2 -0
- package/dist/cli/start.js +42 -7
- package/dist/cli/start.js.map +1 -1
- package/dist/core/daemon/bootstrap.js +14 -4
- package/dist/core/daemon/bootstrap.js.map +1 -1
- package/dist/core/daemon/context-template.d.ts +5 -1
- package/dist/core/daemon/context-template.js +16 -2
- package/dist/core/daemon/context-template.js.map +1 -1
- package/dist/core/daemon/lead-loop.d.ts +22 -0
- package/dist/core/daemon/lead-loop.js +155 -0
- package/dist/core/daemon/lead-loop.js.map +1 -0
- package/dist/core/daemon/roles.d.ts +25 -0
- package/dist/core/daemon/roles.js +43 -0
- package/dist/core/daemon/roles.js.map +1 -0
- package/dist/core/daemon.d.ts +2 -0
- package/dist/core/daemon.js +48 -1
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/injector.js +61 -1
- package/dist/core/injector.js.map +1 -1
- package/dist/core/registry.d.ts +5 -0
- package/dist/core/registry.js +19 -0
- package/dist/core/registry.js.map +1 -1
- package/package.json +12 -11
- package/LICENSE +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-template.js","sourceRoot":"","sources":["../../../src/core/daemon/context-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
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"}
|
package/dist/core/daemon.d.ts
CHANGED
|
@@ -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;
|
package/dist/core/daemon.js
CHANGED
|
@@ -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();
|