@nordbyte/nordrelay 0.5.2 → 0.6.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 (52) hide show
  1. package/.env.example +63 -11
  2. package/README.md +90 -19
  3. package/dist/access-control.js +1 -0
  4. package/dist/activity-events.js +44 -0
  5. package/dist/audit-log.js +40 -2
  6. package/dist/bot-rendering.js +10 -7
  7. package/dist/bot.js +458 -5
  8. package/dist/channel-actions.js +7 -2
  9. package/dist/channel-adapter.js +34 -7
  10. package/dist/channel-command-service.js +156 -0
  11. package/dist/channel-turn-service.js +237 -0
  12. package/dist/config-metadata.js +78 -13
  13. package/dist/config.js +77 -7
  14. package/dist/context-key.js +77 -5
  15. package/dist/discord-artifacts.js +165 -0
  16. package/dist/discord-bot.js +2014 -0
  17. package/dist/discord-channel-runtime.js +133 -0
  18. package/dist/discord-command-surface.js +119 -0
  19. package/dist/discord-rate-limit.js +141 -0
  20. package/dist/index.js +16 -5
  21. package/dist/job-store.js +127 -0
  22. package/dist/metrics.js +41 -0
  23. package/dist/relay-external-activity-monitor.js +47 -6
  24. package/dist/relay-runtime.js +986 -281
  25. package/dist/runtime-cache.js +57 -0
  26. package/dist/session-locks.js +10 -7
  27. package/dist/support-bundle.js +1 -0
  28. package/dist/telegram-access-commands.js +15 -2
  29. package/dist/telegram-access-middleware.js +16 -3
  30. package/dist/telegram-agent-commands.js +25 -0
  31. package/dist/telegram-artifact-commands.js +46 -0
  32. package/dist/telegram-diagnostics-command.js +5 -50
  33. package/dist/telegram-general-commands.js +2 -6
  34. package/dist/telegram-operational-commands.js +14 -6
  35. package/dist/telegram-queue-commands.js +74 -4
  36. package/dist/telegram-support-command.js +7 -0
  37. package/dist/telegram-update-commands.js +27 -0
  38. package/dist/user-management.js +208 -0
  39. package/dist/web-api-contract.js +9 -0
  40. package/dist/web-dashboard-access-routes.js +74 -1
  41. package/dist/web-dashboard-artifact-routes.js +3 -3
  42. package/dist/web-dashboard-assets.js +2 -0
  43. package/dist/web-dashboard-pages.js +97 -13
  44. package/dist/web-dashboard-runtime-routes.js +53 -8
  45. package/dist/web-dashboard-session-routes.js +27 -20
  46. package/dist/web-dashboard-ui.js +1 -0
  47. package/dist/web-dashboard.js +148 -6
  48. package/dist/web-state.js +33 -2
  49. package/dist/webui-assets/dashboard.css +75 -1
  50. package/dist/webui-assets/dashboard.js +358 -47
  51. package/package.json +3 -1
  52. package/plugins/nordrelay/scripts/nordrelay.mjs +210 -17
@@ -2,6 +2,10 @@ import {} from "./agent.js";
2
2
  import { getExternalSnapshotForSession } from "./agent-activity.js";
3
3
  import { friendlyErrorText } from "./error-messages.js";
4
4
  import {} from "./web-state.js";
5
+ const CLI_ACTIVITY_ACTOR = {
6
+ channel: "cli",
7
+ label: "CLI",
8
+ };
5
9
  export class RelayExternalActivityMonitor {
6
10
  options;
7
11
  mirror = null;
@@ -16,7 +20,9 @@ export class RelayExternalActivityMonitor {
16
20
  if (!this.mirror) {
17
21
  return null;
18
22
  }
19
- const startedAt = this.mirror.startedAt ?? new Date().toISOString();
23
+ const startedAt = this.mirror.startedAt instanceof Date
24
+ ? this.mirror.startedAt.toISOString()
25
+ : this.mirror.startedAt ?? new Date().toISOString();
20
26
  const startedMs = new Date(startedAt).getTime();
21
27
  return {
22
28
  id: this.mirror.turnId ?? "cli",
@@ -75,7 +81,7 @@ export class RelayExternalActivityMonitor {
75
81
  startedAt: snapshot.activity.startedAt?.toISOString() ?? null,
76
82
  };
77
83
  if (snapshot.activity.active) {
78
- this.startExternalTurn(snapshot);
84
+ this.startExternalTurn(snapshot, info);
79
85
  }
80
86
  return;
81
87
  }
@@ -85,9 +91,9 @@ export class RelayExternalActivityMonitor {
85
91
  mirror.turnId = snapshot.activity.turnId;
86
92
  mirror.startedAt = snapshot.activity.startedAt?.toISOString() ?? null;
87
93
  mirror.latestAgentLine = undefined;
88
- this.startExternalTurn(snapshot);
94
+ this.startExternalTurn(snapshot, info);
89
95
  }
90
- this.broadcastExternalEvents(snapshot, snapshot.events.filter((event) => event.lineNumber > mirror.lastLine));
96
+ this.broadcastExternalEvents(snapshot, snapshot.events.filter((event) => event.lineNumber > mirror.lastLine), info);
91
97
  mirror.lastLine = Math.max(mirror.lastLine, snapshot.lineCount);
92
98
  mirror.latestStatus = externalStatusLine(snapshot, this.options.queueLength());
93
99
  this.options.broadcastStatus(mirror.latestStatus, "info");
@@ -122,6 +128,7 @@ export class RelayExternalActivityMonitor {
122
128
  threadId: snapshot.threadId,
123
129
  workspace: info.workspace,
124
130
  agentId: info.agentId,
131
+ actor: CLI_ACTIVITY_ACTOR,
125
132
  prompt: snapshot.latestUserMessage ?? undefined,
126
133
  detail: `${snapshot.agentLabel} CLI task ${terminalEvent.status ?? "finished"}.`,
127
134
  durationMs: durationFromDates(externalStartedAt, terminalEvent.timestamp),
@@ -136,7 +143,7 @@ export class RelayExternalActivityMonitor {
136
143
  }
137
144
  mirror.lastLine = Math.max(mirror.lastLine, snapshot.lineCount);
138
145
  }
139
- startExternalTurn(snapshot) {
146
+ startExternalTurn(snapshot, info) {
140
147
  const prompt = snapshot.latestUserMessage ?? `${snapshot.agentLabel} CLI task`;
141
148
  this.options.chatStore.append({
142
149
  threadId: snapshot.threadId,
@@ -158,11 +165,14 @@ export class RelayExternalActivityMonitor {
158
165
  status: "running",
159
166
  type: "cli_turn_started",
160
167
  threadId: snapshot.threadId,
168
+ workspace: info.workspace,
169
+ agentId: info.agentId,
170
+ actor: CLI_ACTIVITY_ACTOR,
161
171
  prompt,
162
172
  detail: `${snapshot.sourceLabel}: ${snapshot.sourcePath}`,
163
173
  });
164
174
  }
165
- broadcastExternalEvents(snapshot, events) {
175
+ broadcastExternalEvents(snapshot, events, info) {
166
176
  for (const event of events) {
167
177
  if (event.kind === "tool" && event.status === "started") {
168
178
  this.options.broadcast({
@@ -176,6 +186,9 @@ export class RelayExternalActivityMonitor {
176
186
  status: "running",
177
187
  type: "cli_tool_started",
178
188
  threadId: snapshot.threadId,
189
+ workspace: info.workspace,
190
+ agentId: info.agentId,
191
+ actor: CLI_ACTIVITY_ACTOR,
179
192
  detail: event.toolName ?? "tool",
180
193
  });
181
194
  }
@@ -186,6 +199,34 @@ export class RelayExternalActivityMonitor {
186
199
  toolCallId: `cli-${event.lineNumber}`,
187
200
  isError: false,
188
201
  });
202
+ this.options.appendActivity({
203
+ source: "cli",
204
+ status: "completed",
205
+ type: "cli_tool_completed",
206
+ threadId: snapshot.threadId,
207
+ workspace: info.workspace,
208
+ agentId: info.agentId,
209
+ actor: CLI_ACTIVITY_ACTOR,
210
+ detail: event.toolName ?? "tool",
211
+ });
212
+ }
213
+ if (event.kind === "tool" && event.status === "failed") {
214
+ this.options.broadcast({
215
+ type: "tool_end",
216
+ id: snapshot.activity.turnId ?? "cli",
217
+ toolCallId: `cli-${event.lineNumber}`,
218
+ isError: true,
219
+ });
220
+ this.options.appendActivity({
221
+ source: "cli",
222
+ status: "failed",
223
+ type: "cli_tool_failed",
224
+ threadId: snapshot.threadId,
225
+ workspace: info.workspace,
226
+ agentId: info.agentId,
227
+ actor: CLI_ACTIVITY_ACTOR,
228
+ detail: event.toolName ?? "tool",
229
+ });
189
230
  }
190
231
  }
191
232
  }