@teamvibe/poller 0.1.14 → 0.1.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.
@@ -2,7 +2,25 @@ import { logger } from './logger.js';
2
2
  let currentCredentials = null;
3
3
  let currentConfig = null;
4
4
  let refreshTimer = null;
5
+ let heartbeatTimer = null;
5
6
  const REFRESH_INTERVAL_MS = 50 * 60 * 1000; // 50 minutes (before 1hr expiry)
7
+ const HEARTBEAT_INTERVAL_MS = 60 * 1000; // 1 minute
8
+ async function sendHeartbeat(apiUrl, token) {
9
+ try {
10
+ const response = await fetch(`${apiUrl}/heartbeat`, {
11
+ method: 'POST',
12
+ headers: {
13
+ Authorization: `Bearer ${token}`,
14
+ },
15
+ });
16
+ if (!response.ok) {
17
+ logger.warn(`Heartbeat failed (${response.status})`);
18
+ }
19
+ }
20
+ catch (error) {
21
+ logger.warn(`Heartbeat error: ${error instanceof Error ? error.message : error}`);
22
+ }
23
+ }
6
24
  async function fetchCredentials(apiUrl, token) {
7
25
  const response = await fetch(`${apiUrl}/auth`, {
8
26
  method: 'POST',
@@ -25,6 +43,9 @@ export async function initAuth(apiUrl, token) {
25
43
  logger.info(`Authenticated successfully. Region: ${auth.config.region}`);
26
44
  logger.info(` SQS Queue: ${auth.config.sqsQueueUrl}`);
27
45
  logger.info(` Sessions Table: ${auth.config.sessionsTable}`);
46
+ // Send initial heartbeat and schedule periodic heartbeats
47
+ sendHeartbeat(apiUrl, token);
48
+ heartbeatTimer = setInterval(() => sendHeartbeat(apiUrl, token), HEARTBEAT_INTERVAL_MS);
28
49
  // Schedule credential refresh
29
50
  refreshTimer = setInterval(async () => {
30
51
  try {
@@ -59,4 +80,8 @@ export function stopRefresh() {
59
80
  clearInterval(refreshTimer);
60
81
  refreshTimer = null;
61
82
  }
83
+ if (heartbeatTimer) {
84
+ clearInterval(heartbeatTimer);
85
+ heartbeatTimer = null;
86
+ }
62
87
  }
@@ -2,7 +2,6 @@ interface BrainConfig {
2
2
  brainId: string;
3
3
  gitRepoUrl: string;
4
4
  branch: string;
5
- claudePath: string;
6
5
  }
7
6
  /**
8
7
  * Get or clone brain repo. Returns the working directory path.
package/dist/config.js CHANGED
@@ -13,8 +13,8 @@ const configSchema = z.object({
13
13
  // Poller settings
14
14
  MAX_CONCURRENT_SESSIONS: z.coerce.number().default(5),
15
15
  POLL_WAIT_TIME_SECONDS: z.coerce.number().default(20),
16
- VISIBILITY_TIMEOUT_SECONDS: z.coerce.number().default(300),
17
- HEARTBEAT_INTERVAL_MS: z.coerce.number().default(60000), // 1 minute
16
+ VISIBILITY_TIMEOUT_SECONDS: z.coerce.number().default(60),
17
+ HEARTBEAT_INTERVAL_MS: z.coerce.number().default(40000), // 40 seconds
18
18
  CLAUDE_TIMEOUT_MS: z.coerce.number().default(1800000), // 30 minutes
19
19
  STALE_LOCK_TIMEOUT_MS: z.coerce.number().default(2100000), // 35 minutes
20
20
  // Paths
package/dist/types.d.ts CHANGED
@@ -33,7 +33,6 @@ export interface TeamVibeQueueMessage {
33
33
  brainId: string;
34
34
  gitRepoUrl: string;
35
35
  branch: string;
36
- claudePath: string;
37
36
  };
38
37
  };
39
38
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamvibe/poller",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {