onboardconnect-agent 0.1.1

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 (58) hide show
  1. package/dist/crypto.d.ts +3 -0
  2. package/dist/crypto.d.ts.map +1 -0
  3. package/dist/crypto.js +12 -0
  4. package/dist/crypto.js.map +1 -0
  5. package/dist/heartbeat.d.ts +17 -0
  6. package/dist/heartbeat.d.ts.map +1 -0
  7. package/dist/heartbeat.js +86 -0
  8. package/dist/heartbeat.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +81 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/ldap.d.ts +31 -0
  14. package/dist/ldap.d.ts.map +1 -0
  15. package/dist/ldap.js +420 -0
  16. package/dist/ldap.js.map +1 -0
  17. package/dist/logger.d.ts +9 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +47 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/relay.d.ts +38 -0
  22. package/dist/relay.d.ts.map +1 -0
  23. package/dist/relay.js +347 -0
  24. package/dist/relay.js.map +1 -0
  25. package/dist/request-log.d.ts +24 -0
  26. package/dist/request-log.d.ts.map +1 -0
  27. package/dist/request-log.js +52 -0
  28. package/dist/request-log.js.map +1 -0
  29. package/dist/server.d.ts +30 -0
  30. package/dist/server.d.ts.map +1 -0
  31. package/dist/server.js +509 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/setup.d.ts +3 -0
  34. package/dist/setup.d.ts.map +1 -0
  35. package/dist/setup.js +342 -0
  36. package/dist/setup.js.map +1 -0
  37. package/dist/store.d.ts +53 -0
  38. package/dist/store.d.ts.map +1 -0
  39. package/dist/store.js +170 -0
  40. package/dist/store.js.map +1 -0
  41. package/dist/uninstall.d.ts +2 -0
  42. package/dist/uninstall.d.ts.map +1 -0
  43. package/dist/uninstall.js +127 -0
  44. package/dist/uninstall.js.map +1 -0
  45. package/dist/updater.d.ts +4 -0
  46. package/dist/updater.d.ts.map +1 -0
  47. package/dist/updater.js +30 -0
  48. package/dist/updater.js.map +1 -0
  49. package/package.json +62 -0
  50. package/scripts/install.ps1 +133 -0
  51. package/scripts/install.sh +132 -0
  52. package/scripts/postinstall.js +21 -0
  53. package/scripts/postinstall.ts +24 -0
  54. package/scripts/uninstall.ps1 +93 -0
  55. package/scripts/uninstall.sh +85 -0
  56. package/ui/assets/index-Bf505_Hi.css +1 -0
  57. package/ui/assets/index-zxbHz6zx.js +71 -0
  58. package/ui/index.html +23 -0
package/dist/relay.js ADDED
@@ -0,0 +1,347 @@
1
+ import WebSocket from "ws";
2
+ import { promises as fs } from "fs";
3
+ import { LRUCache } from "lru-cache";
4
+ import { OcLogger } from "./logger.js";
5
+ import { OcCommandExecutor } from "./ldap.js";
6
+ import { OcStore } from "./store.js";
7
+ import { ocDecryptPayload } from "./crypto.js";
8
+ import { ocRequestLog } from "./request-log.js";
9
+ const RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000, 30000];
10
+ const DEDUP_CACHE_SIZE = 1000;
11
+ export class OcRelay {
12
+ credentials;
13
+ ws = null;
14
+ _reconnectAttempts = 0;
15
+ isConnected = false;
16
+ _paused = false;
17
+ _canRun = true;
18
+ _runBlockedReason = null;
19
+ logger = new OcLogger("relay");
20
+ executedCommands = new LRUCache({
21
+ max: DEDUP_CACHE_SIZE,
22
+ ttl: 1000 * 60 * 60, // 1 hour
23
+ });
24
+ executor = null;
25
+ store = new OcStore();
26
+ // Loaded once on connect; restart required to pick up changes.
27
+ allowedCommandTypes = null;
28
+ constructor(credentials) {
29
+ this.credentials = credentials;
30
+ }
31
+ async connect() {
32
+ if (!this.credentials)
33
+ return;
34
+ const preflight = await this.checkPreflight();
35
+ if (!preflight.canRun) {
36
+ this._canRun = false;
37
+ this._runBlockedReason = preflight.reason ?? "unknown";
38
+ this.logger.error(`Agent blocked — cannot connect: ${this._runBlockedReason}`);
39
+ if (this.isPermanentBlock(this._runBlockedReason)) {
40
+ this.logger.error("Permanent block — will not retry. Re-run setup or contact support.");
41
+ }
42
+ else {
43
+ this.schedulePreflightRetry();
44
+ }
45
+ return;
46
+ }
47
+ this._canRun = true;
48
+ this._runBlockedReason = null;
49
+ const ldap = await this.store.loadLdapCredentials();
50
+ if (ldap) {
51
+ this.executor = new OcCommandExecutor(ldap);
52
+ }
53
+ this.allowedCommandTypes = await this.store.loadAllowedCommandTypes();
54
+ if (this.allowedCommandTypes !== null) {
55
+ this.logger.info(`Command allowlist active: ${this.allowedCommandTypes.join(", ")}`);
56
+ }
57
+ await this.establishConnection();
58
+ }
59
+ async checkPreflight() {
60
+ if (!this.credentials)
61
+ return { canRun: false, reason: "not_configured" };
62
+ try {
63
+ const url = `${this.credentials.relayUrl}/relay/${this.credentials.agentId}/preflight`;
64
+ const res = await fetch(url, {
65
+ headers: { Authorization: `Bearer ${this.credentials.agentToken}` },
66
+ signal: AbortSignal.timeout(10_000),
67
+ });
68
+ if (!res.ok)
69
+ return { canRun: false, reason: "preflight_unreachable" };
70
+ return res.json();
71
+ }
72
+ catch {
73
+ // Network failure — allow agent to start (will fail at WebSocket connect if really unreachable)
74
+ this.logger.warn("Preflight check failed — proceeding anyway");
75
+ return { canRun: true };
76
+ }
77
+ }
78
+ isPermanentBlock(reason) {
79
+ return ["agent_revoked", "tenant_canceled", "invalid_token", "agent_not_found"].includes(reason);
80
+ }
81
+ schedulePreflightRetry() {
82
+ const RETRY_MS = 5 * 60 * 1000;
83
+ this.logger.info(`Will retry preflight in 5 minutes`);
84
+ setTimeout(() => void this.connect(), RETRY_MS);
85
+ }
86
+ setBlockedByHeartbeat(reason) {
87
+ this._canRun = false;
88
+ this._runBlockedReason = reason;
89
+ this.logger.error(`Agent blocked by heartbeat response: ${reason}`);
90
+ void this.disconnect();
91
+ if (!this.isPermanentBlock(reason)) {
92
+ this.schedulePreflightRetry();
93
+ }
94
+ }
95
+ async establishConnection() {
96
+ if (!this.credentials)
97
+ return;
98
+ const url = `${this.credentials.relayUrl}/relay/${this.credentials.agentId}/connect`;
99
+ this.logger.info(`Connecting to relay: ${url}`);
100
+ this.ws = new WebSocket(url, {
101
+ headers: {
102
+ Authorization: `Bearer ${this.credentials.agentToken}`,
103
+ },
104
+ });
105
+ this.ws.on("open", () => {
106
+ this.isConnected = true;
107
+ this._reconnectAttempts = 0;
108
+ this.logger.info("Connected to OC relay");
109
+ });
110
+ this.ws.on("message", async (data) => {
111
+ try {
112
+ const command = JSON.parse(data.toString());
113
+ await this.handleCommand(command);
114
+ }
115
+ catch (err) {
116
+ this.logger.error("Failed to handle command", { err });
117
+ }
118
+ });
119
+ this.ws.on("close", (code) => {
120
+ this.isConnected = false;
121
+ if (code === 4001) {
122
+ this.logger.error("Agent revoked — reconnection disabled. Re-run setup to register a new agent.");
123
+ return;
124
+ }
125
+ this.logger.warn("Disconnected from relay");
126
+ this.scheduleReconnect();
127
+ });
128
+ this.ws.on("error", (err) => {
129
+ this.logger.error("WebSocket error", { message: err.message });
130
+ });
131
+ }
132
+ scheduleReconnect() {
133
+ const delayIndex = Math.min(this._reconnectAttempts, RECONNECT_DELAYS.length - 1);
134
+ const delay = RECONNECT_DELAYS[delayIndex] ?? 30000;
135
+ this._reconnectAttempts++;
136
+ this.logger.info(`Reconnecting in ${delay}ms (attempt ${this._reconnectAttempts})`);
137
+ setTimeout(() => this.establishConnection(), delay);
138
+ }
139
+ reconnect() {
140
+ if (this.ws) {
141
+ this.ws.close();
142
+ this.ws = null;
143
+ }
144
+ void this.establishConnection();
145
+ }
146
+ pause() {
147
+ this._paused = true;
148
+ this.logger.info("Relay paused — new commands will be rejected");
149
+ }
150
+ resume() {
151
+ this._paused = false;
152
+ this.logger.info("Relay resumed");
153
+ }
154
+ async reconnectWithNewCredentials(creds) {
155
+ this.credentials = creds;
156
+ if (this.ws) {
157
+ this.ws.close();
158
+ this.ws = null;
159
+ this.isConnected = false;
160
+ }
161
+ await this.connect();
162
+ }
163
+ get reconnectAttempts() {
164
+ return this._reconnectAttempts;
165
+ }
166
+ get paused() {
167
+ return this._paused;
168
+ }
169
+ get canRun() {
170
+ return this._canRun;
171
+ }
172
+ get runBlockedReason() {
173
+ return this._runBlockedReason;
174
+ }
175
+ async handleCommand(command) {
176
+ const { commandId, expiresAt } = command;
177
+ // Log receipt before any early-exit checks
178
+ ocRequestLog.begin(commandId, command.commandType, command.dryRun ?? false);
179
+ if (new Date(expiresAt) < new Date()) {
180
+ this.logger.warn("Command expired, skipping", { commandId });
181
+ ocRequestLog.skip(commandId, "expired");
182
+ this.sendResult({ commandId, success: false, error: "expired", executedAt: new Date().toISOString() });
183
+ return;
184
+ }
185
+ if (this.executedCommands.has(commandId)) {
186
+ this.logger.debug("Duplicate command, skipping", { commandId });
187
+ ocRequestLog.skip(commandId, "duplicate");
188
+ this.sendResult({ commandId, success: true, executedAt: new Date().toISOString() });
189
+ return;
190
+ }
191
+ if (this._paused) {
192
+ this.logger.warn("Agent paused — rejecting command", { commandId });
193
+ ocRequestLog.complete(commandId, false, 0, "agent paused");
194
+ this.sendResult({ commandId, success: false, error: "agent paused", executedAt: new Date().toISOString() });
195
+ return;
196
+ }
197
+ if (this.allowedCommandTypes !== null && !this.allowedCommandTypes.includes(command.commandType)) {
198
+ const errMsg = `Command type '${command.commandType}' is not allowed on this agent`;
199
+ this.logger.warn("Command blocked by allowlist", { commandId, commandType: command.commandType });
200
+ ocRequestLog.complete(commandId, false, 0, errMsg);
201
+ this.sendResult({ commandId, success: false, error: errMsg, executedAt: new Date().toISOString() });
202
+ return;
203
+ }
204
+ if (!this.executor) {
205
+ const errMsg = "LDAP not configured";
206
+ ocRequestLog.complete(commandId, false, 0, errMsg);
207
+ this.sendResult({ commandId, success: false, error: errMsg, executedAt: new Date().toISOString() });
208
+ return;
209
+ }
210
+ const startedAt = Date.now();
211
+ try {
212
+ if (!this.credentials)
213
+ throw new Error("Agent not configured");
214
+ const decryptedPayload = ocDecryptPayload(command.payload, this.credentials.encryptionKey);
215
+ const decryptedCommand = {
216
+ commandId: command.commandId,
217
+ commandType: command.commandType,
218
+ payload: decryptedPayload,
219
+ dryRun: command.dryRun,
220
+ expiresAt: command.expiresAt,
221
+ };
222
+ // File I/O — runs on local filesystem, no LDAP connection required
223
+ if (command.commandType === "read_file") {
224
+ const result = await this.handleReadFile(commandId, decryptedPayload);
225
+ const durationMs = Date.now() - startedAt;
226
+ this.executedCommands.set(commandId, true);
227
+ ocRequestLog.complete(commandId, true, durationMs);
228
+ this.sendResult(result);
229
+ return;
230
+ }
231
+ if (command.commandType === "write_file") {
232
+ const result = await this.handleWriteFile(commandId, decryptedPayload);
233
+ const durationMs = Date.now() - startedAt;
234
+ this.executedCommands.set(commandId, true);
235
+ ocRequestLog.complete(commandId, true, durationMs);
236
+ this.sendResult(result);
237
+ return;
238
+ }
239
+ if (!this.executor) {
240
+ const errMsg = "LDAP not configured";
241
+ ocRequestLog.complete(commandId, false, Date.now() - startedAt, errMsg);
242
+ this.sendResult({ commandId, success: false, error: errMsg, executedAt: new Date().toISOString() });
243
+ return;
244
+ }
245
+ const result = await this.executor.execute(decryptedCommand);
246
+ const durationMs = Date.now() - startedAt;
247
+ this.executedCommands.set(commandId, true);
248
+ ocRequestLog.complete(commandId, true, durationMs);
249
+ this.sendResult(result);
250
+ }
251
+ catch (err) {
252
+ const durationMs = Date.now() - startedAt;
253
+ const error = err instanceof Error ? err.message : String(err);
254
+ ocRequestLog.complete(commandId, false, durationMs, error);
255
+ this.sendResult({ commandId, success: false, error, executedAt: new Date().toISOString() });
256
+ }
257
+ }
258
+ async handleReadFile(commandId, payload) {
259
+ const resolvedPath = await this.store.resolvePath(payload.filePath);
260
+ this.logger.info("read_file", { commandId, filePath: resolvedPath });
261
+ const content = await fs.readFile(resolvedPath, "utf-8");
262
+ const rows = ocParseCsv(content);
263
+ this.logger.info("read_file success", { commandId, rows: rows.length });
264
+ return { commandId, success: true, rows, executedAt: new Date().toISOString() };
265
+ }
266
+ async handleWriteFile(commandId, payload) {
267
+ const resolvedPath = await this.store.resolvePath(payload.filePath);
268
+ this.logger.info("write_file", { commandId, filePath: resolvedPath, rows: payload.rows.length });
269
+ const content = ocSerializeCsv(payload.rows, payload.fieldOrder);
270
+ await fs.writeFile(resolvedPath, content, "utf-8");
271
+ this.logger.info("write_file success", { commandId });
272
+ return { commandId, success: true, executedAt: new Date().toISOString() };
273
+ }
274
+ sendResult(result) {
275
+ if (this.ws && this.isConnected) {
276
+ this.ws.send(JSON.stringify(result));
277
+ }
278
+ }
279
+ async disconnect() {
280
+ if (this.ws) {
281
+ this.ws.close();
282
+ this.ws = null;
283
+ }
284
+ }
285
+ get connected() {
286
+ return this.isConnected;
287
+ }
288
+ }
289
+ // ─── CSV helpers ──────────────────────────────────────────────────────────────
290
+ //
291
+ // NOTE: These helpers are intentionally NOT replaced with @oc/shared's
292
+ // ocParseSlateCsv. The shared implementation is Slate-specific: it lowercases
293
+ // all headers, strips a UTF-8 BOM, requires slatePersonId/email columns, and
294
+ // returns a typed OcSlateCsvParseResult. The functions below are general-purpose
295
+ // AD file I/O helpers that preserve header casing and include ocSerializeCsv
296
+ // (round-trip write support), neither of which the shared module provides.
297
+ function ocParseCsvLine(line) {
298
+ const values = [];
299
+ let cur = "";
300
+ let inQ = false;
301
+ for (let i = 0; i < line.length; i++) {
302
+ const ch = line[i] ?? "";
303
+ if (ch === '"') {
304
+ if (inQ && line[i + 1] === '"') {
305
+ cur += '"';
306
+ i++;
307
+ }
308
+ else
309
+ inQ = !inQ;
310
+ }
311
+ else if (ch === "," && !inQ) {
312
+ values.push(cur);
313
+ cur = "";
314
+ }
315
+ else
316
+ cur += ch;
317
+ }
318
+ values.push(cur);
319
+ return values;
320
+ }
321
+ function ocParseCsv(content) {
322
+ const lines = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim().split("\n");
323
+ if (lines.length < 2)
324
+ return [];
325
+ const headers = ocParseCsvLine(lines[0] ?? "").map(h => h.trim());
326
+ const rows = [];
327
+ for (let i = 1; i < lines.length; i++) {
328
+ const line = (lines[i] ?? "").trim();
329
+ if (!line)
330
+ continue;
331
+ const vals = ocParseCsvLine(line);
332
+ const row = {};
333
+ headers.forEach((h, idx) => { row[h] = (vals[idx] ?? "").trim(); });
334
+ rows.push(row);
335
+ }
336
+ return rows;
337
+ }
338
+ function ocSerializeCsv(rows, fieldOrder) {
339
+ if (rows.length === 0)
340
+ return "";
341
+ const keys = fieldOrder ?? Object.keys(rows[0] ?? {});
342
+ const esc = (v) => v.includes(",") || v.includes('"') || v.includes("\n") ? `"${v.replace(/"/g, '""')}"` : v;
343
+ const header = keys.map(esc).join(",");
344
+ const body = rows.map(r => keys.map(k => esc(r[k] ?? "")).join(",")).join("\n");
345
+ return `${header}\n${body}\n`;
346
+ }
347
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface OcRequestEntry {
2
+ id: string;
3
+ commandType: string;
4
+ receivedAt: string;
5
+ completedAt?: string;
6
+ status: "pending" | "success" | "error" | "skipped";
7
+ durationMs?: number;
8
+ error?: string;
9
+ dryRun: boolean;
10
+ }
11
+ declare class OcRequestLog {
12
+ private entries;
13
+ private readonly maxSize;
14
+ private readonly listeners;
15
+ begin(id: string, commandType: string, dryRun: boolean): void;
16
+ complete(id: string, success: boolean, durationMs: number, error?: string): void;
17
+ skip(id: string, reason: "expired" | "duplicate"): void;
18
+ getAll(): OcRequestEntry[];
19
+ subscribe(fn: () => void): () => void;
20
+ private notify;
21
+ }
22
+ export declare const ocRequestLog: OcRequestLog;
23
+ export {};
24
+ //# sourceMappingURL=request-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-log.d.ts","sourceRoot":"","sources":["../src/request-log.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,cAAM,YAAY;IAChB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAO;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAe7D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAWhF,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,IAAI;IAWvD,MAAM,IAAI,cAAc,EAAE;IAI1B,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKrC,OAAO,CAAC,MAAM;CAGf;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,52 @@
1
+ class OcRequestLog {
2
+ entries = [];
3
+ maxSize = 200;
4
+ listeners = new Set();
5
+ begin(id, commandType, dryRun) {
6
+ const entry = {
7
+ id,
8
+ commandType,
9
+ receivedAt: new Date().toISOString(),
10
+ status: "pending",
11
+ dryRun,
12
+ };
13
+ this.entries.unshift(entry);
14
+ if (this.entries.length > this.maxSize) {
15
+ this.entries.length = this.maxSize;
16
+ }
17
+ this.notify();
18
+ }
19
+ complete(id, success, durationMs, error) {
20
+ const entry = this.entries.find((e) => e.id === id);
21
+ if (entry) {
22
+ entry.status = success ? "success" : "error";
23
+ entry.completedAt = new Date().toISOString();
24
+ entry.durationMs = durationMs;
25
+ if (error)
26
+ entry.error = error;
27
+ }
28
+ this.notify();
29
+ }
30
+ skip(id, reason) {
31
+ const entry = this.entries.find((e) => e.id === id);
32
+ if (entry) {
33
+ entry.status = "skipped";
34
+ entry.completedAt = new Date().toISOString();
35
+ entry.durationMs = 0;
36
+ entry.error = reason;
37
+ }
38
+ this.notify();
39
+ }
40
+ getAll() {
41
+ return this.entries.slice(0, 100);
42
+ }
43
+ subscribe(fn) {
44
+ this.listeners.add(fn);
45
+ return () => this.listeners.delete(fn);
46
+ }
47
+ notify() {
48
+ this.listeners.forEach((fn) => fn());
49
+ }
50
+ }
51
+ export const ocRequestLog = new OcRequestLog();
52
+ //# sourceMappingURL=request-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-log.js","sourceRoot":"","sources":["../src/request-log.ts"],"names":[],"mappings":"AAWA,MAAM,YAAY;IACR,OAAO,GAAqB,EAAE,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC;IACd,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAEnD,KAAK,CAAC,EAAU,EAAE,WAAmB,EAAE,MAAe;QACpD,MAAM,KAAK,GAAmB;YAC5B,EAAE;YACF,WAAW;YACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM;SACP,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,EAAU,EAAE,OAAgB,EAAE,UAAkB,EAAE,KAAc;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC9B,IAAI,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,EAAU,EAAE,MAA+B;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YACzB,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;YACrB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,EAAc;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { OcRelay } from "./relay.js";
2
+ import type { OcHeartbeat } from "./heartbeat.js";
3
+ import type { OcStore } from "./store.js";
4
+ import type { OcAgentCredentials } from "./store.js";
5
+ export declare class OcServer {
6
+ private relay;
7
+ private heartbeat;
8
+ private store;
9
+ private uiToken;
10
+ private agentId;
11
+ private relayUrl;
12
+ private version;
13
+ private onSetupComplete?;
14
+ private readonly logger;
15
+ private readonly sseClients;
16
+ private readonly uiDir;
17
+ private setupInProgress;
18
+ constructor(relay: OcRelay, heartbeat: OcHeartbeat, store: OcStore, uiToken: string, agentId: string, relayUrl: string, version: string, onSetupComplete?: ((creds: OcAgentCredentials) => void) | undefined);
19
+ start(): void;
20
+ private handleRequest;
21
+ private handleApiRequest;
22
+ private handleTestLdap;
23
+ private handleCheckAccess;
24
+ private handleSetup;
25
+ private handleSse;
26
+ private pushStatusSse;
27
+ private buildStatus;
28
+ private serveStatic;
29
+ }
30
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8ErD,qBAAa,QAAQ;IAOjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,eAAe,CAAC;IAb1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAS;gBAGtB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,GAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,aAAA;IAM/D,KAAK,IAAI,IAAI;YAwBC,aAAa;YA0Bb,gBAAgB;YA+IhB,cAAc;YAyBd,iBAAiB;YAiEjB,WAAW;IA6CzB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,WAAW;CA6EpB"}