@relaycast/engine 6.0.5 → 6.2.0
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/adapters/node/delivery-maintenance.d.ts +1 -1
- package/dist/adapters/node/delivery-maintenance.d.ts.map +1 -1
- package/dist/adapters/node/delivery-maintenance.js +4 -4
- package/dist/adapters/node/delivery-maintenance.js.map +1 -1
- package/dist/adapters/node/event-queue.d.ts +2 -1
- package/dist/adapters/node/event-queue.d.ts.map +1 -1
- package/dist/adapters/node/event-queue.js.map +1 -1
- package/dist/adapters/node/index.js +2 -2
- package/dist/adapters/node/index.js.map +1 -1
- package/dist/adapters/node/realtime.d.ts.map +1 -1
- package/dist/adapters/node/realtime.js +45 -3
- package/dist/adapters/node/realtime.js.map +1 -1
- package/dist/agent-disconnect.d.ts +23 -1
- package/dist/agent-disconnect.d.ts.map +1 -1
- package/dist/agent-disconnect.js +20 -2
- package/dist/agent-disconnect.js.map +1 -1
- package/dist/bin/serve.js +9 -0
- package/dist/bin/serve.js.map +1 -1
- package/dist/db/migrations/0032_invocation_handler_unreachable.sql +5 -0
- package/dist/db/schema.d.ts +17 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +4 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/action.d.ts +34 -13
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +323 -57
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/delivery.d.ts +21 -1
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +79 -9
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/inboundWebhook.d.ts +1 -0
- package/dist/engine/inboundWebhook.d.ts.map +1 -1
- package/dist/engine/inboundWebhook.js +1 -0
- package/dist/engine/inboundWebhook.js.map +1 -1
- package/dist/engine/invocationCompletion.d.ts +43 -0
- package/dist/engine/invocationCompletion.d.ts.map +1 -1
- package/dist/engine/invocationCompletion.js +108 -4
- package/dist/engine/invocationCompletion.js.map +1 -1
- package/dist/engine/node.d.ts +72 -6
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +152 -23
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/nodeDeliver.d.ts.map +1 -1
- package/dist/engine/nodeDeliver.js +5 -0
- package/dist/engine/nodeDeliver.js.map +1 -1
- package/dist/engine/observerToken.js +1 -1
- package/dist/engine/observerToken.js.map +1 -1
- package/dist/engine/retention.d.ts +7 -3
- package/dist/engine/retention.d.ts.map +1 -1
- package/dist/engine/retention.js +6 -2
- package/dist/engine/retention.js.map +1 -1
- package/dist/entrypoints/node.d.ts +3 -1
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +1 -0
- package/dist/entrypoints/node.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/node-invocations.d.ts +1 -1
- package/dist/node-invocations.d.ts.map +1 -1
- package/dist/node-invocations.js +1 -1
- package/dist/node-invocations.js.map +1 -1
- package/dist/ports/realtime.d.ts +22 -1
- package/dist/ports/realtime.d.ts.map +1 -1
- package/dist/ports/realtime.js.map +1 -1
- package/dist/routes/action.js +11 -5
- package/dist/routes/action.js.map +1 -1
- package/dist/routes/deliveryRouting.d.ts +20 -1
- package/dist/routes/deliveryRouting.d.ts.map +1 -1
- package/dist/routes/deliveryRouting.js +114 -17
- package/dist/routes/deliveryRouting.js.map +1 -1
- package/dist/routes/inboundWebhook.d.ts.map +1 -1
- package/dist/routes/inboundWebhook.js +21 -1
- package/dist/routes/inboundWebhook.js.map +1 -1
- package/dist/routes/node.js +3 -2
- package/dist/routes/node.js.map +1 -1
- package/dist/routes/presence.d.ts.map +1 -1
- package/dist/routes/presence.js +15 -4
- package/dist/routes/presence.js.map +1 -1
- package/package.json +3 -3
|
@@ -9,5 +9,48 @@ type CompletionResult = {
|
|
|
9
9
|
error: string | null;
|
|
10
10
|
};
|
|
11
11
|
export declare function emitInvocationCompletionEffects(deps: InvocationCompletionDeps, workspaceId: string, result: CompletionResult): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Extract the spawn invocation id an agent was registered under, if any. The
|
|
14
|
+
* `metadata.fleet.invocation_id` correlation is written by `registerAgentViaNode`
|
|
15
|
+
* on every via-node agent.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fleetInvocationId(metadata: unknown): string | null;
|
|
18
|
+
/** Distinguishes the three server-observable sources of an agent exit. */
|
|
19
|
+
export type AgentExitedReason = 'deregistered' | 'missing_from_inventory' | 'released';
|
|
20
|
+
export interface AgentExitedInput {
|
|
21
|
+
agentId: string;
|
|
22
|
+
agentName: string;
|
|
23
|
+
/** The node the agent exited from (authoritative), or null when unknown. */
|
|
24
|
+
nodeId: string | null;
|
|
25
|
+
/** The spawn invocation the agent was registered under, if correlated. */
|
|
26
|
+
invocationId: string | null;
|
|
27
|
+
reason: AgentExitedReason;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fan out a durable `agent.exited` event across the same three channels as
|
|
31
|
+
* invocation completion: (1) the spawn caller's mailbox (when the exit
|
|
32
|
+
* correlates to a spawn invocation with a live caller), (2) the durable
|
|
33
|
+
* workspace event log + live observer stream, and (3) the webhook outbox.
|
|
34
|
+
*
|
|
35
|
+
* Best-effort by contract — every channel is isolated so the underlying agent
|
|
36
|
+
* state transition (deregister / inventory reconcile / release) never fails
|
|
37
|
+
* because an emission did.
|
|
38
|
+
*/
|
|
39
|
+
export declare function emitAgentExitedEffects(deps: InvocationCompletionDeps, workspaceId: string, input: AgentExitedInput): Promise<void>;
|
|
40
|
+
/** Reason a node flipped offline, when cheaply known at the transition point. */
|
|
41
|
+
export type NodeOfflineReason = 'liveness_timeout' | 'disconnected' | 'deregistered';
|
|
42
|
+
export interface NodeStatusInput {
|
|
43
|
+
status: 'online' | 'offline';
|
|
44
|
+
nodeId: string;
|
|
45
|
+
nodeName: string | null;
|
|
46
|
+
/** Only meaningful for `offline`; omitted for `online`. */
|
|
47
|
+
reason?: NodeOfflineReason;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fan out a durable `node.status.online` / `node.status.offline` event. Node
|
|
51
|
+
* death has no single caller mailbox, so only the durable workspace log + live
|
|
52
|
+
* stream and the webhook outbox apply. Best-effort by contract.
|
|
53
|
+
*/
|
|
54
|
+
export declare function emitNodeStatusEffects(deps: Pick<InvocationCompletionDeps, 'db' | 'realtime' | 'webhookQueue'>, workspaceId: string, input: NodeStatusInput): Promise<void>;
|
|
12
55
|
export {};
|
|
13
56
|
//# sourceMappingURL=invocationCompletion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocationCompletion.d.ts","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invocationCompletion.d.ts","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,GAAG,QAAQ,CAAC,CAAC;AAE3H,KAAK,gBAAgB,GAAG;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAWF,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,wBAAwB,EAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAyCf;AAqCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGlE;AAeD,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,wBAAwB,GAAG,UAAU,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,wBAAwB,EAC9B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAc,CAAC;AAErF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,GAAG,UAAU,GAAG,cAAc,CAAC,EACxE,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { and, eq } from 'drizzle-orm';
|
|
2
|
+
import { z } from 'zod';
|
|
1
3
|
import { transformForClient } from './wsTransform.js';
|
|
2
4
|
import { enqueueEvent } from './eventQueue.js';
|
|
5
|
+
import { actionInvocations } from '../db/schema.js';
|
|
3
6
|
import { sendNodeDeliveriesToAgents } from './nodeDeliver.js';
|
|
4
7
|
import { appendAndPublishWorkspaceEvent } from './workspaceEvents.js';
|
|
5
8
|
function buildEvent(type, workspaceId, data) {
|
|
@@ -40,22 +43,123 @@ export async function emitInvocationCompletionEffects(deps, workspaceId, result)
|
|
|
40
43
|
// Through the durable log so observers can backfill action results too.
|
|
41
44
|
fanoutTasks.push(appendAndPublishWorkspaceEvent({ db: deps.db, realtime: deps.realtime }, workspaceId, { type: eventType, payload }));
|
|
42
45
|
await Promise.allSettled(fanoutTasks);
|
|
46
|
+
await enqueueAndSendWebhook(deps, workspaceId, eventType, result);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Push one event through the durable outbox + external webhook queue. Both steps
|
|
50
|
+
* are best-effort — a caller's state transition must never fail because the
|
|
51
|
+
* outbox insert or queue send did.
|
|
52
|
+
*/
|
|
53
|
+
async function enqueueAndSendWebhook(deps, workspaceId, eventType, data) {
|
|
43
54
|
let outboxId;
|
|
44
55
|
try {
|
|
45
|
-
outboxId = await enqueueEvent(deps.db, workspaceId, eventType,
|
|
56
|
+
outboxId = await enqueueEvent(deps.db, workspaceId, eventType, data);
|
|
46
57
|
}
|
|
47
58
|
catch {
|
|
48
59
|
// Best-effort: if the durable outbox row can't be inserted, still try the queue send.
|
|
49
60
|
}
|
|
50
61
|
try {
|
|
51
|
-
await deps.webhookQueue.send(outboxId ? { type: eventType, workspaceId, data
|
|
62
|
+
await deps.webhookQueue.send(outboxId ? { type: eventType, workspaceId, data, outboxId } : {
|
|
52
63
|
type: eventType,
|
|
53
64
|
workspaceId,
|
|
54
|
-
data
|
|
65
|
+
data,
|
|
55
66
|
});
|
|
56
67
|
}
|
|
57
68
|
catch {
|
|
58
|
-
// Best-effort side effect;
|
|
69
|
+
// Best-effort side effect; the state transition must not fail because webhook delivery did.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Shape of the `metadata.fleet.invocation_id` spawn correlation. Unknown keys
|
|
73
|
+
* are stripped by default, so extra metadata fields are tolerated. */
|
|
74
|
+
const fleetInvocationSchema = z.object({
|
|
75
|
+
fleet: z.object({ invocation_id: z.string() }),
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* Extract the spawn invocation id an agent was registered under, if any. The
|
|
79
|
+
* `metadata.fleet.invocation_id` correlation is written by `registerAgentViaNode`
|
|
80
|
+
* on every via-node agent.
|
|
81
|
+
*/
|
|
82
|
+
export function fleetInvocationId(metadata) {
|
|
83
|
+
const parsed = fleetInvocationSchema.safeParse(metadata);
|
|
84
|
+
return parsed.success ? parsed.data.fleet.invocation_id : null;
|
|
85
|
+
}
|
|
86
|
+
/** Resolve the caller mailbox of a spawn invocation; best-effort (null on any error). */
|
|
87
|
+
async function lookupSpawnCaller(db, workspaceId, invocationId) {
|
|
88
|
+
try {
|
|
89
|
+
const [row] = await db
|
|
90
|
+
.select({ callerId: actionInvocations.callerId })
|
|
91
|
+
.from(actionInvocations)
|
|
92
|
+
.where(and(eq(actionInvocations.workspaceId, workspaceId), eq(actionInvocations.id, invocationId)));
|
|
93
|
+
return row?.callerId ?? null;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Fan out a durable `agent.exited` event across the same three channels as
|
|
101
|
+
* invocation completion: (1) the spawn caller's mailbox (when the exit
|
|
102
|
+
* correlates to a spawn invocation with a live caller), (2) the durable
|
|
103
|
+
* workspace event log + live observer stream, and (3) the webhook outbox.
|
|
104
|
+
*
|
|
105
|
+
* Best-effort by contract — every channel is isolated so the underlying agent
|
|
106
|
+
* state transition (deregister / inventory reconcile / release) never fails
|
|
107
|
+
* because an emission did.
|
|
108
|
+
*/
|
|
109
|
+
export async function emitAgentExitedEffects(deps, workspaceId, input) {
|
|
110
|
+
const eventType = 'agent.exited';
|
|
111
|
+
const eventData = {
|
|
112
|
+
agent_id: input.agentId,
|
|
113
|
+
agent_name: input.agentName,
|
|
114
|
+
node_id: input.nodeId,
|
|
115
|
+
invocation_id: input.invocationId,
|
|
116
|
+
reason: input.reason,
|
|
117
|
+
};
|
|
118
|
+
const event = buildEvent(eventType, workspaceId, eventData);
|
|
119
|
+
const payload = transformForClient(event);
|
|
120
|
+
const fanoutTasks = [];
|
|
121
|
+
// Notify the spawn caller's mailbox so a spawner learns its agent exited. The
|
|
122
|
+
// stable eventKey dedupes redundant emissions of the same logical exit.
|
|
123
|
+
const callerId = input.invocationId ? await lookupSpawnCaller(deps.db, workspaceId, input.invocationId) : null;
|
|
124
|
+
if (callerId) {
|
|
125
|
+
fanoutTasks.push(sendNodeDeliveriesToAgents({
|
|
126
|
+
db: deps.db,
|
|
127
|
+
nodeConnections: deps.nodeConnections,
|
|
128
|
+
workspaceId,
|
|
129
|
+
environment: deps.config?.environment,
|
|
130
|
+
httpPushProxy: deps.config?.httpPushProxy,
|
|
131
|
+
}, {
|
|
132
|
+
agentIds: [callerId],
|
|
133
|
+
event: eventType,
|
|
134
|
+
// Omit messageId so delivery falls back to this unique eventKey (agent +
|
|
135
|
+
// invocation + reason). A messageId keyed only on agentId would repeat
|
|
136
|
+
// across an agent's lifecycle sessions and a downstream dedup on it could
|
|
137
|
+
// drop later exit notifications.
|
|
138
|
+
eventKey: `${input.agentId}_${input.invocationId ?? 'none'}_${input.reason}`,
|
|
139
|
+
data: eventData,
|
|
140
|
+
}));
|
|
59
141
|
}
|
|
142
|
+
fanoutTasks.push(appendAndPublishWorkspaceEvent({ db: deps.db, realtime: deps.realtime }, workspaceId, { type: eventType, payload }));
|
|
143
|
+
await Promise.allSettled(fanoutTasks);
|
|
144
|
+
await enqueueAndSendWebhook(deps, workspaceId, eventType, eventData);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Fan out a durable `node.status.online` / `node.status.offline` event. Node
|
|
148
|
+
* death has no single caller mailbox, so only the durable workspace log + live
|
|
149
|
+
* stream and the webhook outbox apply. Best-effort by contract.
|
|
150
|
+
*/
|
|
151
|
+
export async function emitNodeStatusEffects(deps, workspaceId, input) {
|
|
152
|
+
const eventType = input.status === 'online' ? 'node.status.online' : 'node.status.offline';
|
|
153
|
+
const eventData = {
|
|
154
|
+
node_id: input.nodeId,
|
|
155
|
+
node_name: input.nodeName,
|
|
156
|
+
...(input.status === 'offline' && input.reason ? { reason: input.reason } : {}),
|
|
157
|
+
};
|
|
158
|
+
const event = buildEvent(eventType, workspaceId, eventData);
|
|
159
|
+
const payload = transformForClient(event);
|
|
160
|
+
await Promise.allSettled([
|
|
161
|
+
appendAndPublishWorkspaceEvent({ db: deps.db, realtime: deps.realtime }, workspaceId, { type: eventType, payload }),
|
|
162
|
+
]);
|
|
163
|
+
await enqueueAndSendWebhook(deps, workspaceId, eventType, eventData);
|
|
60
164
|
}
|
|
61
165
|
//# sourceMappingURL=invocationCompletion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocationCompletion.js","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"invocationCompletion.js","sourceRoot":"","sources":["../../src/engine/invocationCompletion.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/node.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { getDb } from '../db/index.js';
|
|
|
3
3
|
import { agents, nodes } from '../db/schema.js';
|
|
4
4
|
import type { EngineDb } from '../ports/database.js';
|
|
5
5
|
import { type NodeConnectionRegistry } from '../ports/realtime.js';
|
|
6
|
-
import type { InvocationCompletionDeps } from './invocationCompletion.js';
|
|
6
|
+
import type { InvocationCompletionDeps, NodeOfflineReason } from './invocationCompletion.js';
|
|
7
7
|
type Db = ReturnType<typeof getDb>;
|
|
8
8
|
type NodeRow = typeof nodes.$inferSelect;
|
|
9
9
|
type AgentRow = typeof agents.$inferSelect;
|
|
@@ -148,6 +148,69 @@ export declare function getNodeByName(db: Db, workspaceId: string, name: string)
|
|
|
148
148
|
lastHeartbeatAt: Date | null;
|
|
149
149
|
createdAt: Date;
|
|
150
150
|
}>;
|
|
151
|
+
export declare function getNodeById(db: Db, workspaceId: string, nodeId: string): Promise<{
|
|
152
|
+
id: string;
|
|
153
|
+
workspaceId: string;
|
|
154
|
+
name: string;
|
|
155
|
+
tokenHash: string;
|
|
156
|
+
machineId: string | null;
|
|
157
|
+
kind: string;
|
|
158
|
+
role: string;
|
|
159
|
+
deliveryAdapter: string;
|
|
160
|
+
deliveryConfig: Record<string, unknown> | null;
|
|
161
|
+
capabilities: {
|
|
162
|
+
name: string;
|
|
163
|
+
kind?: string | undefined;
|
|
164
|
+
global?: boolean | undefined;
|
|
165
|
+
queue?: boolean | undefined;
|
|
166
|
+
metadata?: Record<string, import("@relaycast/types").FleetWireJsonValue> | undefined;
|
|
167
|
+
}[];
|
|
168
|
+
maxAgents: number;
|
|
169
|
+
activeAgents: number;
|
|
170
|
+
reservedAgents: number;
|
|
171
|
+
tags: string[];
|
|
172
|
+
version: string;
|
|
173
|
+
status: string;
|
|
174
|
+
handlersLive: boolean;
|
|
175
|
+
load: number;
|
|
176
|
+
lastHeartbeatAt: Date | null;
|
|
177
|
+
createdAt: Date;
|
|
178
|
+
}>;
|
|
179
|
+
/**
|
|
180
|
+
* Resolve the node an enroll (POST /v1/nodes) targets: by node_id when
|
|
181
|
+
* supplied, by name otherwise.
|
|
182
|
+
*/
|
|
183
|
+
export declare function resolveNodeForEnroll(db: Db, workspaceId: string, data: {
|
|
184
|
+
node_id?: string;
|
|
185
|
+
name: string;
|
|
186
|
+
}): Promise<{
|
|
187
|
+
id: string;
|
|
188
|
+
workspaceId: string;
|
|
189
|
+
name: string;
|
|
190
|
+
tokenHash: string;
|
|
191
|
+
machineId: string | null;
|
|
192
|
+
kind: string;
|
|
193
|
+
role: string;
|
|
194
|
+
deliveryAdapter: string;
|
|
195
|
+
deliveryConfig: Record<string, unknown> | null;
|
|
196
|
+
capabilities: {
|
|
197
|
+
name: string;
|
|
198
|
+
kind?: string | undefined;
|
|
199
|
+
global?: boolean | undefined;
|
|
200
|
+
queue?: boolean | undefined;
|
|
201
|
+
metadata?: Record<string, import("@relaycast/types").FleetWireJsonValue> | undefined;
|
|
202
|
+
}[];
|
|
203
|
+
maxAgents: number;
|
|
204
|
+
activeAgents: number;
|
|
205
|
+
reservedAgents: number;
|
|
206
|
+
tags: string[];
|
|
207
|
+
version: string;
|
|
208
|
+
status: string;
|
|
209
|
+
handlersLive: boolean;
|
|
210
|
+
load: number;
|
|
211
|
+
lastHeartbeatAt: Date | null;
|
|
212
|
+
createdAt: Date;
|
|
213
|
+
}>;
|
|
151
214
|
export interface RegisterNodeResult {
|
|
152
215
|
node: ReturnType<typeof publicNode>;
|
|
153
216
|
acceptance: FleetCapabilityAcceptance[];
|
|
@@ -179,20 +242,23 @@ export declare function heartbeatNode(db: Db, workspaceId: string, nodeId: strin
|
|
|
179
242
|
last_heartbeat_at: string | null;
|
|
180
243
|
created_at: string;
|
|
181
244
|
} | null>;
|
|
182
|
-
export declare function markNodeOffline(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string
|
|
245
|
+
export declare function markNodeOffline(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, effects?: {
|
|
246
|
+
deps?: InvocationCompletionDeps;
|
|
247
|
+
reason?: NodeOfflineReason;
|
|
248
|
+
}): Promise<void>;
|
|
183
249
|
/**
|
|
184
250
|
* A provider's control connection dropped. Its capability set persists (marked
|
|
185
251
|
* offline) so the node still shows the manifest; agents it hosted go offline.
|
|
186
252
|
* When it was the node's last connection the whole node goes offline.
|
|
187
253
|
*/
|
|
188
|
-
export declare function handleProviderDisconnect(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, providerName: string, hasRemainingConnections: boolean): Promise<void>;
|
|
254
|
+
export declare function handleProviderDisconnect(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, providerName: string, hasRemainingConnections: boolean, deps?: InvocationCompletionDeps): Promise<void>;
|
|
189
255
|
/**
|
|
190
256
|
* Provider-scoped deregister: removes the provider's attachment, persisted
|
|
191
257
|
* capability set, and materialized actions. When it was the node's last
|
|
192
258
|
* provider the node goes fully offline.
|
|
193
259
|
*/
|
|
194
|
-
export declare function deregisterProvider(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, providerName: string): Promise<void>;
|
|
195
|
-
export declare function sweepOfflineNodes(db: Db, registry: NodeConnectionRegistry): Promise<number>;
|
|
260
|
+
export declare function deregisterProvider(db: Db, registry: NodeConnectionRegistry, workspaceId: string, nodeId: string, providerName: string, deps?: InvocationCompletionDeps): Promise<void>;
|
|
261
|
+
export declare function sweepOfflineNodes(db: Db, registry: NodeConnectionRegistry, deps?: InvocationCompletionDeps): Promise<number>;
|
|
196
262
|
export declare function ensureDirectNodeForAgent(db: Db, workspaceId: string, agent: Pick<AgentRow, 'id' | 'name' | 'locationNodeId'>, opts?: {
|
|
197
263
|
force?: boolean;
|
|
198
264
|
online?: boolean;
|
|
@@ -261,7 +327,7 @@ export declare function registerAgentViaNode(db: Db, workspaceId: string, nodeId
|
|
|
261
327
|
export declare function deregisterAgentViaNode(db: Db, workspaceId: string, nodeId: string, message: {
|
|
262
328
|
agent_id?: string;
|
|
263
329
|
name?: string;
|
|
264
|
-
}): Promise<{
|
|
330
|
+
}, deps?: InvocationCompletionDeps): Promise<{
|
|
265
331
|
id: string;
|
|
266
332
|
name: string;
|
|
267
333
|
createdAt: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EAEzB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAqB,MAAM,EAA8D,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAI/H,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAgC,KAAK,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAqBjG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"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"}
|