@agentmeshhq/agent 0.4.10 → 0.4.12

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.
@@ -0,0 +1,487 @@
1
+ import { spawn } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import pc from "picocolors";
6
+ import { loadConfig, loadState } from "../config/loader.js";
7
+ import { startProjectWatcherLoop } from "../core/project-watcher-loop.js";
8
+ const WATCHER_STATE_PATH = path.join(process.env.HOME || ".", ".agentmesh", "watcher-state.json");
9
+ function ensureConfigDir() {
10
+ const dir = path.dirname(WATCHER_STATE_PATH);
11
+ if (!fs.existsSync(dir))
12
+ fs.mkdirSync(dir, { recursive: true });
13
+ }
14
+ function loadWatcherState() {
15
+ try {
16
+ if (!fs.existsSync(WATCHER_STATE_PATH))
17
+ return { watchers: [] };
18
+ return JSON.parse(fs.readFileSync(WATCHER_STATE_PATH, "utf-8"));
19
+ }
20
+ catch {
21
+ return { watchers: [] };
22
+ }
23
+ }
24
+ function saveWatcherState(state) {
25
+ ensureConfigDir();
26
+ fs.writeFileSync(WATCHER_STATE_PATH, JSON.stringify(state, null, 2));
27
+ }
28
+ function upsertWatcherState(entry) {
29
+ const state = loadWatcherState();
30
+ state.watchers = state.watchers.filter((w) => {
31
+ if (entry.projectId)
32
+ return w.projectId !== entry.projectId;
33
+ return w.teamId !== entry.teamId;
34
+ });
35
+ state.watchers.push(entry);
36
+ saveWatcherState(state);
37
+ }
38
+ function patchWatcherState(teamId, updates) {
39
+ const state = loadWatcherState();
40
+ const idx = state.watchers.findIndex((w) => w.teamId === teamId);
41
+ if (idx === -1)
42
+ return;
43
+ state.watchers[idx] = { ...state.watchers[idx], ...updates };
44
+ saveWatcherState(state);
45
+ }
46
+ function patchProjectWatcherState(projectId, updates) {
47
+ const state = loadWatcherState();
48
+ const idx = state.watchers.findIndex((w) => w.projectId === projectId);
49
+ if (idx === -1)
50
+ return;
51
+ state.watchers[idx] = { ...state.watchers[idx], ...updates };
52
+ saveWatcherState(state);
53
+ }
54
+ function resolveAuthContext(agentName) {
55
+ const config = loadConfig();
56
+ if (!config)
57
+ throw new Error("No config found. Run 'agentmesh init' first.");
58
+ const envToken = process.env.AGENT_TOKEN;
59
+ const envAgentId = process.env.AGENTMESH_AGENT_ID;
60
+ if (envToken && !agentName) {
61
+ return {
62
+ hubUrl: config.hubUrl,
63
+ workspace: config.workspace,
64
+ token: envToken,
65
+ agentId: envAgentId,
66
+ };
67
+ }
68
+ const state = loadState();
69
+ let agent = agentName ? state.agents.find((a) => a.name === agentName) : undefined;
70
+ if (!agent && !agentName && envAgentId) {
71
+ agent = state.agents.find((a) => a.agentId === envAgentId);
72
+ }
73
+ if (!agent && !agentName) {
74
+ if (state.agents.length === 1) {
75
+ agent = state.agents[0];
76
+ }
77
+ else if (state.agents.length > 1) {
78
+ throw new Error("Multiple agents found. Pass --name to select which agent token to use.");
79
+ }
80
+ }
81
+ if (!agent) {
82
+ if (agentName)
83
+ throw new Error(`Agent "${agentName}" not found.`);
84
+ throw new Error("No agent token available. Start an agent or run inside an agent session.");
85
+ }
86
+ if (!agent.token) {
87
+ throw new Error(`No token found for agent "${agent.name}". Run 'agentmesh token refresh --name ${agent.name}'.`);
88
+ }
89
+ return {
90
+ hubUrl: config.hubUrl,
91
+ workspace: config.workspace,
92
+ token: agent.token,
93
+ agentName: agent.name,
94
+ agentId: agent.agentId,
95
+ };
96
+ }
97
+ async function meshRequest(context, pathName, init = {}) {
98
+ const response = await fetch(`${context.hubUrl}${pathName}`, {
99
+ ...init,
100
+ headers: {
101
+ Authorization: `Bearer ${context.token}`,
102
+ ...(init.headers ?? {}),
103
+ },
104
+ });
105
+ if (!response.ok) {
106
+ const text = await response.text();
107
+ throw new Error(`Hub request failed (${response.status}): ${text}`);
108
+ }
109
+ if (response.status === 204)
110
+ return {};
111
+ return (await response.json());
112
+ }
113
+ function getWatcherState(teamId) {
114
+ return loadWatcherState().watchers.find((w) => w.teamId === teamId);
115
+ }
116
+ function validateIntervals(options) {
117
+ const intervalSeconds = options.intervalSeconds ?? 15;
118
+ const heartbeatSeconds = options.heartbeatSeconds ?? 10;
119
+ const ttlSeconds = options.ttlSeconds ?? 30;
120
+ if (!Number.isInteger(intervalSeconds) || intervalSeconds < 5 || intervalSeconds > 300) {
121
+ throw new Error("interval-seconds must be an integer between 5 and 300.");
122
+ }
123
+ if (!Number.isInteger(heartbeatSeconds) || heartbeatSeconds < 5 || heartbeatSeconds > 120) {
124
+ throw new Error("heartbeat-seconds must be an integer between 5 and 120.");
125
+ }
126
+ if (!Number.isInteger(ttlSeconds) || ttlSeconds < 10 || ttlSeconds > 300) {
127
+ throw new Error("ttl-seconds must be an integer between 10 and 300.");
128
+ }
129
+ return { intervalSeconds, heartbeatSeconds, ttlSeconds };
130
+ }
131
+ export async function startWatcher(options) {
132
+ if (!options.teamId?.trim())
133
+ throw new Error("team-id is required.");
134
+ const existing = getWatcherState(options.teamId);
135
+ if (existing && existing.pid > 0) {
136
+ try {
137
+ process.kill(existing.pid, 0);
138
+ throw new Error(`Watcher for team ${options.teamId} is already running (pid ${existing.pid}).`);
139
+ }
140
+ catch {
141
+ // stale pid, continue
142
+ }
143
+ }
144
+ const timings = validateIntervals(options);
145
+ if (!options.foreground) {
146
+ const cliPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../cli/index.js");
147
+ const args = [
148
+ "watcher",
149
+ "start",
150
+ "--team-id",
151
+ options.teamId,
152
+ "--foreground",
153
+ "--interval-seconds",
154
+ String(timings.intervalSeconds),
155
+ "--heartbeat-seconds",
156
+ String(timings.heartbeatSeconds),
157
+ "--ttl-seconds",
158
+ String(timings.ttlSeconds),
159
+ ];
160
+ if (options.name)
161
+ args.push("--name", options.name);
162
+ const child = spawn("node", [cliPath, ...args], {
163
+ detached: true,
164
+ stdio: "ignore",
165
+ env: process.env,
166
+ });
167
+ child.unref();
168
+ upsertWatcherState({
169
+ teamId: options.teamId,
170
+ pid: child.pid ?? 0,
171
+ startedAt: new Date().toISOString(),
172
+ status: "starting",
173
+ agentName: options.name,
174
+ });
175
+ console.log(pc.green(`Watcher starting for team ${options.teamId} (PID: ${child.pid}).`));
176
+ return;
177
+ }
178
+ const context = resolveAuthContext(options.name);
179
+ const holderName = context.agentName ?? "watcher";
180
+ const holderId = context.agentId ?? holderName;
181
+ const acquire = await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/acquire`, {
182
+ method: "POST",
183
+ headers: { "Content-Type": "application/json" },
184
+ body: JSON.stringify({
185
+ holder_id: holderId,
186
+ holder_name: holderName,
187
+ ttl_seconds: timings.ttlSeconds,
188
+ }),
189
+ });
190
+ if (!acquire.acquired || !acquire.lease_token) {
191
+ throw new Error(`Failed to acquire watcher lease for team ${options.teamId}${acquire.reason_code ? `: ${acquire.reason_code}` : ""}.`);
192
+ }
193
+ const leaseToken = acquire.lease_token;
194
+ const latest = await fetch(`${context.hubUrl}/api/v1/teams/${options.teamId}/watcher/snapshot/latest`, {
195
+ headers: { Authorization: `Bearer ${context.token}` },
196
+ });
197
+ let seq = 1;
198
+ if (latest.ok) {
199
+ const latestBody = (await latest.json());
200
+ if (typeof latestBody.seq === "number" && Number.isInteger(latestBody.seq)) {
201
+ seq = latestBody.seq + 1;
202
+ }
203
+ }
204
+ let stopping = false;
205
+ const shutdown = async () => {
206
+ if (stopping)
207
+ return;
208
+ stopping = true;
209
+ clearInterval(heartbeatTimer);
210
+ clearInterval(snapshotTimer);
211
+ try {
212
+ await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/snapshots`, {
213
+ method: "POST",
214
+ headers: { "Content-Type": "application/json" },
215
+ body: JSON.stringify({
216
+ seq,
217
+ status: "degraded",
218
+ reason_code: "watcher_stopped",
219
+ payload: {
220
+ holder_id: holderId,
221
+ stopped_at: new Date().toISOString(),
222
+ },
223
+ }),
224
+ });
225
+ seq += 1;
226
+ }
227
+ catch {
228
+ // best effort only
229
+ }
230
+ try {
231
+ await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/release`, {
232
+ method: "POST",
233
+ headers: { "Content-Type": "application/json" },
234
+ body: JSON.stringify({ lease_token: leaseToken }),
235
+ });
236
+ }
237
+ catch {
238
+ // best effort only
239
+ }
240
+ patchWatcherState(options.teamId, { status: "stopped" });
241
+ process.exit(0);
242
+ };
243
+ process.on("SIGINT", shutdown);
244
+ process.on("SIGTERM", shutdown);
245
+ upsertWatcherState({
246
+ teamId: options.teamId,
247
+ pid: process.pid,
248
+ startedAt: new Date().toISOString(),
249
+ status: "starting",
250
+ leaseToken,
251
+ agentName: options.name,
252
+ });
253
+ const heartbeatTimer = setInterval(async () => {
254
+ if (stopping)
255
+ return;
256
+ try {
257
+ const renewed = await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/renew`, {
258
+ method: "POST",
259
+ headers: { "Content-Type": "application/json" },
260
+ body: JSON.stringify({
261
+ lease_token: leaseToken,
262
+ ttl_seconds: timings.ttlSeconds,
263
+ }),
264
+ });
265
+ if (!renewed.ok) {
266
+ throw new Error(renewed.reason_code ?? "lease_renew_failed");
267
+ }
268
+ patchWatcherState(options.teamId, {
269
+ status: "running",
270
+ lastHeartbeatAt: new Date().toISOString(),
271
+ leaseToken,
272
+ });
273
+ }
274
+ catch (error) {
275
+ patchWatcherState(options.teamId, { status: "failed" });
276
+ console.error(pc.red(`Watcher lease renewal failed: ${error.message}`));
277
+ await shutdown();
278
+ }
279
+ }, timings.heartbeatSeconds * 1000);
280
+ const snapshotTimer = setInterval(async () => {
281
+ if (stopping)
282
+ return;
283
+ try {
284
+ await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/snapshots`, {
285
+ method: "POST",
286
+ headers: { "Content-Type": "application/json" },
287
+ body: JSON.stringify({
288
+ seq,
289
+ status: "ok",
290
+ payload: {
291
+ holder_id: holderId,
292
+ heartbeat_seconds: timings.heartbeatSeconds,
293
+ interval_seconds: timings.intervalSeconds,
294
+ uptime_seconds: Math.floor(process.uptime()),
295
+ },
296
+ }),
297
+ });
298
+ seq += 1;
299
+ }
300
+ catch (error) {
301
+ console.error(pc.yellow(`Snapshot publish skipped: ${error.message}`));
302
+ }
303
+ }, timings.intervalSeconds * 1000);
304
+ await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/snapshots`, {
305
+ method: "POST",
306
+ headers: { "Content-Type": "application/json" },
307
+ body: JSON.stringify({
308
+ seq,
309
+ status: "ok",
310
+ payload: {
311
+ holder_id: holderId,
312
+ started_at: new Date().toISOString(),
313
+ },
314
+ }),
315
+ });
316
+ seq += 1;
317
+ patchWatcherState(options.teamId, { leaseToken, status: "running" });
318
+ console.log(pc.green(`Watcher loop running for team ${options.teamId}. Lease token: ${leaseToken}`));
319
+ await new Promise(() => { });
320
+ }
321
+ export async function stopWatcher(options) {
322
+ const watcher = getWatcherState(options.teamId);
323
+ if (!watcher || watcher.pid <= 0) {
324
+ console.log(pc.yellow(`No local watcher process found for team ${options.teamId}.`));
325
+ return;
326
+ }
327
+ try {
328
+ process.kill(watcher.pid, "SIGTERM");
329
+ }
330
+ catch {
331
+ // process already gone
332
+ }
333
+ patchWatcherState(options.teamId, { status: "stopped" });
334
+ console.log(pc.green(`Stop signal sent to watcher for team ${options.teamId} (PID: ${watcher.pid}).`));
335
+ }
336
+ export async function watcherStatus(options) {
337
+ const context = resolveAuthContext(options.name);
338
+ const stale = options.staleAfterSeconds && Number.isInteger(options.staleAfterSeconds)
339
+ ? `?stale_after_seconds=${options.staleAfterSeconds}`
340
+ : "";
341
+ const remote = await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/status${stale}`);
342
+ const local = getWatcherState(options.teamId) ?? null;
343
+ if (options.json) {
344
+ console.log(JSON.stringify({ local, remote }, null, 2));
345
+ return;
346
+ }
347
+ console.log(pc.bold(`Watcher status for team ${options.teamId}`));
348
+ console.log(`Remote status: ${String(remote.status)}`);
349
+ console.log(`Remote seq: ${String(remote.seq)}`);
350
+ const reasons = Array.isArray(remote.reason_codes) ? remote.reason_codes : [];
351
+ console.log(`Reason codes: ${reasons.length > 0 ? reasons.join(", ") : "-"}`);
352
+ if (local) {
353
+ console.log(`Local process: PID ${local.pid} (${local.status})`);
354
+ console.log(`Started at: ${local.startedAt}`);
355
+ if (local.lastHeartbeatAt)
356
+ console.log(`Last heartbeat: ${local.lastHeartbeatAt}`);
357
+ }
358
+ else {
359
+ console.log("Local process: not found");
360
+ }
361
+ }
362
+ export async function pullWatcher(options) {
363
+ const context = resolveAuthContext(options.name);
364
+ const snapshot = await meshRequest(context, `/api/v1/teams/${options.teamId}/watcher/snapshot/latest`);
365
+ if (options.json) {
366
+ console.log(JSON.stringify(snapshot, null, 2));
367
+ return;
368
+ }
369
+ console.log(pc.bold(`Latest watcher snapshot for team ${options.teamId}`));
370
+ console.log(`Seq: ${String(snapshot.seq)}`);
371
+ console.log(`Status: ${String(snapshot.status)}`);
372
+ console.log(`Reason: ${snapshot.reason_code ? String(snapshot.reason_code) : "-"}`);
373
+ console.log(`Generated at: ${String(snapshot.generated_at)}`);
374
+ if (snapshot.payload && typeof snapshot.payload === "object") {
375
+ console.log(`Payload: ${JSON.stringify(snapshot.payload)}`);
376
+ }
377
+ }
378
+ /** Lease TTL for project watchers (matches hub PROJECT_WATCHER_LEASE_TTL_SECONDS). */
379
+ const PROJECT_WATCHER_LEASE_TTL_SECONDS = 300;
380
+ /** Renewal interval: renew at 60% of TTL. */
381
+ export const PROJECT_WATCHER_RENEWAL_INTERVAL_SECONDS = Math.floor(PROJECT_WATCHER_LEASE_TTL_SECONDS * 0.6); // 180s
382
+ export async function startProjectWatcher(options) {
383
+ if (!options.projectId?.trim())
384
+ throw new Error("project-id is required.");
385
+ const intervalSeconds = options.intervalSeconds ?? 60;
386
+ if (!Number.isInteger(intervalSeconds) || intervalSeconds < 10 || intervalSeconds > 300) {
387
+ throw new Error("interval must be an integer between 10 and 300.");
388
+ }
389
+ // Background mode: re-spawn self in foreground
390
+ if (!options.foreground) {
391
+ const cliPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../cli/index.js");
392
+ const args = [
393
+ "watcher",
394
+ "start",
395
+ "--project-id",
396
+ options.projectId,
397
+ "--foreground",
398
+ "--interval",
399
+ String(intervalSeconds),
400
+ ];
401
+ if (options.name)
402
+ args.push("--name", options.name);
403
+ const child = spawn("node", [cliPath, ...args], {
404
+ detached: true,
405
+ stdio: "ignore",
406
+ env: process.env,
407
+ });
408
+ child.unref();
409
+ upsertWatcherState({
410
+ projectId: options.projectId,
411
+ pid: child.pid ?? 0,
412
+ startedAt: new Date().toISOString(),
413
+ status: "starting",
414
+ agentName: options.name,
415
+ });
416
+ console.log(pc.green(`Project watcher starting for ${options.projectId} (PID: ${child.pid}).`));
417
+ return;
418
+ }
419
+ const context = resolveAuthContext(options.name);
420
+ // Provision / re-attach lease
421
+ const provision = await meshRequest(context, `/api/v1/projects/${options.projectId}/watcher/provision`, {
422
+ method: "POST",
423
+ headers: { "Content-Type": "application/json" },
424
+ body: "{}",
425
+ });
426
+ const watcherId = provision.watcher_id;
427
+ if (provision.status === "already_running") {
428
+ console.log(pc.yellow(`Project watcher already provisioned for ${options.projectId} (watcher_id: ${watcherId}). Attaching to existing lease.`));
429
+ }
430
+ else {
431
+ console.log(pc.green(`Project watcher provisioned for ${options.projectId} (watcher_id: ${watcherId}).`));
432
+ }
433
+ upsertWatcherState({
434
+ projectId: options.projectId,
435
+ watcherId,
436
+ pid: process.pid,
437
+ startedAt: new Date().toISOString(),
438
+ status: "running",
439
+ agentName: options.name,
440
+ });
441
+ const shutdown = async () => {
442
+ try {
443
+ await meshRequest(context, `/api/v1/projects/${options.projectId}/watcher/lease/release`, {
444
+ method: "POST",
445
+ headers: { "Content-Type": "application/json" },
446
+ body: "{}",
447
+ });
448
+ console.log(pc.green("[shutdown] Project watcher lease released."));
449
+ }
450
+ catch {
451
+ // best effort
452
+ }
453
+ patchProjectWatcherState(options.projectId, { status: "stopped" });
454
+ process.exit(0);
455
+ };
456
+ process.on("SIGINT", shutdown);
457
+ process.on("SIGTERM", shutdown);
458
+ startProjectWatcherLoop({
459
+ intervalSeconds,
460
+ renewalIntervalSeconds: PROJECT_WATCHER_RENEWAL_INTERVAL_SECONDS,
461
+ async onTick() {
462
+ return meshRequest(context, `/api/v1/projects/${options.projectId}/watcher/tick`, {
463
+ method: "POST",
464
+ headers: { "Content-Type": "application/json" },
465
+ body: JSON.stringify({ dry_run: false }),
466
+ });
467
+ },
468
+ async onRenew() {
469
+ const result = await meshRequest(context, `/api/v1/projects/${options.projectId}/watcher/lease/renew`, {
470
+ method: "POST",
471
+ headers: { "Content-Type": "application/json" },
472
+ body: JSON.stringify({ watcher_id: watcherId }),
473
+ });
474
+ if (result.renewed) {
475
+ patchProjectWatcherState(options.projectId, { lastHeartbeatAt: new Date().toISOString() });
476
+ }
477
+ return result;
478
+ },
479
+ onLog: (msg) => console.log(pc.cyan(msg)),
480
+ onError: (msg) => console.error(pc.red(msg)),
481
+ onShutdown: shutdown,
482
+ });
483
+ console.log(pc.green(`Project watcher loop running for ${options.projectId}. Tick every ${intervalSeconds}s, lease renewal every ${PROJECT_WATCHER_RENEWAL_INTERVAL_SECONDS}s.`));
484
+ // Keep process alive
485
+ await new Promise(() => { });
486
+ }
487
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/cli/watcher.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ export interface AgentConfig {
5
5
  workdir?: string;
6
6
  model?: string;
7
7
  teams?: string[];
8
+ /** Team ID to assign this worker agent to on registration. Required for worker agents. */
9
+ teamId?: string;
8
10
  /** agent_type sent to hub on registration. Defaults to "worker". */
9
11
  agentType?: "worker" | "system" | "autonomous";
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,MAAM,EAAE,yBAAyB;IACjC,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,iBAAiB;KACzB;IACD,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC;AACxE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,wBAAwB,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,MAAM,EAAE,yBAAyB;IACjC,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,iBAAiB;KACzB;IACD,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC;AACxE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,wBAAwB,CAAC"}
@@ -30,6 +30,8 @@ export interface DaemonOptions {
30
30
  autoAcceptHandoffs?: boolean;
31
31
  /** Run agent in fully autonomous mode — injects runtime-specific non-interactive flags */
32
32
  autonomous?: boolean;
33
+ /** Team ID to register this worker agent with (required for --worker) */
34
+ teamId?: string;
33
35
  }
34
36
  export declare class AgentDaemon {
35
37
  private agentName;
@@ -67,6 +69,7 @@ export declare class AgentDaemon {
67
69
  private lastPendingHandoffAlertAt;
68
70
  private remoteAutomationPaused;
69
71
  private lastAutonomyPolicyFetchAt;
72
+ private teamId;
70
73
  private pendingClaimCreations;
71
74
  private sessionRecoveryAttempts;
72
75
  private lastSessionRecoveryAt;
@@ -81,6 +81,7 @@ export class AgentDaemon {
81
81
  lastPendingHandoffAlertAt = null;
82
82
  remoteAutomationPaused = false;
83
83
  lastAutonomyPolicyFetchAt = null;
84
+ teamId;
84
85
  pendingClaimCreations = new Set();
85
86
  sessionRecoveryAttempts = 0;
86
87
  lastSessionRecoveryAt = null;
@@ -103,6 +104,7 @@ export class AgentDaemon {
103
104
  this.projectRole = boot.projectRole;
104
105
  this.autoAcceptHandoffs = boot.autoAcceptHandoffs;
105
106
  this.autonomous = options.autonomous ?? false;
107
+ this.teamId = options.teamId || boot.agentConfig.teamId;
106
108
  this.runnerConfig = boot.runnerConfig;
107
109
  const runnerName = getRunnerDisplayName(this.runnerConfig.type);
108
110
  console.log(`Runner: ${runnerName}`);
@@ -155,6 +157,7 @@ export class AgentDaemon {
155
157
  model: this.agentConfig.model || this.config.defaults.model,
156
158
  restoreContext: this.shouldRestoreContext,
157
159
  agentType: effectiveAgentType,
160
+ teamId: this.teamId,
158
161
  });
159
162
  this.agentId = registration.agentId;
160
163
  this.token = registration.token;