@agentbean/daemon 0.1.19 → 0.1.21

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.
@@ -204,6 +204,8 @@ export function createDeviceDaemon(cfg, agents) {
204
204
  networkId: cfg.networkId,
205
205
  agents: publicAgents,
206
206
  systemInfo,
207
+ daemonVersion: systemInfo.daemonVersion,
208
+ protocolVersion: 1,
207
209
  capabilities: {
208
210
  customAgentDispatch: true,
209
211
  },
package/dist/index.js CHANGED
@@ -187,28 +187,53 @@ function normalizeAgentUrl(serverUrl) {
187
187
  const base = normalizeBaseUrl(serverUrl);
188
188
  return `${base}/agent`;
189
189
  }
190
+ export const INVITE_CONNECTION_TIMEOUT_MS = 20_000;
191
+ export function createInviteSocketOptions() {
192
+ return {
193
+ auth: { invite: true },
194
+ reconnection: false,
195
+ timeout: INVITE_CONNECTION_TIMEOUT_MS,
196
+ };
197
+ }
198
+ export function socketErrorMessage(err) {
199
+ const details = [
200
+ err?.message,
201
+ err?.description?.message,
202
+ err?.context?.statusText?.code,
203
+ err?.context?.statusText?.message,
204
+ err?.context?.responseText,
205
+ ]
206
+ .filter((value) => typeof value === 'string' && value.trim())
207
+ .map((value) => value.trim());
208
+ return [...new Set(details)].join(': ') || 'unknown socket error';
209
+ }
190
210
  async function runInviteMode(serverUrl, inviteCode) {
191
211
  const { io } = await import('socket.io-client');
192
212
  const { execFile } = await import('node:child_process');
193
213
  const baseUrl = normalizeBaseUrl(serverUrl);
194
214
  const webSocketUrl = `${baseUrl}/web`;
215
+ console.log(`Connecting to AgentBean at ${baseUrl}...`);
195
216
  logger.info({ serverUrl: baseUrl, inviteCode }, 'invite mode: connecting to server');
196
- const socket = io(webSocketUrl, {
197
- auth: { invite: true },
198
- transports: ['websocket'],
199
- reconnection: false,
200
- });
217
+ const socket = io(webSocketUrl, createInviteSocketOptions());
201
218
  return new Promise((resolve, reject) => {
219
+ let connectTimer;
202
220
  const fail = (err) => {
221
+ clearTimeout(connectTimer);
203
222
  socket.disconnect();
204
223
  reject(err);
205
224
  };
225
+ connectTimer = setTimeout(() => {
226
+ fail(new Error(`connection timed out after 20s. Check network access to ${baseUrl} and try again.`));
227
+ }, INVITE_CONNECTION_TIMEOUT_MS);
206
228
  socket.on('connect_error', (err) => {
207
- logger.error({ err: err.message }, 'invite mode: connection failed');
208
- fail(new Error(`connection failed: ${err.message}`));
229
+ const message = socketErrorMessage(err);
230
+ logger.error({ err: message }, 'invite mode: connection failed');
231
+ fail(new Error(`connection failed: ${message}`));
209
232
  });
210
233
  socket.on('connect', () => {
234
+ clearTimeout(connectTimer);
211
235
  logger.info('invite mode: connected, validating invite code');
236
+ console.log('Connected. Validating invite code...');
212
237
  socket.emit('auth:invite:validate', { code: inviteCode }, (res) => {
213
238
  if (!res?.ok) {
214
239
  fail(new Error(res?.error ?? 'invalid invite code'));
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@agentbean/daemon",
3
3
  "private": false,
4
- "version": "0.1.19",
4
+ "version": "0.1.21",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "bin": {
8
+ "daemon": "dist/bin.js",
8
9
  "agentbean-daemon": "dist/bin.js"
9
10
  },
10
11
  "files": [