@nordbyte/nordrelay 0.8.1 → 0.8.3

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 (179) hide show
  1. package/.env.example +9 -0
  2. package/README.md +84 -1205
  3. package/dist/{access-control.js → access/access-control.js} +1 -1
  4. package/dist/{audit-log.js → access/audit-log.js} +32 -15
  5. package/dist/{session-locks.js → access/session-locks.js} +1 -1
  6. package/dist/{user-management.js → access/user-management.js} +1 -1
  7. package/dist/{claude-code-cli.js → agents/claude-code/claude-code-cli.js} +2 -2
  8. package/dist/{claude-code-session.js → agents/claude-code/claude-code-session.js} +1 -1
  9. package/dist/{codex-cli.js → agents/codex/codex-cli.js} +14 -5
  10. package/dist/{codex-session.js → agents/codex/codex-session.js} +2 -4
  11. package/dist/{hermes-cli.js → agents/hermes/hermes-cli.js} +2 -2
  12. package/dist/{hermes-launch.js → agents/hermes/hermes-launch.js} +1 -1
  13. package/dist/{hermes-session.js → agents/hermes/hermes-session.js} +1 -1
  14. package/dist/{openclaw-cli.js → agents/openclaw/openclaw-cli.js} +2 -2
  15. package/dist/{openclaw-launch.js → agents/openclaw/openclaw-launch.js} +1 -1
  16. package/dist/{openclaw-session.js → agents/openclaw/openclaw-session.js} +1 -1
  17. package/dist/{pi-cli.js → agents/pi/pi-cli.js} +2 -2
  18. package/dist/{pi-launch.js → agents/pi/pi-launch.js} +1 -1
  19. package/dist/{pi-session.js → agents/pi/pi-session.js} +1 -1
  20. package/dist/{adapter-conformance.js → agents/shared/adapter-conformance.js} +2 -2
  21. package/dist/{agent-activity.js → agents/shared/agent-activity.js} +5 -5
  22. package/dist/agents/shared/agent-auth-commands.js +30 -0
  23. package/dist/{agent-factory.js → agents/shared/agent-factory.js} +5 -5
  24. package/dist/{agent-feature-matrix.js → agents/shared/agent-feature-matrix.js} +2 -2
  25. package/dist/{agent-updates.js → agents/shared/agent-updates.js} +7 -7
  26. package/dist/{discord-artifacts.js → channels/discord/discord-artifacts.js} +4 -4
  27. package/dist/{discord-bot.js → channels/discord/discord-bot.js} +176 -451
  28. package/dist/{discord-channel-runtime.js → channels/discord/discord-channel-runtime.js} +2 -2
  29. package/dist/{discord-command-surface.js → channels/discord/discord-command-surface.js} +3 -3
  30. package/dist/{bot-rendering.js → channels/shared/bot-rendering.js} +6 -6
  31. package/dist/{channel-actions.js → channels/shared/channel-actions.js} +4 -4
  32. package/dist/channels/shared/channel-bridge-controller.js +69 -0
  33. package/dist/channels/shared/channel-cli-artifacts.js +51 -0
  34. package/dist/{channel-command-service.js → channels/shared/channel-command-service.js} +51 -28
  35. package/dist/channels/shared/channel-external-mirror-controller.js +193 -0
  36. package/dist/channels/shared/channel-external-monitor.js +52 -0
  37. package/dist/{channel-mirror-registry.js → channels/shared/channel-mirror-registry.js} +14 -6
  38. package/dist/{channel-peer-prompt.js → channels/shared/channel-peer-prompt.js} +3 -3
  39. package/dist/channels/shared/channel-prompt-queue.js +37 -0
  40. package/dist/{channel-turn-service.js → channels/shared/channel-turn-service.js} +25 -11
  41. package/dist/{context-key.js → channels/shared/context-key.js} +1 -1
  42. package/dist/{session-format.js → channels/shared/session-format.js} +2 -2
  43. package/dist/{slack-artifacts.js → channels/slack/slack-artifacts.js} +4 -4
  44. package/dist/{slack-bot.js → channels/slack/slack-bot.js} +171 -309
  45. package/dist/{slack-channel-runtime.js → channels/slack/slack-channel-runtime.js} +2 -2
  46. package/dist/{slack-command-surface.js → channels/slack/slack-command-surface.js} +2 -2
  47. package/dist/{slack-diagnostics.js → channels/slack/slack-diagnostics.js} +2 -2
  48. package/dist/{bot-ui.js → channels/telegram/bot-ui.js} +1 -1
  49. package/dist/{bot.js → channels/telegram/bot.js} +195 -430
  50. package/dist/{telegram-access-commands.js → channels/telegram/telegram-access-commands.js} +3 -3
  51. package/dist/{telegram-access-middleware.js → channels/telegram/telegram-access-middleware.js} +4 -4
  52. package/dist/{telegram-agent-commands.js → channels/telegram/telegram-agent-commands.js} +9 -9
  53. package/dist/{telegram-artifact-commands.js → channels/telegram/telegram-artifact-commands.js} +4 -4
  54. package/dist/{telegram-channel-runtime.js → channels/telegram/telegram-channel-runtime.js} +2 -2
  55. package/dist/{telegram-command-menu.js → channels/telegram/telegram-command-menu.js} +1 -1
  56. package/dist/{telegram-diagnostics-command.js → channels/telegram/telegram-diagnostics-command.js} +7 -7
  57. package/dist/{telegram-general-commands.js → channels/telegram/telegram-general-commands.js} +4 -4
  58. package/dist/{telegram-operational-commands.js → channels/telegram/telegram-operational-commands.js} +5 -5
  59. package/dist/{telegram-output.js → channels/telegram/telegram-output.js} +2 -2
  60. package/dist/{telegram-preference-commands.js → channels/telegram/telegram-preference-commands.js} +3 -3
  61. package/dist/{telegram-queue-commands.js → channels/telegram/telegram-queue-commands.js} +6 -6
  62. package/dist/{telegram-support-command.js → channels/telegram/telegram-support-command.js} +4 -4
  63. package/dist/{telegram-update-commands.js → channels/telegram/telegram-update-commands.js} +5 -5
  64. package/dist/{config-metadata.js → core/config-metadata.js} +8 -0
  65. package/dist/{config.js → core/config.js} +11 -3
  66. package/dist/core/pagination.js +22 -0
  67. package/dist/index.js +27 -23
  68. package/dist/peers/peer-discovery-jobs.js +206 -0
  69. package/dist/peers/peer-discovery.js +223 -0
  70. package/dist/peers/peer-health-monitor.js +49 -0
  71. package/dist/{peer-identity.js → peers/peer-identity.js} +50 -1
  72. package/dist/{peer-runtime-service.js → peers/peer-runtime-service.js} +29 -7
  73. package/dist/{peer-server.js → peers/peer-server.js} +3 -2
  74. package/dist/{peer-store.js → peers/peer-store.js} +96 -9
  75. package/dist/{peer-types.js → peers/peer-types.js} +28 -0
  76. package/dist/peers/peer-web-proxy-contract.js +129 -0
  77. package/dist/{metrics.js → runtime/metrics.js} +5 -3
  78. package/dist/{relay-artifact-service.js → runtime/relay-artifact-service.js} +1 -1
  79. package/dist/runtime/relay-auth-service.js +63 -0
  80. package/dist/runtime/relay-dashboard-service.js +139 -0
  81. package/dist/{relay-external-activity-monitor.js → runtime/relay-external-activity-monitor.js} +155 -53
  82. package/dist/{relay-queue-service.js → runtime/relay-queue-service.js} +1 -0
  83. package/dist/runtime/relay-runtime-active-sessions.js +387 -0
  84. package/dist/runtime/relay-runtime-dashboard.js +204 -0
  85. package/dist/{relay-runtime-helpers.js → runtime/relay-runtime-helpers.js} +3 -0
  86. package/dist/runtime/relay-runtime-prompt-queue-artifacts.js +311 -0
  87. package/dist/runtime/relay-runtime-sessions.js +631 -0
  88. package/dist/runtime/relay-runtime-trace.js +92 -0
  89. package/dist/runtime/relay-runtime-types.js +1 -0
  90. package/dist/runtime/relay-runtime-updates-jobs.js +366 -0
  91. package/dist/runtime/relay-runtime.js +461 -0
  92. package/dist/runtime/runtime-cache.js +117 -0
  93. package/dist/{prompt-store.js → state/prompt-store.js} +13 -1
  94. package/dist/{session-registry.js → state/session-registry.js} +3 -3
  95. package/dist/{operations.js → support/operations.js} +7 -7
  96. package/dist/{support-bundle.js → support/support-bundle.js} +1 -1
  97. package/dist/{web-api-contract.js → web/web-api-contract.js} +19 -3
  98. package/dist/web/web-api-types.js +1 -0
  99. package/dist/{web-dashboard-access-routes.js → web/web-dashboard-access-routes.js} +17 -14
  100. package/dist/{web-dashboard-artifact-routes.js → web/web-dashboard-artifact-routes.js} +6 -2
  101. package/dist/{web-dashboard-assets.js → web/web-dashboard-assets.js} +25 -2
  102. package/dist/{web-dashboard-http.js → web/web-dashboard-http.js} +41 -5
  103. package/dist/{web-dashboard-pages.js → web/web-dashboard-pages.js} +95 -30
  104. package/dist/{web-dashboard-peer-routes.js → web/web-dashboard-peer-routes.js} +121 -7
  105. package/dist/{web-dashboard-runtime-routes.js → web/web-dashboard-runtime-routes.js} +8 -1
  106. package/dist/web/web-dashboard-security.js +14 -0
  107. package/dist/{web-dashboard-session-routes.js → web/web-dashboard-session-routes.js} +29 -13
  108. package/dist/web/web-dashboard-ui.js +56 -0
  109. package/dist/{web-dashboard.js → web/web-dashboard.js} +132 -48
  110. package/dist/web/web-performance.js +62 -0
  111. package/dist/web/web-rate-limit.js +19 -0
  112. package/dist/{web-state.js → web/web-state.js} +107 -9
  113. package/dist/webui-assets/dashboard.css +398 -49
  114. package/dist/webui-assets/dashboard.js +1239 -103
  115. package/dist/webui-assets/favicon.ico +0 -0
  116. package/dist/webui-assets/favicon.png +0 -0
  117. package/dist/webui-assets/logo.png +0 -0
  118. package/package.json +6 -3
  119. package/plugins/nordrelay/scripts/nordrelay.mjs +346 -12
  120. package/plugins/nordrelay/scripts/service-installer.mjs +183 -0
  121. package/{launchd/start.sh → scripts/launchd-start.sh} +1 -1
  122. package/scripts/postinstall.mjs +122 -0
  123. package/dist/relay-runtime.js +0 -1916
  124. package/dist/runtime-cache.js +0 -57
  125. package/dist/web-dashboard-ui.js +0 -20
  126. /package/dist/{user-management-crypto.js → access/user-management-crypto.js} +0 -0
  127. /package/dist/{user-management-normalize.js → access/user-management-normalize.js} +0 -0
  128. /package/dist/{user-management-types.js → access/user-management-types.js} +0 -0
  129. /package/dist/{claude-code-auth.js → agents/claude-code/claude-code-auth.js} +0 -0
  130. /package/dist/{claude-code-launch.js → agents/claude-code/claude-code-launch.js} +0 -0
  131. /package/dist/{claude-code-state.js → agents/claude-code/claude-code-state.js} +0 -0
  132. /package/dist/{codex-auth.js → agents/codex/codex-auth.js} +0 -0
  133. /package/dist/{codex-config.js → agents/codex/codex-config.js} +0 -0
  134. /package/dist/{codex-launch.js → agents/codex/codex-launch.js} +0 -0
  135. /package/dist/{codex-state.js → agents/codex/codex-state.js} +0 -0
  136. /package/dist/{hermes-api.js → agents/hermes/hermes-api.js} +0 -0
  137. /package/dist/{hermes-auth.js → agents/hermes/hermes-auth.js} +0 -0
  138. /package/dist/{hermes-state.js → agents/hermes/hermes-state.js} +0 -0
  139. /package/dist/{openclaw-auth.js → agents/openclaw/openclaw-auth.js} +0 -0
  140. /package/dist/{openclaw-gateway.js → agents/openclaw/openclaw-gateway.js} +0 -0
  141. /package/dist/{openclaw-state.js → agents/openclaw/openclaw-state.js} +0 -0
  142. /package/dist/{pi-auth.js → agents/pi/pi-auth.js} +0 -0
  143. /package/dist/{pi-rpc.js → agents/pi/pi-rpc.js} +0 -0
  144. /package/dist/{pi-state.js → agents/pi/pi-state.js} +0 -0
  145. /package/dist/{agent-adapter.js → agents/shared/agent-adapter.js} +0 -0
  146. /package/dist/{agent.js → agents/shared/agent.js} +0 -0
  147. /package/dist/{artifacts.js → artifacts/artifacts.js} +0 -0
  148. /package/dist/{attachments.js → artifacts/attachments.js} +0 -0
  149. /package/dist/{voice.js → artifacts/voice.js} +0 -0
  150. /package/dist/{discord-rate-limit.js → channels/discord/discord-rate-limit.js} +0 -0
  151. /package/dist/{channel-adapter.js → channels/shared/channel-adapter.js} +0 -0
  152. /package/dist/{relay-runtime-types.js → channels/shared/channel-bridge-state.js} +0 -0
  153. /package/dist/{channel-command-catalog.js → channels/shared/channel-command-catalog.js} +0 -0
  154. /package/dist/{channel-command-core.js → channels/shared/channel-command-core.js} +0 -0
  155. /package/dist/{channel-prompt-engine.js → channels/shared/channel-prompt-engine.js} +0 -0
  156. /package/dist/{channel-runtime.js → channels/shared/channel-runtime.js} +0 -0
  157. /package/dist/{channel-turn-lifecycle.js → channels/shared/channel-turn-lifecycle.js} +0 -0
  158. /package/dist/{slack-rate-limit.js → channels/slack/slack-rate-limit.js} +0 -0
  159. /package/dist/{telegram-command-types.js → channels/telegram/telegram-command-types.js} +0 -0
  160. /package/dist/{telegram-rate-limit.js → channels/telegram/telegram-rate-limit.js} +0 -0
  161. /package/dist/{activity-events.js → core/activity-events.js} +0 -0
  162. /package/dist/{error-messages.js → core/error-messages.js} +0 -0
  163. /package/dist/{format.js → core/format.js} +0 -0
  164. /package/dist/{logger.js → core/logger.js} +0 -0
  165. /package/dist/{redaction.js → core/redaction.js} +0 -0
  166. /package/dist/{settings-service.js → core/settings-service.js} +0 -0
  167. /package/dist/{settings-wizard-test.js → core/settings-wizard-test.js} +0 -0
  168. /package/dist/{workspace-policy.js → core/workspace-policy.js} +0 -0
  169. /package/dist/{peer-auth.js → peers/peer-auth.js} +0 -0
  170. /package/dist/{peer-client.js → peers/peer-client.js} +0 -0
  171. /package/dist/{peer-context.js → peers/peer-context.js} +0 -0
  172. /package/dist/{peer-readiness.js → peers/peer-readiness.js} +0 -0
  173. /package/dist/{web-api-types.js → runtime/relay-runtime-delegate.js} +0 -0
  174. /package/dist/{remote-prompt.js → runtime/remote-prompt.js} +0 -0
  175. /package/dist/{bot-preferences.js → state/bot-preferences.js} +0 -0
  176. /package/dist/{job-store.js → state/job-store.js} +0 -0
  177. /package/dist/{persistence.js → state/persistence.js} +0 -0
  178. /package/dist/{state-backend.js → state/state-backend.js} +0 -0
  179. /package/dist/{zip-writer.js → support/zip-writer.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { CODEX_AGENT_CAPABILITIES, agentLabel, } from "./agent.js";
3
- import { friendlyErrorText } from "./error-messages.js";
2
+ import { CODEX_AGENT_CAPABILITIES, agentLabel, } from "../../agents/shared/agent.js";
3
+ import { friendlyErrorText } from "../../core/error-messages.js";
4
4
  export class ChannelTurnService {
5
5
  options;
6
6
  constructor(options) {
@@ -17,12 +17,14 @@ export class ChannelTurnService {
17
17
  }
18
18
  }
19
19
  const turnId = randomUUID().slice(0, 12);
20
+ const correlationId = envelope.correlationId ?? turnId;
20
21
  const startedMs = Date.now();
21
22
  this.options.setCurrentTurn(turnId, startedMs, "");
22
23
  this.options.setCurrentProgress({
23
24
  id: turnId,
24
25
  source: this.options.source,
25
26
  status: "running",
27
+ correlationId,
26
28
  prompt: envelope.description,
27
29
  agentId: info.agentId,
28
30
  agentLabel: info.agentLabel,
@@ -42,6 +44,7 @@ export class ChannelTurnService {
42
44
  role: "user",
43
45
  text: envelope.description,
44
46
  source: this.options.source,
47
+ correlationId,
45
48
  turnId,
46
49
  timestamp: startedAt,
47
50
  });
@@ -53,6 +56,7 @@ export class ChannelTurnService {
53
56
  workspace: info.workspace,
54
57
  agentId: info.agentId,
55
58
  actor,
59
+ correlationId,
56
60
  prompt: envelope.description,
57
61
  });
58
62
  this.options.appendAudit({
@@ -63,9 +67,10 @@ export class ChannelTurnService {
63
67
  threadId: info.threadId,
64
68
  workspace: info.workspace,
65
69
  actor,
70
+ correlationId,
66
71
  description: envelope.description,
67
72
  });
68
- this.options.broadcast({ type: "turn_start", id: turnId, prompt: envelope.description, at: startedAt, source: this.options.source });
73
+ this.options.broadcast({ type: "turn_start", id: turnId, prompt: envelope.description, at: startedAt, source: this.options.source, correlationId });
69
74
  try {
70
75
  await session.prompt(envelope.input, this.callbacks(turnId, info, envelope, actor));
71
76
  this.options.updateSession(session);
@@ -77,6 +82,7 @@ export class ChannelTurnService {
77
82
  role: "agent",
78
83
  text,
79
84
  source: this.options.source,
85
+ correlationId,
80
86
  turnId,
81
87
  });
82
88
  }
@@ -88,6 +94,7 @@ export class ChannelTurnService {
88
94
  workspace: info.workspace,
89
95
  agentId: info.agentId,
90
96
  actor,
97
+ correlationId,
91
98
  prompt: envelope.description,
92
99
  durationMs: Date.now() - this.options.getCurrentTurnStartedAt(),
93
100
  });
@@ -99,10 +106,11 @@ export class ChannelTurnService {
99
106
  threadId: info.threadId,
100
107
  workspace: info.workspace,
101
108
  actor,
109
+ correlationId,
102
110
  description: envelope.description,
103
111
  });
104
112
  this.updateCurrentProgress({ status: "completed" });
105
- this.options.broadcast({ type: "turn_complete", id: turnId, at: new Date().toISOString() });
113
+ this.options.broadcast({ type: "turn_complete", id: turnId, at: new Date().toISOString(), correlationId });
106
114
  this.options.broadcast({ type: "chat_history", messages: await this.options.chatHistory() });
107
115
  }
108
116
  catch (error) {
@@ -112,6 +120,7 @@ export class ChannelTurnService {
112
120
  role: "system",
113
121
  text: `Error: ${errorText}`,
114
122
  source: this.options.source,
123
+ correlationId,
115
124
  turnId,
116
125
  });
117
126
  this.options.appendActivity({
@@ -122,6 +131,7 @@ export class ChannelTurnService {
122
131
  workspace: info.workspace,
123
132
  agentId: info.agentId,
124
133
  actor,
134
+ correlationId,
125
135
  prompt: envelope.description,
126
136
  detail: errorText,
127
137
  durationMs: Date.now() - this.options.getCurrentTurnStartedAt(),
@@ -134,11 +144,12 @@ export class ChannelTurnService {
134
144
  threadId: info.threadId,
135
145
  workspace: info.workspace,
136
146
  actor,
147
+ correlationId,
137
148
  description: envelope.description,
138
149
  detail: errorText,
139
150
  });
140
151
  this.updateCurrentProgress({ status: "failed", detail: errorText });
141
- this.options.broadcast({ type: "turn_error", id: turnId, error: errorText, at: new Date().toISOString() });
152
+ this.options.broadcast({ type: "turn_error", id: turnId, error: errorText, at: new Date().toISOString(), correlationId });
142
153
  this.options.broadcast({ type: "chat_history", messages: await this.options.chatHistory() });
143
154
  throw error;
144
155
  }
@@ -152,12 +163,13 @@ export class ChannelTurnService {
152
163
  }
153
164
  }
154
165
  callbacks(turnId, info, envelope, actor) {
166
+ const correlationId = envelope.correlationId ?? turnId;
155
167
  return {
156
168
  onTextDelta: (delta) => {
157
169
  const nextText = this.options.getAccumulatedText() + delta;
158
170
  this.options.setAccumulatedText(nextText);
159
171
  this.updateCurrentProgress({ outputChars: nextText.length });
160
- this.options.broadcast({ type: "text_delta", id: turnId, delta });
172
+ this.options.broadcast({ type: "text_delta", id: turnId, delta, correlationId });
161
173
  },
162
174
  onToolStart: (toolName, toolCallId) => {
163
175
  this.addCurrentTool(toolName);
@@ -169,14 +181,15 @@ export class ChannelTurnService {
169
181
  workspace: info.workspace,
170
182
  agentId: info.agentId,
171
183
  actor,
184
+ correlationId,
172
185
  prompt: envelope.description,
173
186
  detail: toolName,
174
187
  });
175
- this.options.broadcast({ type: "tool_start", id: turnId, toolCallId, toolName });
188
+ this.options.broadcast({ type: "tool_start", id: turnId, toolCallId, toolName, correlationId });
176
189
  },
177
190
  onToolUpdate: (toolCallId, partialResult) => {
178
191
  this.updateCurrentProgress();
179
- this.options.broadcast({ type: "tool_update", id: turnId, toolCallId, partialResult });
192
+ this.options.broadcast({ type: "tool_update", id: turnId, toolCallId, partialResult, correlationId });
180
193
  },
181
194
  onToolEnd: (toolCallId, isError) => {
182
195
  const progress = this.options.getCurrentProgress();
@@ -190,17 +203,18 @@ export class ChannelTurnService {
190
203
  workspace: info.workspace,
191
204
  agentId: info.agentId,
192
205
  actor,
206
+ correlationId,
193
207
  prompt: envelope.description,
194
208
  detail: toolName,
195
209
  });
196
- this.options.broadcast({ type: "tool_end", id: turnId, toolCallId, isError });
210
+ this.options.broadcast({ type: "tool_end", id: turnId, toolCallId, isError, correlationId });
197
211
  },
198
212
  onTodoUpdate: (items) => {
199
213
  this.updateCurrentProgress({ detail: `Plan: ${items.filter((item) => item.completed).length}/${items.length} done` });
200
- this.options.broadcast({ type: "todo_update", id: turnId, items });
214
+ this.options.broadcast({ type: "todo_update", id: turnId, items, correlationId });
201
215
  },
202
216
  onTurnComplete: () => { },
203
- onAgentEnd: () => this.options.broadcast({ type: "turn_complete", id: turnId, at: new Date().toISOString() }),
217
+ onAgentEnd: () => this.options.broadcast({ type: "turn_complete", id: turnId, at: new Date().toISOString(), correlationId }),
204
218
  };
205
219
  }
206
220
  updateCurrentProgress(patch = {}) {
@@ -1,4 +1,4 @@
1
- import { parsePeerRuntimeContextKey } from "./peer-context.js";
1
+ import { parsePeerRuntimeContextKey } from "../../peers/peer-context.js";
2
2
  export function telegramContextKeyFromMessage(chatId, messageThreadId) {
3
3
  if (messageThreadId !== undefined) {
4
4
  return `${chatId}:${messageThreadId}`;
@@ -1,5 +1,5 @@
1
- import { CODEX_AGENT_CAPABILITIES, agentReasoningLabel } from "./agent.js";
2
- import { escapeHTML } from "./format.js";
1
+ import { CODEX_AGENT_CAPABILITIES, agentReasoningLabel } from "../../agents/shared/agent.js";
2
+ import { escapeHTML } from "../../core/format.js";
3
3
  export function renderSessionInfoPlain(info) {
4
4
  const capabilities = info.capabilities ?? CODEX_AGENT_CAPABILITIES;
5
5
  const agentId = info.agentId ?? "codex";
@@ -1,7 +1,7 @@
1
- import { collectRecentWorkspaceArtifacts, createArtifactZipBundle, formatArtifactSummary, listRecentArtifactReports } from "./artifacts.js";
2
- import { filterArtifactReports as filterArtifactReportsForCommand } from "./bot-rendering.js";
3
- import { renderArtifactReportsAction } from "./channel-actions.js";
4
- import { deliverChannelAction } from "./channel-runtime.js";
1
+ import { collectRecentWorkspaceArtifacts, createArtifactZipBundle, formatArtifactSummary, listRecentArtifactReports } from "../../artifacts/artifacts.js";
2
+ import { filterArtifactReports as filterArtifactReportsForCommand } from "../shared/bot-rendering.js";
3
+ import { renderArtifactReportsAction } from "../shared/channel-actions.js";
4
+ import { deliverChannelAction } from "../shared/channel-runtime.js";
5
5
  export function createSlackArtifactCommandHandler(deps) {
6
6
  return async (request, argument) => {
7
7
  const session = await deps.getSession(request, { deferThreadStart: true });