@relaycast/engine 3.1.1 → 4.1.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.
Files changed (166) hide show
  1. package/dist/adapters/node/event-queue.d.ts +10 -0
  2. package/dist/adapters/node/event-queue.d.ts.map +1 -1
  3. package/dist/adapters/node/event-queue.js +17 -0
  4. package/dist/adapters/node/event-queue.js.map +1 -1
  5. package/dist/adapters/node/index.d.ts.map +1 -1
  6. package/dist/adapters/node/index.js +10 -0
  7. package/dist/adapters/node/index.js.map +1 -1
  8. package/dist/adapters/node/realtime.d.ts +24 -2
  9. package/dist/adapters/node/realtime.d.ts.map +1 -1
  10. package/dist/adapters/node/realtime.js +178 -1
  11. package/dist/adapters/node/realtime.js.map +1 -1
  12. package/dist/bin/serve.js +18 -1
  13. package/dist/bin/serve.js.map +1 -1
  14. package/dist/db/migrations/0016_fleet_nodes.sql +189 -0
  15. package/dist/db/migrations/0017_spawn_reservation_and_retry_state.sql +5 -0
  16. package/dist/db/migrations/0018_spawn_reserved_at.sql +2 -0
  17. package/dist/db/migrations/0019_fleet_mailbox.sql +71 -0
  18. package/dist/db/migrations/0020_workspace_retention.sql +3 -0
  19. package/dist/db/schema.d.ts +1771 -911
  20. package/dist/db/schema.d.ts.map +1 -1
  21. package/dist/db/schema.js +77 -7
  22. package/dist/db/schema.js.map +1 -1
  23. package/dist/engine/action.d.ts +84 -10
  24. package/dist/engine/action.d.ts.map +1 -1
  25. package/dist/engine/action.js +523 -85
  26. package/dist/engine/action.js.map +1 -1
  27. package/dist/engine/agent.js +2 -2
  28. package/dist/engine/agent.js.map +1 -1
  29. package/dist/engine/delivery.d.ts +41 -6
  30. package/dist/engine/delivery.d.ts.map +1 -1
  31. package/dist/engine/delivery.js +316 -25
  32. package/dist/engine/delivery.js.map +1 -1
  33. package/dist/engine/deliveryWire.d.ts +34 -0
  34. package/dist/engine/deliveryWire.d.ts.map +1 -0
  35. package/dist/engine/deliveryWire.js +70 -0
  36. package/dist/engine/deliveryWire.js.map +1 -0
  37. package/dist/engine/deliveryWrites.d.ts +47 -0
  38. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  39. package/dist/engine/deliveryWrites.js +155 -5
  40. package/dist/engine/deliveryWrites.js.map +1 -1
  41. package/dist/engine/dm.d.ts +4 -4
  42. package/dist/engine/dm.d.ts.map +1 -1
  43. package/dist/engine/dm.js +17 -7
  44. package/dist/engine/dm.js.map +1 -1
  45. package/dist/engine/eventQueue.d.ts.map +1 -1
  46. package/dist/engine/eventQueue.js +5 -0
  47. package/dist/engine/eventQueue.js.map +1 -1
  48. package/dist/engine/eventSubscription.d.ts +6 -0
  49. package/dist/engine/eventSubscription.d.ts.map +1 -1
  50. package/dist/engine/eventSubscription.js +13 -0
  51. package/dist/engine/eventSubscription.js.map +1 -1
  52. package/dist/engine/groupDm.d.ts +4 -0
  53. package/dist/engine/groupDm.d.ts.map +1 -1
  54. package/dist/engine/groupDm.js +16 -4
  55. package/dist/engine/groupDm.js.map +1 -1
  56. package/dist/engine/invocationCompletion.d.ts +13 -0
  57. package/dist/engine/invocationCompletion.d.ts.map +1 -0
  58. package/dist/engine/invocationCompletion.js +65 -0
  59. package/dist/engine/invocationCompletion.js.map +1 -0
  60. package/dist/engine/mailboxConfig.d.ts +9 -0
  61. package/dist/engine/mailboxConfig.d.ts.map +1 -0
  62. package/dist/engine/mailboxConfig.js +16 -0
  63. package/dist/engine/mailboxConfig.js.map +1 -0
  64. package/dist/engine/message.d.ts +4 -0
  65. package/dist/engine/message.d.ts.map +1 -1
  66. package/dist/engine/message.js +16 -4
  67. package/dist/engine/message.js.map +1 -1
  68. package/dist/engine/node.d.ts +201 -0
  69. package/dist/engine/node.d.ts.map +1 -0
  70. package/dist/engine/node.js +557 -0
  71. package/dist/engine/node.js.map +1 -0
  72. package/dist/engine/placement.d.ts +26 -0
  73. package/dist/engine/placement.d.ts.map +1 -0
  74. package/dist/engine/placement.js +242 -0
  75. package/dist/engine/placement.js.map +1 -0
  76. package/dist/engine/receipt.d.ts.map +1 -1
  77. package/dist/engine/receipt.js +5 -6
  78. package/dist/engine/receipt.js.map +1 -1
  79. package/dist/engine/retention.d.ts +65 -0
  80. package/dist/engine/retention.d.ts.map +1 -0
  81. package/dist/engine/retention.js +173 -0
  82. package/dist/engine/retention.js.map +1 -0
  83. package/dist/engine/snowflake.d.ts +11 -0
  84. package/dist/engine/snowflake.d.ts.map +1 -1
  85. package/dist/engine/snowflake.js +14 -0
  86. package/dist/engine/snowflake.js.map +1 -1
  87. package/dist/engine/thread.d.ts +4 -0
  88. package/dist/engine/thread.d.ts.map +1 -1
  89. package/dist/engine/thread.js +16 -4
  90. package/dist/engine/thread.js.map +1 -1
  91. package/dist/engine/trigger.d.ts +79 -0
  92. package/dist/engine/trigger.d.ts.map +1 -0
  93. package/dist/engine/trigger.js +151 -0
  94. package/dist/engine/trigger.js.map +1 -0
  95. package/dist/engine.d.ts.map +1 -1
  96. package/dist/engine.js +61 -2
  97. package/dist/engine.js.map +1 -1
  98. package/dist/entrypoints/node.d.ts.map +1 -1
  99. package/dist/entrypoints/node.js +36 -2
  100. package/dist/entrypoints/node.js.map +1 -1
  101. package/dist/env.d.ts +6 -0
  102. package/dist/env.d.ts.map +1 -1
  103. package/dist/index.d.ts +4 -1
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +6 -1
  106. package/dist/index.js.map +1 -1
  107. package/dist/lib/fleetNodes.d.ts +9 -0
  108. package/dist/lib/fleetNodes.d.ts.map +1 -0
  109. package/dist/lib/fleetNodes.js +66 -0
  110. package/dist/lib/fleetNodes.js.map +1 -0
  111. package/dist/lib/origin.d.ts.map +1 -1
  112. package/dist/lib/origin.js +0 -5
  113. package/dist/lib/origin.js.map +1 -1
  114. package/dist/lib/serverTelemetry.d.ts.map +1 -1
  115. package/dist/lib/serverTelemetry.js +0 -1
  116. package/dist/lib/serverTelemetry.js.map +1 -1
  117. package/dist/middleware/fleetNodes.d.ts +10 -0
  118. package/dist/middleware/fleetNodes.d.ts.map +1 -0
  119. package/dist/middleware/fleetNodes.js +18 -0
  120. package/dist/middleware/fleetNodes.js.map +1 -0
  121. package/dist/ports/index.d.ts +24 -2
  122. package/dist/ports/index.d.ts.map +1 -1
  123. package/dist/ports/realtime.d.ts +34 -2
  124. package/dist/ports/realtime.d.ts.map +1 -1
  125. package/dist/ports/realtime.js +1 -1
  126. package/dist/routes/action.d.ts.map +1 -1
  127. package/dist/routes/action.js +21 -21
  128. package/dist/routes/action.js.map +1 -1
  129. package/dist/routes/delivery.d.ts.map +1 -1
  130. package/dist/routes/delivery.js +7 -2
  131. package/dist/routes/delivery.js.map +1 -1
  132. package/dist/routes/deliveryRouting.d.ts +10 -0
  133. package/dist/routes/deliveryRouting.d.ts.map +1 -0
  134. package/dist/routes/deliveryRouting.js +91 -0
  135. package/dist/routes/deliveryRouting.js.map +1 -0
  136. package/dist/routes/dm.d.ts.map +1 -1
  137. package/dist/routes/dm.js +14 -13
  138. package/dist/routes/dm.js.map +1 -1
  139. package/dist/routes/groupDm.d.ts.map +1 -1
  140. package/dist/routes/groupDm.js +14 -15
  141. package/dist/routes/groupDm.js.map +1 -1
  142. package/dist/routes/inbox.d.ts.map +1 -1
  143. package/dist/routes/inbox.js +7 -0
  144. package/dist/routes/inbox.js.map +1 -1
  145. package/dist/routes/message.d.ts.map +1 -1
  146. package/dist/routes/message.js +45 -23
  147. package/dist/routes/message.js.map +1 -1
  148. package/dist/routes/node.d.ts +4 -0
  149. package/dist/routes/node.d.ts.map +1 -0
  150. package/dist/routes/node.js +57 -0
  151. package/dist/routes/node.js.map +1 -0
  152. package/dist/routes/thread.d.ts.map +1 -1
  153. package/dist/routes/thread.js +15 -16
  154. package/dist/routes/thread.js.map +1 -1
  155. package/dist/routes/trigger.d.ts +4 -0
  156. package/dist/routes/trigger.d.ts.map +1 -0
  157. package/dist/routes/trigger.js +83 -0
  158. package/dist/routes/trigger.js.map +1 -0
  159. package/dist/routes/webhookOutbox.d.ts +13 -6
  160. package/dist/routes/webhookOutbox.d.ts.map +1 -1
  161. package/dist/routes/webhookOutbox.js +29 -6
  162. package/dist/routes/webhookOutbox.js.map +1 -1
  163. package/dist/routes/workspace.d.ts.map +1 -1
  164. package/dist/routes/workspace.js +90 -0
  165. package/dist/routes/workspace.js.map +1 -1
  166. 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,2 @@
1
+ -- Track whether a spawn invocation already holds a reserved node slot.
2
+ ALTER TABLE action_invocations ADD COLUMN spawn_reserved_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);
@@ -0,0 +1,3 @@
1
+ -- Per-workspace retention settings (JSON: message_ttl_days, delivery_ttl_days,
2
+ -- message_log_ttl_days). NULL means the workspace inherits deployment defaults.
3
+ ALTER TABLE workspaces ADD COLUMN retention text;