oncall-cli 2.0.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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/bin/oncall.js +303 -0
  4. package/dist/api.d.ts +1 -0
  5. package/dist/api.js +23 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +91 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/code_hierarchy.d.ts +4 -0
  11. package/dist/code_hierarchy.js +92 -0
  12. package/dist/code_hierarchy.js.map +1 -0
  13. package/dist/config.d.ts +9 -0
  14. package/dist/config.js +12 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/helpers/cli-helpers.d.ts +22 -0
  17. package/dist/helpers/cli-helpers.js +261 -0
  18. package/dist/helpers/cli-helpers.js.map +1 -0
  19. package/dist/helpers/config-helpers.js +161 -0
  20. package/dist/helpers/ripgrep-tool.d.ts +15 -0
  21. package/dist/helpers/ripgrep-tool.js +110 -0
  22. package/dist/helpers/ripgrep-tool.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.js +545 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logsManager.d.ts +31 -0
  27. package/dist/logsManager.js +90 -0
  28. package/dist/logsManager.js.map +1 -0
  29. package/dist/tools/ripgrep.d.ts +15 -0
  30. package/dist/tools/ripgrep.js +110 -0
  31. package/dist/tools/ripgrep.js.map +1 -0
  32. package/dist/ui-graph.d.ts +1 -0
  33. package/dist/ui-graph.js +125 -0
  34. package/dist/ui-graph.js.map +1 -0
  35. package/dist/useWebSocket.d.ts +21 -0
  36. package/dist/useWebSocket.js +411 -0
  37. package/dist/useWebSocket.js.map +1 -0
  38. package/dist/utils/version-check.d.ts +2 -0
  39. package/dist/utils/version-check.js +124 -0
  40. package/dist/utils/version-check.js.map +1 -0
  41. package/dist/utils.d.ts +1 -0
  42. package/dist/utils.js +22 -0
  43. package/dist/utils.js.map +1 -0
  44. package/dist/websocket-server.d.ts +24 -0
  45. package/dist/websocket-server.js +221 -0
  46. package/dist/websocket-server.js.map +1 -0
  47. package/package.json +46 -0
@@ -0,0 +1,411 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { getContextLines } from "./utils.js";
3
+ import { toolFunctionCall } from "./api.js";
4
+ import fs from "fs";
5
+ import os from "os";
6
+ import path from "path";
7
+ import { mapChatMessagesToStoredMessages, mapStoredMessagesToChatMessages, } from "@langchain/core/messages";
8
+ import { ripgrepSearch } from "./helpers/ripgrep-tool.js";
9
+ import { loadProjectMetadata, logd } from "./helpers/cli-helpers.js";
10
+ // Load OnCall config from ~/.oncall/config
11
+ const HOME_DIR = os.homedir();
12
+ const ONCALL_DIR = path.join(HOME_DIR, ".oncall");
13
+ const CONFIG_PATH = path.join(ONCALL_DIR, "config");
14
+ let API_KEY = "";
15
+ try {
16
+ const configText = fs.readFileSync(CONFIG_PATH, "utf8");
17
+ const match = configText.match(/^API_KEY\s*=\s*(.*)$/m);
18
+ if (match && match[1]) {
19
+ API_KEY = match[1].trim();
20
+ }
21
+ else {
22
+ console.log("No API_KEY found in ~/.oncall/config");
23
+ }
24
+ }
25
+ catch (err) {
26
+ console.log("Failed to read OnCall config:", err);
27
+ }
28
+ export function useWebSocket(url, rawLogData) {
29
+ //refs
30
+ const socketRef = useRef(null);
31
+ const [socketId, setSocketId] = useState(null);
32
+ const [chatResponseMessages, setChatResponseMessages] = useState([]);
33
+ const [trimmedChats, setTrimmedChats] = useState([]);
34
+ const [visibleChats, setVisibleChats] = useState([]);
35
+ const [isConnected, setIsConnected] = useState(false);
36
+ const [connectionError, setConnectionError] = useState(null);
37
+ const [isLoading, setIsLoading] = useState(false);
38
+ const [showControlR, setShowControlR] = useState(false);
39
+ const authKey = API_KEY;
40
+ const initialProjectMetadata = loadProjectMetadata();
41
+ const getProjectMetadata = () => loadProjectMetadata() || initialProjectMetadata;
42
+ const getServiceId = () => getProjectMetadata()?.window_id;
43
+ const hasLogsAccess = () => {
44
+ const value = getProjectMetadata()?.logs_available;
45
+ return value === undefined ? true : value;
46
+ };
47
+ const hasCodeAccess = () => {
48
+ const value = getProjectMetadata()?.code_available;
49
+ return value === undefined ? true : value;
50
+ };
51
+ useEffect(() => {
52
+ if (API_KEY === "") {
53
+ setConnectionError("No API_KEY found in ~/.oncall/config");
54
+ console.log("No API_KEY found in ~/.oncall/config");
55
+ process.exit();
56
+ }
57
+ }, [API_KEY]);
58
+ //web socket connection
59
+ const connectWebSocket = useCallback(() => {
60
+ // const d = fs.readFileSync('logs')
61
+ // fs.writeFileSync('logs', `${d} inside connectWS \n message: ${url} ${authKey} ${serviceId}`)
62
+ // if (!url || !authKey || serviceId.trim() === "") {
63
+ // return;
64
+ // }
65
+ if (socketRef.current) {
66
+ socketRef.current.close();
67
+ }
68
+ const socket = new WebSocket(url);
69
+ socketRef.current = socket;
70
+ setConnectionError(null);
71
+ setIsConnected(false);
72
+ socket.onopen = () => {
73
+ try {
74
+ const md = getProjectMetadata();
75
+ if (!md?.window_id) {
76
+ setConnectionError("Missing serviceId (window_id) in oncall.yaml");
77
+ console.log("Missing serviceId (window_id) in oncall.yaml");
78
+ return;
79
+ }
80
+ socket.send(JSON.stringify({
81
+ type: "recurring_connection",
82
+ authKey,
83
+ serviceId: md.window_id,
84
+ }));
85
+ }
86
+ catch (error) {
87
+ setConnectionError("error");
88
+ }
89
+ };
90
+ socket.onmessage = async (event) => {
91
+ // setShowControlR(false);
92
+ try {
93
+ const raw = event.data;
94
+ let text = "";
95
+ if (typeof raw === "string") {
96
+ text = raw;
97
+ }
98
+ else if (raw instanceof ArrayBuffer) {
99
+ text = Buffer.from(raw).toString("utf8");
100
+ }
101
+ else if (ArrayBuffer.isView(raw)) {
102
+ // @ts-ignore - handle typed arrays
103
+ text = Buffer.from(raw.buffer).toString("utf8");
104
+ }
105
+ else if (raw && typeof raw.toString === "function") {
106
+ text = String(raw);
107
+ }
108
+ text = text?.trim?.() ?? "";
109
+ if (!text)
110
+ return; // ignore empty frames
111
+ if (!(text.startsWith("{") || text.startsWith("["))) {
112
+ return; // ignore non-JSON frames
113
+ }
114
+ const data = JSON.parse(text);
115
+ // if (data.type === "user_assigned" && data.socketId) {
116
+ if (data.type === "user_assigned") {
117
+ setIsConnected(true);
118
+ setSocketId(data.socketId);
119
+ }
120
+ if (![
121
+ "ack",
122
+ "ask_user",
123
+ "response",
124
+ "error",
125
+ "tool_function_call",
126
+ "ask_user",
127
+ "progress",
128
+ ].includes(data.type)) {
129
+ return;
130
+ }
131
+ if (data.type === "tool_function_call") {
132
+ if (data.function_name === "read_file") {
133
+ if (!hasCodeAccess()) {
134
+ await denyToolAccess("read_file", data);
135
+ return;
136
+ }
137
+ const argsData = {
138
+ filePath: data.args.filePath,
139
+ lineNumber: data.args.lineNumber,
140
+ before: data.args.before,
141
+ after: data.args.after,
142
+ };
143
+ const result = getContextLines(argsData.filePath, argsData.lineNumber, argsData.before, argsData.after);
144
+ await postToolCallResult(data, result, setChatResponseMessages);
145
+ // await redisClient.set(data.tool_call_id, result, { EX: 120 });
146
+ return;
147
+ }
148
+ if (data.function_name === "grep_search") {
149
+ if (!hasCodeAccess()) {
150
+ await denyToolAccess("grep_search", data);
151
+ return;
152
+ }
153
+ await grepSearch(data.args.searchTerm, data);
154
+ return;
155
+ }
156
+ if (data.function_name === "read_logs") {
157
+ if (!hasLogsAccess()) {
158
+ await denyToolAccess("read_logs", data);
159
+ return;
160
+ }
161
+ await readLogs(data.args.pageNumber, data);
162
+ return;
163
+ }
164
+ if (data.function_name === "tail_logs") {
165
+ if (!hasLogsAccess()) {
166
+ await denyToolAccess("tail_logs", data);
167
+ return;
168
+ }
169
+ await tailLogs(data.args.n, data);
170
+ return;
171
+ }
172
+ if (data.function_name === "grep_logs") {
173
+ if (!hasLogsAccess()) {
174
+ await denyToolAccess("grep_logs", data);
175
+ return;
176
+ }
177
+ await grepLogs(data.args.pattern, data.args.before, data.args.after, data);
178
+ return;
179
+ }
180
+ if (data.function_name === "get_recent_errors") {
181
+ if (!hasLogsAccess()) {
182
+ await denyToolAccess("get_recent_errors", data);
183
+ return;
184
+ }
185
+ await getRecentErrors(data.args.n, data);
186
+ return;
187
+ }
188
+ }
189
+ // trimmed - imp msgs
190
+ // visible - shown
191
+ // chatresponses - all
192
+ // add non-progress responses to trimmedChats
193
+ // @todo this is where the messages get trimmed
194
+ // if (data.type !== "progress") {
195
+ // setTrimmedChats((prevTrimmed) => {
196
+ // const updated = [...prevTrimmed, data];
197
+ // // update visible chats with all trimmed messages
198
+ // setVisibleChats(updated);
199
+ // return updated;
200
+ // });
201
+ // }
202
+ if (data.type === "response") {
203
+ try {
204
+ let messages = data.data.messages ? data.data.messages : [];
205
+ messages = mapStoredMessagesToChatMessages(messages);
206
+ // @todo log response maybe
207
+ // @todo save the state of the graph as well
208
+ setChatResponseMessages((prev) => [...prev, ...messages]);
209
+ if (data.data.sender === "answerNode") {
210
+ setIsLoading(false);
211
+ setTrimmedChats(oldMessages => {
212
+ const updated = [...oldMessages, ...messages];
213
+ setVisibleChats(updated);
214
+ return updated;
215
+ // logd(`____ Logging response from answernode: ${JSON.stringify(data.data)}`)
216
+ // logd(`____ Logging trimmed messages: ${JSON.stringify(messages)}`)
217
+ });
218
+ }
219
+ if (data.data.sender === "userNode") {
220
+ setIsLoading(false);
221
+ }
222
+ if (data.data.sender === "toolNode") {
223
+ if (messages.length > 0 &&
224
+ messages[messages.length - 1].content
225
+ .toLowerCase()
226
+ .indexOf("reflection") >= 0) {
227
+ setVisibleChats((prev) => [...prev, ...messages]);
228
+ }
229
+ }
230
+ if (data.data.sender !== "toolNode") {
231
+ setVisibleChats((prev) => [...prev, ...messages]);
232
+ }
233
+ logd(`LOGGING RESPONSE SENDER: ${data.data.sender}`);
234
+ }
235
+ catch (err) {
236
+ // @todo log error maybe
237
+ }
238
+ }
239
+ if (
240
+ // data.type === "response" ||
241
+ data.type === "error" ||
242
+ data.type === "ask_user") {
243
+ setIsLoading(false);
244
+ }
245
+ }
246
+ catch (error) {
247
+ console.warn("WebSocket message handling warning:", error);
248
+ return;
249
+ }
250
+ };
251
+ socket.onerror = (error) => {
252
+ console.error(`Web Socket connection error, please retry`, error);
253
+ setConnectionError("Web Socket connection error, please retry");
254
+ setIsConnected(false);
255
+ setIsLoading(false);
256
+ process.exit();
257
+ };
258
+ // if (!isControlRPressed) {
259
+ // socket.onclose = () => {
260
+ // console.warn("AI chat closed");
261
+ // setConnectionError("AI chat closed");
262
+ // setIsConnected(false);
263
+ // setIsLoading(false);
264
+ // process.exit();
265
+ // };
266
+ // }
267
+ }, [url, authKey]);
268
+ const sendQuery = useCallback((messages, architecture, logs, planningDoc) => {
269
+ const socket = socketRef.current;
270
+ if (socket && socket.readyState === WebSocket.OPEN) {
271
+ setIsLoading(true);
272
+ // const payload = state
273
+ // ? { type: "query", socketId, logs, query, state }
274
+ // : { type: "query", socketId, logs, query };
275
+ const md = getProjectMetadata();
276
+ const payload = {
277
+ type: "query",
278
+ authKey,
279
+ // @todo-critical @todo-hardcode serviceId
280
+ serviceId: md?.window_id,
281
+ userQuery: {
282
+ messages: mapChatMessagesToStoredMessages(messages),
283
+ // architecture: "id: 1764156085616 service_name: oncall backend service_description: this is api backend to the oncall project. written in typescript available_data: - codebase - logs",
284
+ architecture: architecture,
285
+ logs,
286
+ planningDoc: "",
287
+ },
288
+ planningDoc,
289
+ };
290
+ socket.send(JSON.stringify(payload));
291
+ }
292
+ else {
293
+ setConnectionError("WebSocket not connected");
294
+ throw new Error("Cannot send the message: Web socket not connected");
295
+ }
296
+ }, [socketId]);
297
+ // Clean up on unmount
298
+ useEffect(() => {
299
+ return () => {
300
+ if (socketRef.current) {
301
+ socketRef.current.close();
302
+ }
303
+ };
304
+ }, []);
305
+ async function grepSearch(searchTerm, data) {
306
+ const results = await ripgrepSearch(searchTerm);
307
+ await postToolCallResult(data, results, setChatResponseMessages);
308
+ }
309
+ async function readLogs(pageNumber, data) {
310
+ logd(`Triggered readLogs: ${pageNumber}`);
311
+ pageNumber = parseInt(pageNumber.toString());
312
+ const lines = rawLogData
313
+ .getLogs()
314
+ .split("\n")
315
+ .slice(-50 * pageNumber)
316
+ .join("\n");
317
+ logd(`Triggered readLogs - Posting result: ${lines.length}`);
318
+ await postToolCallResult(data, lines, setChatResponseMessages);
319
+ logd(`Triggered readLogs - done Posting result`);
320
+ }
321
+ async function tailLogs(n, data) {
322
+ try {
323
+ logd(`Triggered tailLogs: ${n}`);
324
+ n = parseInt(n.toString());
325
+ if (Number.isNaN(n) || n <= 0) {
326
+ await postToolCallResult(data, "Invalid value for n. Please provide a positive number of log lines to fetch.", setChatResponseMessages);
327
+ return;
328
+ }
329
+ const tail = rawLogData.getTailLogs(n);
330
+ logd(`Triggered tailLogs - Posting result: ${tail.length}`);
331
+ await postToolCallResult(data, tail, setChatResponseMessages);
332
+ logd(`Triggered tailLogs - done Posting result`);
333
+ }
334
+ catch (error) {
335
+ logd(`Triggered tailLogs - error: ${JSON.stringify(error)}`);
336
+ await postToolCallResult(data, "Failed to fetch tail logs from CLI.", setChatResponseMessages);
337
+ }
338
+ }
339
+ async function grepLogs(pattern, before, after, data) {
340
+ try {
341
+ logd(`Triggered grepLogs: pattern=${pattern}, before=${before}, after=${after}`);
342
+ if (!pattern || !pattern.trim()) {
343
+ await postToolCallResult(data, "Invalid pattern for grep_logs. Please provide a non-empty pattern.", setChatResponseMessages);
344
+ return;
345
+ }
346
+ const beforeCount = before !== undefined ? parseInt(before.toString()) : 5;
347
+ const afterCount = after !== undefined ? parseInt(after.toString()) : 5;
348
+ const result = rawLogData.getGrepLogs(pattern, beforeCount, afterCount);
349
+ await postToolCallResult(data, result, setChatResponseMessages);
350
+ logd(`Triggered grepLogs - done Posting result of length ${result.length}`);
351
+ }
352
+ catch (error) {
353
+ logd(`Triggered grepLogs - error: ${JSON.stringify(error)}`);
354
+ await postToolCallResult(data, "Failed to search logs with grep_logs.", setChatResponseMessages);
355
+ }
356
+ }
357
+ async function getRecentErrors(n, data) {
358
+ try {
359
+ logd(`Triggered getRecentErrors: n=${n}`);
360
+ n = parseInt(n.toString());
361
+ if (Number.isNaN(n) || n <= 0) {
362
+ await postToolCallResult(data, "Invalid value for n. Number Provided :" + n.toString(), setChatResponseMessages);
363
+ return;
364
+ }
365
+ const result = rawLogData.getRecentErrors(n);
366
+ await postToolCallResult(data, result, setChatResponseMessages);
367
+ logd(`Triggered getRecentErrors - done Posting result of length ${result.length}`);
368
+ }
369
+ catch (error) {
370
+ logd(`Triggered getRecentErrors - error: ${JSON.stringify(error)}`);
371
+ await postToolCallResult(data, "Failed to fetch recent error logs.", setChatResponseMessages);
372
+ }
373
+ }
374
+ async function postToolCallResult(data, result, setChatResponseMessages) {
375
+ try {
376
+ await toolFunctionCall(data?.tool_call_id, result, data?.args, "tool_function_call");
377
+ }
378
+ catch (error) {
379
+ logd(`Triggered readLogs - failer podting: ${JSON.stringify(error)}`);
380
+ // setChatResponseMessages((prev) => [
381
+ // ...prev,
382
+ // error?.response?.message || "Error, please try again",
383
+ // ]);
384
+ }
385
+ }
386
+ async function denyToolAccess(functionName, data) {
387
+ const serviceId = getServiceId();
388
+ const message = `No Access to execute ${functionName}. with the serviceId of ${serviceId ?? "unknown"}.`;
389
+ await postToolCallResult(data, message, setChatResponseMessages);
390
+ }
391
+ return {
392
+ connectWebSocket,
393
+ socketId,
394
+ sendQuery,
395
+ chatResponseMessages: visibleChats,
396
+ setChatResponseMessages: setVisibleChats,
397
+ setTrimmedChats,
398
+ isConnected,
399
+ connectionError,
400
+ isLoading,
401
+ API_KEY,
402
+ setSocketId,
403
+ setIsConnected,
404
+ socket: socketRef.current,
405
+ setIsLoading,
406
+ setShowControlR,
407
+ showControlR,
408
+ setCompleteChatHistory: setChatResponseMessages,
409
+ };
410
+ }
411
+ //# sourceMappingURL=useWebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWebSocket.js","sourceRoot":"","sources":["../useWebSocket.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export function checkVersionCompatibility(forceCheck?: boolean): Promise<boolean>;
2
+ export function checkVersionAndExit(): Promise<void>;
@@ -0,0 +1,124 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import os from "os";
4
+ import { fileURLToPath } from "url";
5
+ import axios from "axios";
6
+ const ONCALL_DIR = path.join(os.homedir(), ".oncall");
7
+ const VERSION_CACHE_FILE = path.join(ONCALL_DIR, "version-cache.json");
8
+ const API_BASE_URL = "http://api.oncall.build/v2/api";
9
+ const CACHE_DURATION_MS = 24 * 60 * 60 * 1000;
10
+ function compareVersions(v1, v2) {
11
+ const parts1 = v1.split(".").map(Number);
12
+ const parts2 = v2.split(".").map(Number);
13
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
14
+ const part1 = parts1[i] || 0;
15
+ const part2 = parts2[i] || 0;
16
+ if (part1 < part2)
17
+ return -1;
18
+ if (part1 > part2)
19
+ return 1;
20
+ }
21
+ return 0;
22
+ }
23
+ function isVersionDeprecated(currentVersion, minimumVersion) {
24
+ return compareVersions(currentVersion, minimumVersion) < 0;
25
+ }
26
+ function readVersionCache() {
27
+ if (fs.existsSync(VERSION_CACHE_FILE)) {
28
+ const content = fs.readFileSync(VERSION_CACHE_FILE, "utf8");
29
+ return JSON.parse(content);
30
+ }
31
+ return null;
32
+ }
33
+ function ensureOnCallDir() {
34
+ if (!fs.existsSync(ONCALL_DIR)) {
35
+ fs.mkdirSync(ONCALL_DIR, { recursive: true });
36
+ }
37
+ }
38
+ function writeVersionCache(cache) {
39
+ ensureOnCallDir();
40
+ fs.writeFileSync(VERSION_CACHE_FILE, JSON.stringify(cache, null, 2));
41
+ }
42
+ function shouldCheckVersion() {
43
+ const cache = readVersionCache();
44
+ if (!cache || !cache.lastCheck) {
45
+ return true;
46
+ }
47
+ const now = Date.now();
48
+ const timeSinceLastCheck = now - cache.lastCheck;
49
+ return timeSinceLastCheck >= CACHE_DURATION_MS;
50
+ }
51
+ async function fetchMinimumVersion() {
52
+ try {
53
+ const response = await axios.get(`${API_BASE_URL}/health/minimum-cli-version`);
54
+ if (response.data?.success && response.data?.minimumCliVersion) {
55
+ return response.data.minimumCliVersion;
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.warn("Failed to check CLI version:", error instanceof Error ? error.message : "Unknown error");
60
+ }
61
+ return null;
62
+ }
63
+ function getCurrentVersion() {
64
+ try {
65
+ const __filename = fileURLToPath(import.meta.url);
66
+ const __dirname = path.dirname(__filename);
67
+ const possiblePaths = [
68
+ path.resolve(__dirname, "../package.json"),
69
+ path.resolve(__dirname, "../../package.json"),
70
+ ];
71
+ for (const pkgPath of possiblePaths) {
72
+ if (fs.existsSync(pkgPath)) {
73
+ const pkgJson = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
74
+ return pkgJson.version || "0.0.0";
75
+ }
76
+ }
77
+ return "0.0.0";
78
+ }
79
+ catch (error) {
80
+ return "0.0.0";
81
+ }
82
+ }
83
+ function formatDeprecationError(currentVersion, minimumVersion) {
84
+ return `
85
+ ⚠️ CLI VERSION DEPRECATED
86
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
87
+
88
+ Your current version: ${currentVersion}
89
+ Minimum required version: ${minimumVersion}
90
+
91
+ Please update to the latest version to continue using OnCall CLI.
92
+
93
+ To update, run:
94
+ npm install -g oncall-cli@latest
95
+
96
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
97
+ `;
98
+ }
99
+ export async function checkVersionCompatibility(forceCheck = false) {
100
+ const currentVersion = getCurrentVersion();
101
+ const cache = readVersionCache();
102
+ if (!forceCheck && cache?.lastCheck && !shouldCheckVersion()) {
103
+ return true;
104
+ }
105
+ const minimumVersion = await fetchMinimumVersion();
106
+ if (!minimumVersion) {
107
+ return true;
108
+ }
109
+ writeVersionCache({
110
+ lastCheck: Date.now(),
111
+ });
112
+ if (isVersionDeprecated(currentVersion, minimumVersion)) {
113
+ console.error(formatDeprecationError(currentVersion, minimumVersion));
114
+ return false;
115
+ }
116
+ return true;
117
+ }
118
+ export async function checkVersionAndExit() {
119
+ const isCompatible = await checkVersionCompatibility(true);
120
+ if (!isCompatible) {
121
+ process.exit(1);
122
+ }
123
+ }
124
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../utils/version-check.js"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getContextLines(fileName: string, lineNumber: number, before?: number, after?: number): string;
package/dist/utils.js ADDED
@@ -0,0 +1,22 @@
1
+ import * as fs from "fs";
2
+ //parameter to redis
3
+ export function getContextLines(fileName, lineNumber, before = 30, after = 30) {
4
+ const lines = fs.readFileSync(fileName, "utf-8").split("\n");
5
+ const start = Math.max(0, lineNumber - before - 1);
6
+ const end = Math.min(lines.length, lineNumber + after);
7
+ return lines.slice(start, end).join("\n");
8
+ }
9
+ //redis connection
10
+ // const redisClient = createClient({
11
+ // url: `rediss://${config.redis_username}:${config.redis_password}@${config.redis_host}:${config.redis_port}`,
12
+ // socket: { tls: true },
13
+ // });
14
+ // redisClient.on("error", (err) => {
15
+ // console.error("Redis Client Error", err);
16
+ // });
17
+ // redisClient.on("connect", () => {
18
+ // console.log("Redis Client Connected");
19
+ // });
20
+ // redisClient.connect();
21
+ // export default redisClient;
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,oBAAoB;AACpB,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,UAAkB,EAClB,SAAiB,EAAE,EACnB,QAAgB,EAAE;IAElB,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,kBAAkB;AAClB,qCAAqC;AACrC,iHAAiH;AACjH,2BAA2B;AAC3B,MAAM;AAEN,qCAAqC;AACrC,8CAA8C;AAC9C,MAAM;AAEN,oCAAoC;AACpC,2CAA2C;AAC3C,MAAM;AAEN,yBAAyB;AAEzB,8BAA8B"}
@@ -0,0 +1,24 @@
1
+ import { AddressInfo } from "net";
2
+ type Logger = Pick<Console, "log" | "info" | "warn" | "error">;
3
+ export interface OnCallWebSocketServerOptions {
4
+ port?: number;
5
+ host?: string;
6
+ logger?: Logger;
7
+ }
8
+ export declare class OnCallWebSocketServer {
9
+ private wss;
10
+ private readonly allProjects;
11
+ private readonly options;
12
+ constructor(options?: OnCallWebSocketServerOptions);
13
+ get address(): AddressInfo | null;
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ private handleServerClose;
17
+ private handleConnection;
18
+ private handleMessage;
19
+ private send;
20
+ private normalizeProjectPayload;
21
+ private upsertProjectRegistration;
22
+ }
23
+ export declare function startOnCallWebSocketServer(options?: OnCallWebSocketServerOptions): Promise<OnCallWebSocketServer>;
24
+ export {};