@relaycast/engine 3.1.1 → 4.0.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/event-queue.d.ts +10 -0
- package/dist/adapters/node/event-queue.d.ts.map +1 -1
- package/dist/adapters/node/event-queue.js +17 -0
- package/dist/adapters/node/event-queue.js.map +1 -1
- package/dist/adapters/node/index.d.ts.map +1 -1
- package/dist/adapters/node/index.js +10 -0
- package/dist/adapters/node/index.js.map +1 -1
- package/dist/adapters/node/realtime.d.ts +24 -2
- package/dist/adapters/node/realtime.d.ts.map +1 -1
- package/dist/adapters/node/realtime.js +178 -1
- package/dist/adapters/node/realtime.js.map +1 -1
- package/dist/bin/serve.js +18 -1
- package/dist/bin/serve.js.map +1 -1
- package/dist/db/migrations/0016_fleet_nodes.sql +189 -0
- package/dist/db/migrations/0017_spawn_reservation_and_retry_state.sql +5 -0
- package/dist/db/migrations/0018_spawn_reserved_at.sql +2 -0
- package/dist/db/migrations/0019_fleet_mailbox.sql +71 -0
- package/dist/db/migrations/0020_workspace_retention.sql +3 -0
- package/dist/db/schema.d.ts +1771 -911
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +77 -7
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/action.d.ts +84 -10
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +523 -85
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/agent.js +2 -2
- package/dist/engine/agent.js.map +1 -1
- package/dist/engine/delivery.d.ts +41 -6
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +316 -25
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/deliveryWire.d.ts +34 -0
- package/dist/engine/deliveryWire.d.ts.map +1 -0
- package/dist/engine/deliveryWire.js +70 -0
- package/dist/engine/deliveryWire.js.map +1 -0
- package/dist/engine/deliveryWrites.d.ts +47 -0
- package/dist/engine/deliveryWrites.d.ts.map +1 -1
- package/dist/engine/deliveryWrites.js +155 -5
- package/dist/engine/deliveryWrites.js.map +1 -1
- package/dist/engine/dm.d.ts +4 -4
- package/dist/engine/dm.d.ts.map +1 -1
- package/dist/engine/dm.js +17 -7
- package/dist/engine/dm.js.map +1 -1
- package/dist/engine/eventQueue.d.ts.map +1 -1
- package/dist/engine/eventQueue.js +5 -0
- package/dist/engine/eventQueue.js.map +1 -1
- package/dist/engine/eventSubscription.d.ts +6 -0
- package/dist/engine/eventSubscription.d.ts.map +1 -1
- package/dist/engine/eventSubscription.js +13 -0
- package/dist/engine/eventSubscription.js.map +1 -1
- package/dist/engine/groupDm.d.ts +4 -0
- package/dist/engine/groupDm.d.ts.map +1 -1
- package/dist/engine/groupDm.js +16 -4
- package/dist/engine/groupDm.js.map +1 -1
- package/dist/engine/invocationCompletion.d.ts +13 -0
- package/dist/engine/invocationCompletion.d.ts.map +1 -0
- package/dist/engine/invocationCompletion.js +65 -0
- package/dist/engine/invocationCompletion.js.map +1 -0
- package/dist/engine/mailboxConfig.d.ts +9 -0
- package/dist/engine/mailboxConfig.d.ts.map +1 -0
- package/dist/engine/mailboxConfig.js +16 -0
- package/dist/engine/mailboxConfig.js.map +1 -0
- package/dist/engine/message.d.ts +4 -0
- package/dist/engine/message.d.ts.map +1 -1
- package/dist/engine/message.js +16 -4
- package/dist/engine/message.js.map +1 -1
- package/dist/engine/node.d.ts +201 -0
- package/dist/engine/node.d.ts.map +1 -0
- package/dist/engine/node.js +533 -0
- package/dist/engine/node.js.map +1 -0
- package/dist/engine/placement.d.ts +26 -0
- package/dist/engine/placement.d.ts.map +1 -0
- package/dist/engine/placement.js +242 -0
- package/dist/engine/placement.js.map +1 -0
- package/dist/engine/receipt.d.ts.map +1 -1
- package/dist/engine/receipt.js +5 -6
- package/dist/engine/receipt.js.map +1 -1
- package/dist/engine/retention.d.ts +65 -0
- package/dist/engine/retention.d.ts.map +1 -0
- package/dist/engine/retention.js +173 -0
- package/dist/engine/retention.js.map +1 -0
- package/dist/engine/snowflake.d.ts +11 -0
- package/dist/engine/snowflake.d.ts.map +1 -1
- package/dist/engine/snowflake.js +14 -0
- package/dist/engine/snowflake.js.map +1 -1
- package/dist/engine/thread.d.ts +4 -0
- package/dist/engine/thread.d.ts.map +1 -1
- package/dist/engine/thread.js +16 -4
- package/dist/engine/thread.js.map +1 -1
- package/dist/engine/trigger.d.ts +79 -0
- package/dist/engine/trigger.d.ts.map +1 -0
- package/dist/engine/trigger.js +151 -0
- package/dist/engine/trigger.js.map +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +61 -2
- package/dist/engine.js.map +1 -1
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +36 -2
- package/dist/entrypoints/node.js.map +1 -1
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/fleetNodes.d.ts +9 -0
- package/dist/lib/fleetNodes.d.ts.map +1 -0
- package/dist/lib/fleetNodes.js +66 -0
- package/dist/lib/fleetNodes.js.map +1 -0
- package/dist/lib/origin.d.ts.map +1 -1
- package/dist/lib/origin.js +0 -5
- package/dist/lib/origin.js.map +1 -1
- package/dist/lib/serverTelemetry.d.ts.map +1 -1
- package/dist/lib/serverTelemetry.js +0 -1
- package/dist/lib/serverTelemetry.js.map +1 -1
- package/dist/middleware/fleetNodes.d.ts +10 -0
- package/dist/middleware/fleetNodes.d.ts.map +1 -0
- package/dist/middleware/fleetNodes.js +18 -0
- package/dist/middleware/fleetNodes.js.map +1 -0
- package/dist/ports/index.d.ts +24 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/realtime.d.ts +34 -2
- package/dist/ports/realtime.d.ts.map +1 -1
- package/dist/ports/realtime.js +1 -1
- package/dist/routes/action.d.ts.map +1 -1
- package/dist/routes/action.js +21 -21
- package/dist/routes/action.js.map +1 -1
- package/dist/routes/delivery.d.ts.map +1 -1
- package/dist/routes/delivery.js +7 -2
- package/dist/routes/delivery.js.map +1 -1
- package/dist/routes/deliveryRouting.d.ts +10 -0
- package/dist/routes/deliveryRouting.d.ts.map +1 -0
- package/dist/routes/deliveryRouting.js +91 -0
- package/dist/routes/deliveryRouting.js.map +1 -0
- package/dist/routes/dm.d.ts.map +1 -1
- package/dist/routes/dm.js +14 -13
- package/dist/routes/dm.js.map +1 -1
- package/dist/routes/groupDm.d.ts.map +1 -1
- package/dist/routes/groupDm.js +14 -15
- package/dist/routes/groupDm.js.map +1 -1
- package/dist/routes/inbox.d.ts.map +1 -1
- package/dist/routes/inbox.js +7 -0
- package/dist/routes/inbox.js.map +1 -1
- package/dist/routes/message.d.ts.map +1 -1
- package/dist/routes/message.js +45 -23
- package/dist/routes/message.js.map +1 -1
- package/dist/routes/node.d.ts +4 -0
- package/dist/routes/node.d.ts.map +1 -0
- package/dist/routes/node.js +57 -0
- package/dist/routes/node.js.map +1 -0
- package/dist/routes/thread.d.ts.map +1 -1
- package/dist/routes/thread.js +15 -16
- package/dist/routes/thread.js.map +1 -1
- package/dist/routes/trigger.d.ts +4 -0
- package/dist/routes/trigger.d.ts.map +1 -0
- package/dist/routes/trigger.js +83 -0
- package/dist/routes/trigger.js.map +1 -0
- package/dist/routes/webhookOutbox.d.ts +13 -6
- package/dist/routes/webhookOutbox.d.ts.map +1 -1
- package/dist/routes/webhookOutbox.js +29 -6
- package/dist/routes/webhookOutbox.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +90 -0
- package/dist/routes/workspace.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
-- Fleet Phase 1: node registry, node-native actions, agent locations, triggers.
|
|
2
|
+
|
|
3
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
4
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
5
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
6
|
+
name TEXT NOT NULL,
|
|
7
|
+
token_hash TEXT NOT NULL UNIQUE,
|
|
8
|
+
capabilities TEXT NOT NULL DEFAULT '[]',
|
|
9
|
+
max_agents INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
active_agents INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
12
|
+
version TEXT NOT NULL DEFAULT 'unknown',
|
|
13
|
+
status TEXT NOT NULL DEFAULT 'offline',
|
|
14
|
+
handlers_live INTEGER NOT NULL DEFAULT 0,
|
|
15
|
+
load REAL NOT NULL DEFAULT 0,
|
|
16
|
+
last_heartbeat_at INTEGER DEFAULT NULL,
|
|
17
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE UNIQUE INDEX IF NOT EXISTS nodes_workspace_name_unique
|
|
21
|
+
ON nodes(workspace_id, name);
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_workspace
|
|
24
|
+
ON nodes(workspace_id);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_token
|
|
27
|
+
ON nodes(token_hash);
|
|
28
|
+
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_status
|
|
30
|
+
ON nodes(workspace_id, status);
|
|
31
|
+
|
|
32
|
+
ALTER TABLE agents ADD COLUMN location_type TEXT NOT NULL DEFAULT 'self_connected';
|
|
33
|
+
ALTER TABLE agents ADD COLUMN location_node_id TEXT DEFAULT NULL REFERENCES nodes(id) ON DELETE SET NULL;
|
|
34
|
+
ALTER TABLE agents ADD COLUMN resumable INTEGER NOT NULL DEFAULT 0;
|
|
35
|
+
ALTER TABLE agents ADD COLUMN session_ref TEXT DEFAULT NULL;
|
|
36
|
+
ALTER TABLE agents ADD COLUMN origin_node_id TEXT DEFAULT NULL REFERENCES nodes(id) ON DELETE SET NULL;
|
|
37
|
+
|
|
38
|
+
ALTER TABLE actions RENAME TO actions_0016_old;
|
|
39
|
+
ALTER TABLE action_invocations RENAME TO action_invocations_0016_old;
|
|
40
|
+
|
|
41
|
+
DROP INDEX IF EXISTS actions_workspace_name_unique;
|
|
42
|
+
DROP INDEX IF EXISTS idx_actions_workspace;
|
|
43
|
+
DROP INDEX IF EXISTS idx_actions_handler;
|
|
44
|
+
DROP INDEX IF EXISTS idx_action_invocations_workspace;
|
|
45
|
+
DROP INDEX IF EXISTS idx_action_invocations_action;
|
|
46
|
+
DROP INDEX IF EXISTS idx_action_invocations_caller;
|
|
47
|
+
|
|
48
|
+
CREATE TABLE actions (
|
|
49
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
50
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
51
|
+
name TEXT NOT NULL,
|
|
52
|
+
description TEXT NOT NULL,
|
|
53
|
+
handler_agent_id TEXT REFERENCES agents(id) ON DELETE CASCADE,
|
|
54
|
+
handler_node_id TEXT REFERENCES nodes(id) ON DELETE CASCADE,
|
|
55
|
+
input_schema TEXT DEFAULT '{}',
|
|
56
|
+
output_schema TEXT DEFAULT '{}',
|
|
57
|
+
available_to TEXT DEFAULT NULL,
|
|
58
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
59
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
INSERT INTO actions (
|
|
63
|
+
id,
|
|
64
|
+
workspace_id,
|
|
65
|
+
name,
|
|
66
|
+
description,
|
|
67
|
+
handler_agent_id,
|
|
68
|
+
handler_node_id,
|
|
69
|
+
input_schema,
|
|
70
|
+
output_schema,
|
|
71
|
+
available_to,
|
|
72
|
+
is_active,
|
|
73
|
+
created_at
|
|
74
|
+
)
|
|
75
|
+
SELECT
|
|
76
|
+
id,
|
|
77
|
+
workspace_id,
|
|
78
|
+
name,
|
|
79
|
+
description,
|
|
80
|
+
handler_agent_id,
|
|
81
|
+
NULL,
|
|
82
|
+
input_schema,
|
|
83
|
+
output_schema,
|
|
84
|
+
available_to,
|
|
85
|
+
is_active,
|
|
86
|
+
created_at
|
|
87
|
+
FROM actions_0016_old;
|
|
88
|
+
|
|
89
|
+
CREATE UNIQUE INDEX actions_workspace_name_unique
|
|
90
|
+
ON actions(workspace_id, name);
|
|
91
|
+
|
|
92
|
+
CREATE INDEX idx_actions_workspace
|
|
93
|
+
ON actions(workspace_id);
|
|
94
|
+
|
|
95
|
+
CREATE INDEX idx_actions_handler
|
|
96
|
+
ON actions(handler_agent_id);
|
|
97
|
+
|
|
98
|
+
CREATE INDEX idx_actions_node_handler
|
|
99
|
+
ON actions(handler_node_id);
|
|
100
|
+
|
|
101
|
+
CREATE TABLE action_invocations (
|
|
102
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
103
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
104
|
+
action_id TEXT REFERENCES actions(id) ON DELETE SET NULL,
|
|
105
|
+
action_name TEXT NOT NULL,
|
|
106
|
+
caller_id TEXT REFERENCES agents(id) ON DELETE SET NULL,
|
|
107
|
+
caller_name TEXT,
|
|
108
|
+
input TEXT DEFAULT '{}',
|
|
109
|
+
output TEXT DEFAULT NULL,
|
|
110
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
111
|
+
error TEXT DEFAULT NULL,
|
|
112
|
+
duration_ms INTEGER DEFAULT NULL,
|
|
113
|
+
dispatched_node_id TEXT DEFAULT NULL REFERENCES nodes(id) ON DELETE SET NULL,
|
|
114
|
+
dispatched_at INTEGER DEFAULT NULL,
|
|
115
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
116
|
+
completed_at INTEGER DEFAULT NULL
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
INSERT INTO action_invocations (
|
|
120
|
+
id,
|
|
121
|
+
workspace_id,
|
|
122
|
+
action_id,
|
|
123
|
+
action_name,
|
|
124
|
+
caller_id,
|
|
125
|
+
caller_name,
|
|
126
|
+
input,
|
|
127
|
+
output,
|
|
128
|
+
status,
|
|
129
|
+
error,
|
|
130
|
+
duration_ms,
|
|
131
|
+
dispatched_node_id,
|
|
132
|
+
dispatched_at,
|
|
133
|
+
created_at,
|
|
134
|
+
completed_at
|
|
135
|
+
)
|
|
136
|
+
SELECT
|
|
137
|
+
id,
|
|
138
|
+
workspace_id,
|
|
139
|
+
action_id,
|
|
140
|
+
action_name,
|
|
141
|
+
caller_id,
|
|
142
|
+
caller_name,
|
|
143
|
+
input,
|
|
144
|
+
output,
|
|
145
|
+
CASE WHEN status = 'invoked' THEN 'pending' ELSE status END,
|
|
146
|
+
error,
|
|
147
|
+
duration_ms,
|
|
148
|
+
NULL,
|
|
149
|
+
NULL,
|
|
150
|
+
created_at,
|
|
151
|
+
completed_at
|
|
152
|
+
FROM action_invocations_0016_old;
|
|
153
|
+
|
|
154
|
+
CREATE INDEX idx_action_invocations_workspace
|
|
155
|
+
ON action_invocations(workspace_id, created_at);
|
|
156
|
+
|
|
157
|
+
CREATE INDEX idx_action_invocations_action
|
|
158
|
+
ON action_invocations(action_id, created_at);
|
|
159
|
+
|
|
160
|
+
CREATE INDEX idx_action_invocations_caller
|
|
161
|
+
ON action_invocations(caller_id, created_at);
|
|
162
|
+
|
|
163
|
+
CREATE INDEX idx_action_invocations_dispatched_node
|
|
164
|
+
ON action_invocations(dispatched_node_id, created_at);
|
|
165
|
+
|
|
166
|
+
DROP TABLE action_invocations_0016_old;
|
|
167
|
+
DROP TABLE actions_0016_old;
|
|
168
|
+
|
|
169
|
+
CREATE TABLE IF NOT EXISTS triggers (
|
|
170
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
171
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
172
|
+
channel TEXT DEFAULT NULL,
|
|
173
|
+
pattern TEXT DEFAULT NULL,
|
|
174
|
+
mention INTEGER DEFAULT NULL,
|
|
175
|
+
action_name TEXT NOT NULL,
|
|
176
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
177
|
+
last_triggered_at INTEGER DEFAULT NULL,
|
|
178
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
179
|
+
updated_at INTEGER DEFAULT NULL
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_workspace
|
|
183
|
+
ON triggers(workspace_id);
|
|
184
|
+
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_enabled
|
|
186
|
+
ON triggers(workspace_id, enabled);
|
|
187
|
+
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_triggers_action
|
|
189
|
+
ON triggers(workspace_id, action_name);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- Spawn reservation tracking and node retry state.
|
|
2
|
+
ALTER TABLE nodes ADD COLUMN reserved_agents INTEGER NOT NULL DEFAULT 0;
|
|
3
|
+
ALTER TABLE action_invocations ADD COLUMN attempted_node_ids TEXT NOT NULL DEFAULT '[]';
|
|
4
|
+
ALTER TABLE action_invocations ADD COLUMN dispatch_attempts INTEGER NOT NULL DEFAULT 0;
|
|
5
|
+
ALTER TABLE action_invocations ADD COLUMN retry_after_at INTEGER DEFAULT NULL;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
-- Fleet Phase 2: bounded durable mailbox state machine.
|
|
2
|
+
|
|
3
|
+
ALTER TABLE agents ADD COLUMN delivery_ack_seq INTEGER NOT NULL DEFAULT 0;
|
|
4
|
+
|
|
5
|
+
ALTER TABLE deliveries ADD COLUMN seq INTEGER NOT NULL DEFAULT 0;
|
|
6
|
+
ALTER TABLE deliveries ADD COLUMN location_type TEXT NOT NULL DEFAULT 'self_connected';
|
|
7
|
+
ALTER TABLE deliveries ADD COLUMN location_node_id TEXT DEFAULT NULL REFERENCES nodes(id) ON DELETE SET NULL;
|
|
8
|
+
ALTER TABLE deliveries ADD COLUMN expires_at INTEGER DEFAULT NULL;
|
|
9
|
+
ALTER TABLE deliveries ADD COLUMN delivered_at INTEGER DEFAULT NULL;
|
|
10
|
+
ALTER TABLE deliveries ADD COLUMN acked_at INTEGER DEFAULT NULL;
|
|
11
|
+
ALTER TABLE deliveries ADD COLUMN dead_lettered_at INTEGER DEFAULT NULL;
|
|
12
|
+
|
|
13
|
+
-- Existing public rows used accepted/deferred for "queued" and delivered for
|
|
14
|
+
-- "terminal success". Preserve that meaning while moving to queued/delivered/acked.
|
|
15
|
+
UPDATE deliveries SET status = 'queued' WHERE status IN ('pending', 'accepted', 'deferred');
|
|
16
|
+
UPDATE deliveries SET status = 'acked', acked_at = COALESCE(updated_at, created_at) WHERE status = 'delivered';
|
|
17
|
+
|
|
18
|
+
-- Populate location snapshots from the current agent roster for old rows.
|
|
19
|
+
UPDATE deliveries
|
|
20
|
+
SET
|
|
21
|
+
location_type = COALESCE((SELECT location_type FROM agents WHERE agents.id = deliveries.agent_id), 'self_connected'),
|
|
22
|
+
location_node_id = (SELECT location_node_id FROM agents WHERE agents.id = deliveries.agent_id);
|
|
23
|
+
|
|
24
|
+
-- Assign durable per-agent sequence numbers to existing rows before enforcing uniqueness.
|
|
25
|
+
WITH ranked AS (
|
|
26
|
+
SELECT
|
|
27
|
+
rowid AS rid,
|
|
28
|
+
ROW_NUMBER() OVER (
|
|
29
|
+
PARTITION BY workspace_id, agent_id
|
|
30
|
+
ORDER BY created_at, id
|
|
31
|
+
) AS rn
|
|
32
|
+
FROM deliveries
|
|
33
|
+
)
|
|
34
|
+
UPDATE deliveries
|
|
35
|
+
SET seq = (SELECT rn FROM ranked WHERE ranked.rid = deliveries.rowid);
|
|
36
|
+
|
|
37
|
+
-- Use the old deadline as the mailbox expiry when present; otherwise default
|
|
38
|
+
-- legacy queued rows to one hour after creation. Terminal rows do not expire.
|
|
39
|
+
UPDATE deliveries
|
|
40
|
+
SET expires_at = COALESCE(deadline, created_at + 3600)
|
|
41
|
+
WHERE status IN ('queued', 'delivered') AND expires_at IS NULL;
|
|
42
|
+
|
|
43
|
+
-- Seed the cumulative cursor from the contiguous acked prefix, not the max acked
|
|
44
|
+
-- seq: node replay sends rows with seq > delivery_ack_seq, so if an older row is
|
|
45
|
+
-- still queued/delivered below a newer acked row, MAX(acked seq) would skip it
|
|
46
|
+
-- forever. The contiguous prefix is (lowest still-active seq) - 1; when nothing
|
|
47
|
+
-- is active, every row is settled so the cursor can advance to the max seq.
|
|
48
|
+
UPDATE agents
|
|
49
|
+
SET delivery_ack_seq = COALESCE(
|
|
50
|
+
(
|
|
51
|
+
SELECT MIN(seq) - 1
|
|
52
|
+
FROM deliveries
|
|
53
|
+
WHERE deliveries.agent_id = agents.id
|
|
54
|
+
AND deliveries.status IN ('queued', 'delivered')
|
|
55
|
+
),
|
|
56
|
+
(
|
|
57
|
+
SELECT MAX(seq)
|
|
58
|
+
FROM deliveries
|
|
59
|
+
WHERE deliveries.agent_id = agents.id
|
|
60
|
+
),
|
|
61
|
+
0
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE UNIQUE INDEX IF NOT EXISTS deliveries_agent_seq_unique
|
|
65
|
+
ON deliveries(workspace_id, agent_id, seq);
|
|
66
|
+
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_deliveries_agent_status_seq
|
|
68
|
+
ON deliveries(workspace_id, agent_id, status, seq);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_deliveries_expires
|
|
71
|
+
ON deliveries(workspace_id, status, expires_at);
|