@relaycast/engine 5.0.3 → 5.0.4

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,7 @@
1
+ import type { EngineDb } from './ports/index.js';
2
+ /**
3
+ * Disconnect an agent currently hosted by an explicit node when the caller has
4
+ * no node-control socket frame to pass through `handleNodeControlMessage`.
5
+ */
6
+ export declare function handleAgentDisconnect(db: EngineDb, workspaceId: string, agentId: string): Promise<boolean>;
7
+ //# sourceMappingURL=agent-disconnect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-disconnect.d.ts","sourceRoot":"","sources":["../src/agent-disconnect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAyBlB"}
@@ -0,0 +1,25 @@
1
+ import { and, eq } from 'drizzle-orm';
2
+ import { agents } from './db/schema.js';
3
+ import { deregisterAgentViaNode, directNodeIdForAgent } from './engine/node.js';
4
+ /**
5
+ * Disconnect an agent currently hosted by an explicit node when the caller has
6
+ * no node-control socket frame to pass through `handleNodeControlMessage`.
7
+ */
8
+ export async function handleAgentDisconnect(db, workspaceId, agentId) {
9
+ const [agent] = await db
10
+ .select({
11
+ locationType: agents.locationType,
12
+ locationNodeId: agents.locationNodeId,
13
+ })
14
+ .from(agents)
15
+ .where(and(eq(agents.workspaceId, workspaceId), eq(agents.id, agentId)));
16
+ if (!agent
17
+ || agent.locationType !== 'via_node'
18
+ || !agent.locationNodeId
19
+ || agent.locationNodeId === directNodeIdForAgent(agentId)) {
20
+ return false;
21
+ }
22
+ const disconnected = await deregisterAgentViaNode(db, workspaceId, agent.locationNodeId, { agent_id: agentId });
23
+ return disconnected !== null;
24
+ }
25
+ //# sourceMappingURL=agent-disconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-disconnect.js","sourceRoot":"","sources":["../src/agent-disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAY,EACZ,WAAmB,EACnB,OAAe;IAEf,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE;SACrB,MAAM,CAAC;QACN,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC;SACZ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3E,IACE,CAAC,KAAK;WACH,KAAK,CAAC,YAAY,KAAK,UAAU;WACjC,CAAC,KAAK,CAAC,cAAc;WACrB,KAAK,CAAC,cAAc,KAAK,oBAAoB,CAAC,OAAO,CAAC,EACzD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAC/C,EAAE,EACF,WAAW,EACX,KAAK,CAAC,cAAc,EACpB,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;IACF,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export { runA2aHealthChecks } from './engine/a2a-health.js';
13
13
  export { sweepDueHttpPushDeliveries } from './routes/deliveryRouting.js';
14
14
  export { deliverPendingToNode } from './engine/delivery.js';
15
15
  export { handleNodeReconnect } from './node-reconnect.js';
16
+ export { handleAgentDisconnect } from './agent-disconnect.js';
16
17
  export { handleNodeControlMessage } from './engine/node.js';
17
18
  export type { HandleNodeControlMessageArgs, NodeSocketLike } from './engine/node.js';
18
19
  export { enqueueEvent, claimDueEvents, completeEvent, failEvent, rescheduleEvent, sweepPendingEvents, cleanupOldEvents, } from './engine/eventQueue.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGpE,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,4BAA4B,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMrF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMvE,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGpE,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,4BAA4B,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMrF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMvE,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ export { runA2aHealthChecks } from './engine/a2a-health.js';
18
18
  export { sweepDueHttpPushDeliveries } from './routes/deliveryRouting.js';
19
19
  export { deliverPendingToNode } from './engine/delivery.js';
20
20
  export { handleNodeReconnect } from './node-reconnect.js';
21
+ export { handleAgentDisconnect } from './agent-disconnect.js';
21
22
  export { handleNodeControlMessage } from './engine/node.js';
22
23
  // `pending_events` outbox primitives for queue-backed deployments: the queue
23
24
  // consumer settles rows (`completeEvent` / `failEvent` / `rescheduleEvent`)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAC;AAE/C,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiC3C,4DAA4D;AAC5D,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,yDAAyD;AACzD,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAEzC,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,6EAA6E;AAC7E,iEAAiE;AACjE,gFAAgF;AAChF,iDAAiD;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,4CAA4C;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAI/B,iBAAiB;AACjB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAC;AAE/C,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiC3C,4DAA4D;AAC5D,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,yDAAyD;AACzD,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAEzC,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,6EAA6E;AAC7E,iEAAiE;AACjE,gFAAgF;AAChF,iDAAiD;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,4CAA4C;AAC5C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAI/B,iBAAiB;AACjB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
@@ -34,6 +34,6 @@ export declare function errorResponse(c: Context, err: unknown, options?: ErrorR
34
34
  code: string;
35
35
  message: string;
36
36
  };
37
- }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
37
+ }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
38
38
  export {};
39
39
  //# sourceMappingURL=httpError.d.ts.map
@@ -53,7 +53,7 @@ export declare function jsonOk<T>(c: Context, data: T, status?: ContentfulStatus
53
53
  }[K], bigint | readonly bigint[]> | undefined : import("hono/utils/types").JSONParsed<{
54
54
  ok: true;
55
55
  data: T;
56
- }[K], bigint | readonly bigint[]>; }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
56
+ }[K], bigint | readonly bigint[]>; }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
57
57
  export declare function jsonSuccess(c: Context): Response & import("hono").TypedResponse<{
58
58
  ok: true;
59
59
  data: null;
@@ -79,7 +79,7 @@ export declare function jsonCreated<T>(c: Context, data: T): Response & import("
79
79
  }[K], bigint | readonly bigint[]> | undefined : import("hono/utils/types").JSONParsed<{
80
80
  ok: true;
81
81
  data: T;
82
- }[K], bigint | readonly bigint[]>; }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
82
+ }[K], bigint | readonly bigint[]>; }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
83
83
  export declare function jsonNoContent(c: Context): Response & import("hono").TypedResponse<null, 204, "body">;
84
84
  export declare function jsonError(c: Context, code: string, message: string, status: ContentfulStatusCode): Response & import("hono").TypedResponse<{
85
85
  ok: false;
@@ -87,28 +87,28 @@ export declare function jsonError(c: Context, code: string, message: string, sta
87
87
  code: string;
88
88
  message: string;
89
89
  };
90
- }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
90
+ }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
91
91
  export declare function jsonInvalidRequest(c: Context, message: string): Response & import("hono").TypedResponse<{
92
92
  ok: false;
93
93
  error: {
94
94
  code: string;
95
95
  message: string;
96
96
  };
97
- }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
97
+ }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
98
98
  export declare function jsonNotFound(c: Context, code: string, message: string): Response & import("hono").TypedResponse<{
99
99
  ok: false;
100
100
  error: {
101
101
  code: string;
102
102
  message: string;
103
103
  };
104
- }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
104
+ }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
105
105
  export declare function jsonMalformedBody(c: Context): Response & import("hono").TypedResponse<{
106
106
  ok: false;
107
107
  error: {
108
108
  code: string;
109
109
  message: string;
110
110
  };
111
- }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
111
+ }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
112
112
  export declare function parseJsonBody<T>(c: Context, schema: SafeParseSchema<T>, invalidMessage: InvalidRequestMessage, options?: ParseJsonBodyOptions): Promise<ParsedRequestValue<T>>;
113
113
  export declare function parseOptionalJsonBody<T>(c: Context, schema: SafeParseSchema<T>, invalidMessage: InvalidRequestMessage, options?: ParseJsonBodyOptions): Promise<ParsedRequestValue<T>>;
114
114
  export declare function parseQueryParams<T>(c: Context, schema: SafeParseSchema<T>, invalidMessage: InvalidRequestMessage): ParsedRequestValue<T>;
@@ -54,7 +54,7 @@ export declare function jsonIdempotentOk<T extends object>(c: Context, result: I
54
54
  }[K], bigint | readonly bigint[]> | undefined : import("hono/utils/types").JSONParsed<{
55
55
  ok: true;
56
56
  data: Omit<T & DeliveryInternals, "_deliveries" | "_delivery_rejections" | "_delivery">;
57
- }[K], bigint | readonly bigint[]>; }, 300 | -1 | 200 | 500 | 400 | 100 | 102 | 103 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">;
57
+ }[K], bigint | readonly bigint[]>; }, 300 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">;
58
58
  export declare function runIdempotent<T>(options: RunIdempotentOptions<T>): Promise<IdempotentResult<T>>;
59
59
  export {};
60
60
  //# sourceMappingURL=idempotency.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/routes/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAYxC,eAAO,MAAM,cAAc,qDAAqB,CAAC"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/routes/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAaxC,eAAO,MAAM,cAAc,qDAAqB,CAAC"}
@@ -2,6 +2,7 @@ import { Hono } from 'hono';
2
2
  import { requireWorkspaceRead, requireAgentToken } from '../middleware/auth.js';
3
3
  import { rateLimit } from '../middleware/rateLimit.js';
4
4
  import * as presenceEngine from '../engine/presence.js';
5
+ import { handleAgentDisconnect } from '../agent-disconnect.js';
5
6
  import { getObserverTokenFromContext, observerAllowsAgent, } from '../engine/observerToken.js';
6
7
  import { emitServerEvent } from '../lib/serverTelemetry.js';
7
8
  import { errorResponse } from '../lib/httpError.js';
@@ -39,9 +40,11 @@ presenceRoutes.post('/agents/heartbeat', requireAgentToken, rateLimit, async (c)
39
40
  // POST /agents/disconnect — explicitly mark agent offline.
40
41
  presenceRoutes.post('/agents/disconnect', requireAgentToken, rateLimit, async (c) => {
41
42
  try {
43
+ const db = c.get('db');
42
44
  const agent = c.get('agent');
43
45
  const workspace = c.get('workspace');
44
46
  const { presence } = c.get('engine');
47
+ await handleAgentDisconnect(db, workspace.id, agent.id);
45
48
  await presence.disconnect(workspace.id, agent.id, agent.name);
46
49
  emitServerEvent(c, workspace.id, 'relaycast_server_presence_disconnected', {
47
50
  agent_id: agent.id,
@@ -1 +1 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/routes/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,IAAI,EAAU,CAAC;AAEjD,cAAc,CAAC,GAAG,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjG,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;aAC1F,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8FAA8F;AAC9F,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7E,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,qCAAqC,EAAE;YACtE,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,UAAU,EAAE,KAAK,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,2DAA2D;AAC3D,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAErC,MAAM,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9D,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,wCAAwC,EAAE;YACzE,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,UAAU,EAAE,KAAK,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/routes/presence.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relaycast/engine",
3
- "version": "5.0.3",
3
+ "version": "5.0.4",
4
4
  "type": "module",
5
5
  "description": "Portable, platform-agnostic engine for Relaycast — channels, threads, DMs, presence, real-time events. Runs on Node + SQLite (self-host) or behind a Cloudflare Durable Object adapter (hosted).",
6
6
  "bin": {
@@ -35,6 +35,10 @@
35
35
  "types": "./dist/node-reconnect.d.ts",
36
36
  "import": "./dist/node-reconnect.js"
37
37
  },
38
+ "./agent-disconnect": {
39
+ "types": "./dist/agent-disconnect.d.ts",
40
+ "import": "./dist/agent-disconnect.js"
41
+ },
38
42
  "./node-control": {
39
43
  "types": "./dist/node-control.d.ts",
40
44
  "import": "./dist/node-control.js"
@@ -51,8 +55,8 @@
51
55
  },
52
56
  "dependencies": {
53
57
  "@hono/node-server": "^1.13.7",
54
- "@relaycast/a2a": "5.0.3",
55
- "@relaycast/types": "5.0.3",
58
+ "@relaycast/a2a": "5.0.4",
59
+ "@relaycast/types": "5.0.4",
56
60
  "better-sqlite3": "^11.10.0",
57
61
  "drizzle-orm": "^0.45.1",
58
62
  "hono": "^4.11.9",