@misterscan/sesi 1.2.1 → 1.2.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.
@@ -1,252 +1,280 @@
1
- // Sesi Script: sesi_db_chatbot.sesi
2
- // 100% NATIVE, ZERO-HARDCODING DEEP LEARNING CO-PILOT!
3
- // Dynamically indexes the sesi-db knowledge base, trains on-the-fly, and answers queries!
4
-
5
- // ==================================================
6
- // 💬 1. CHOOSE YOUR ADVANCED TECHNICAL QUERY HERE!
7
- // (Test it with custom phrases containing our keywords!)
8
- let queryText = "how do I parse a json string?"
9
- try {
10
- queryText = read_file("query.txt")
11
- } catch (e) {}
12
- // ==================================================
13
-
14
- print "=================================================="
15
- print "🧠 WELCOME TO THE SESI CO-PILOT!"
16
- print "=================================================="
17
-
18
- // Sigmoid math
19
- fn activate(x) {
20
- return 1.0 / (1.0 + exp(0.0 - x))
21
- }
22
-
23
- fn derivative(y) {
24
- return y * (1.0 - y)
25
- }
26
-
27
- // 2. Advanced Bag-of-Words Vectorizer (49 keywords covering all Sesi primitives & built-ins)
28
- fn vectorize(text) {
29
- let words = split(text, " ")
30
-
31
- // Dynamically initialize 49-dimensional vector
32
- let vec = []
33
- let k = 0
34
- while k < 49 {
35
- push(vec, 0.0)
36
- k = k + 1
37
- }
38
-
39
- let w = 0
40
- while w < len(words) {
41
- let word = words[w]
42
- if word == "print" { vec[0] = 1.0 }
43
- if word == "str" { vec[1] = 1.0 }
44
- if word == "type" { vec[2] = 1.0 }
45
- if word == "num" { vec[3] = 1.0 }
46
- if word == "bool" { vec[4] = 1.0 }
47
- if word == "json" { vec[5] = 1.0 }
48
- if word == "from_json" { vec[6] = 1.0 }
49
- if word == "to_json" { vec[7] = 1.0 }
50
- if word == "len" { vec[8] = 1.0 }
51
- if word == "file" { vec[9] = 1.0 }
52
- if word == "read_file" { vec[10] = 1.0 }
53
- if word == "write_file" { vec[11] = 1.0 }
54
- if word == "dir" { vec[12] = 1.0 }
55
- if word == "list_dir" { vec[13] = 1.0 }
56
- if word == "make_dir" { vec[14] = 1.0 }
57
- if word == "exp" { vec[15] = 1.0 }
58
- if word == "random" { vec[16] = 1.0 }
59
- if word == "let" { vec[17] = 1.0 }
60
- if word == "const" { vec[18] = 1.0 }
61
- if word == "fn" { vec[19] = 1.0 }
62
- if word == "if" { vec[20] = 1.0 }
63
- if word == "else" { vec[21] = 1.0 }
64
- if word == "while" { vec[22] = 1.0 }
65
- if word == "for" { vec[23] = 1.0 }
66
- if word == "return" { vec[24] = 1.0 }
67
- if word == "break" { vec[25] = 1.0 }
68
- if word == "continue" { vec[26] = 1.0 }
69
- if word == "try" { vec[27] = 1.0 }
70
- if word == "catch" { vec[28] = 1.0 }
71
- if word == "import" { vec[29] = 1.0 }
72
- if word == "export" { vec[30] = 1.0 }
73
- if word == "memory" { vec[31] = 1.0 }
74
- if word == "sleep" { vec[32] = 1.0 }
75
- if word == "now" { vec[33] = 1.0 }
76
- if word == "model" { vec[34] = 1.0 }
77
- if word == "image" { vec[35] = 1.0 }
78
- if word == "structured_output" { vec[36] = 1.0 }
79
- if word == "tool_call" { vec[37] = 1.0 }
80
- if word == "spawn" { vec[38] = 1.0 }
81
- if word == "exec" { vec[39] = 1.0 }
82
- if word == "time" { vec[40] = 1.0 }
83
- if word == "range" { vec[41] = 1.0 }
84
- if word == "push" { vec[42] = 1.0 }
85
- if word == "pop" { vec[43] = 1.0 }
86
- if word == "join" { vec[44] = 1.0 }
87
- if word == "split" { vec[45] = 1.0 }
88
- if word == "keys" { vec[46] = 1.0 }
89
- if word == "values" { vec[47] = 1.0 }
90
- if word == "array" { vec[48] = 1.0 }
91
- w = w + 1
92
- }
93
- return vec
94
- }
95
-
96
- let db_files = list_dir("sesi-db")
97
- let num_classes = len(db_files)
98
-
99
- if num_classes == 0 {
100
- print "⚠️ Database is empty! Run 'sesi indexer.sesi' first!"
101
- } else {
102
- print "✅ Found " + str(num_classes) + " knowledge documents in sesi-db!"
103
-
104
- let database = []
105
- let inputs = []
106
- let targets = []
107
-
108
- let i = 0
109
- while i < num_classes {
110
- let f = db_files[i]
111
- let raw = read_file("sesi-db/" + f)
112
- let parsed = from_json(raw)
113
-
114
- // Combine summary and rules for training text
115
- let doc_text = parsed["summary"] + " " + parsed["key_rules"]
116
- let vec = vectorize(doc_text)
117
- push(inputs, vec)
118
-
119
- // Create one-hot targets dynamically
120
- let t = []
121
- let t_idx = 0
122
- while t_idx < num_classes {
123
- if t_idx == i {
124
- push(t, 1.0)
125
- } else {
126
- push(t, 0.0)
127
- }
128
- t_idx = t_idx + 1
129
- }
130
- push(targets, t)
131
- push(database, parsed)
132
-
133
- i = i + 1
134
- }
135
-
136
- // 4. Dynamic Multi-Class Weights Matrix Initialization
137
- let weights = []
138
- let biases = []
139
-
140
- let c = 0
141
- while c < num_classes {
142
- // Initialize random-seeded weights between -0.2 and 0.2
143
- let w_row = []
144
- let k = 0
145
- while k < 49 {
146
- let r_val = (random() * 0.4) - 0.2
147
- push(w_row, r_val)
148
- k = k + 1
149
- }
150
- push(weights, w_row)
151
- push(biases, 0.0)
152
- c = c + 1
153
- }
154
-
155
- // 5. Run dynamic multi-class gradient descent training loop (2,000 epochs)
156
- let lr = 0.5
157
- let epoch = 1
158
- while epoch <= 2000 {
159
- let c = 0
160
- while c < num_classes {
161
- let x = inputs[c]
162
- let t = targets[c]
163
-
164
- // Forward propagation (dynamic dot product)
165
- let sum = 0.0
166
- let w_row = weights[c]
167
- let k = 0
168
- while k < 49 {
169
- sum = sum + (x[k] * w_row[k])
170
- k = k + 1
171
- }
172
- let o = activate(sum + biases[c])
173
-
174
- // Backpropagation delta
175
- let delta = (t[c] - o) * derivative(o)
176
-
177
- // Synaptic updates
178
- k = 0
179
- while k < 49 {
180
- w_row[k] = w_row[k] + (lr * delta * x[k])
181
- k = k + 1
182
- }
183
- biases[c] = biases[c] + (lr * delta)
184
-
185
- c = c + 1
186
- }
187
- epoch = epoch + 1
188
- }
189
-
190
- let query_vec = vectorize(queryText)
191
-
192
- // Forward propagation on user query across all dynamic classes
193
- let outputs = []
194
- let j = 0
195
- while j < num_classes {
196
- let sum = 0.0
197
- let w_row = weights[j]
198
- let k = 0
199
- while k < 49 {
200
- sum = sum + (query_vec[k] * w_row[k])
201
- k = k + 1
202
- }
203
- let o = activate(sum + biases[j])
204
- push(outputs, o)
205
- j = j + 1
206
- }
207
-
208
- // Determine class index with highest score
209
- let best_class = 0
210
- let max_score = -1.0
211
- let j = 0
212
- while j < num_classes {
213
- if outputs[j] > max_score {
214
- max_score = outputs[j]
215
- best_class = j
216
- }
217
- j = j + 1
218
- }
219
-
220
- // 7. Output Dynamic Recommendation with Confidence Thresholding
221
- print "--------------------------------------------------"
222
- print "🤖 SESI CO-PILOT RESPONDING:"
223
- print "--------------------------------------------------"
224
- if max_score < 0.40 {
225
- print "🤔 Sesi's native synapses evaluated this query with low confidence: " + str(max_score)
226
- print " It seems your question does not contain any Sesi keywords in our vocabulary!"
227
- print " Please try asking about: 'print', 'str', 'files', 'json', 'model', 'image', or 'random'!"
228
- } else {
229
- let rec = database[best_class]
230
- let docs_list = list_dir("docs")
231
- let sesiDocs = ""
232
- let d = 0
233
- while d < len(docs_list) {
234
- let f_name = docs_list[d]
235
- let parts = split(f_name, ".")
236
- let ext = parts[len(parts) - 1]
237
-
238
- if ext == "md" {
239
- let doc_content = read_file("docs/" + f_name)
240
- sesiDocs = sesiDocs + "\n\n=== DOCUMENT: " + f_name + " ===\n" + doc_content
241
- }
242
- d = d + 1
243
- }
244
-
245
- let ragPrompt = "Sesi Official Reference Documentation:\n" + sesiDocs + "\n\nUser Query: " + queryText + "\n\nMatched Context from Sesi DB:\nSummary: " + rec["summary"] + "\nKey Rules: " + rec["key_rules"] + "\n\nInstructions: Write a direct, beautiful, highly conversational response to the user's question using strictly the matched rules. Walk them through Sesi's syntax with direct examples. Be helpful and concise. Do not mention that you got this from a database—act as a supportive code copilot. All responses must not anticipate a future response."
246
-
247
- let generated_response = model("gemini-3.1-flash-lite") {"temperature": 0.3, "max_tokens": 200} {ragPrompt}
248
-
249
- print "--------------------------------------------------"
250
- print generated_response
251
- print "--------------------------------------------------"
252
- }
1
+ // Dynamically indexes the sesi-db knowledge base, trains on-the-fly, and answers queries!
2
+
3
+ // ==================================================
4
+ // 💬 1. CHOOSE YOUR ADVANCED TECHNICAL QUERY HERE!
5
+ // (Test it with custom phrases containing our keywords!)
6
+ let queryText = "how do I parse a json string?"
7
+ try {
8
+ queryText = read_file("query.txt")
9
+ } catch (e) {}
10
+ // ==================================================
11
+
12
+ print "=================================================="
13
+ print "🧠 WELCOME TO THE SESI CO-PILOT!"
14
+ print "=================================================="
15
+
16
+
17
+ // Maintains context across multiple queries so the co-pilot remembers what you previously asked.
18
+ memory chatHistory {"You are the Sesi Co-Pilot, an expert assistant for the Sesi programming language. You help users write correct, idiomatic Sesi code. Be concise and conversational."}
19
+
20
+ // Load persisted history from disk if it exists
21
+ try {
22
+ chatHistory = read_file("sesi-db/chat_history.txt")
23
+ print "📝 Loaded previous conversation context."
24
+ } catch (e) {}
25
+
26
+ // Auto-summarize when history gets too long (saves tokens)
27
+ fn summarizeHistory() {
28
+ let summary = model("gemini-3.1-flash-lite") {temperature: 0, max_tokens: 300} {"Summarize this conversation history into key facts and context. Be very concise: " chatHistory}
29
+ chatHistory = "Previous conversation summary: " + summary
30
+ print "🗜️ Memory auto-summarized to save tokens."
31
+ }
32
+
33
+ // Sigmoid math
34
+ fn activate(x) {
35
+ return 1.0 / (1.0 + exp(0.0 - x))
36
+ }
37
+
38
+ fn derivative(y) {
39
+ return y * (1.0 - y)
40
+ }
41
+
42
+ // 2. Advanced Bag-of-Words Vectorizer (49 keywords covering all Sesi primitives & built-ins)
43
+ fn vectorize(text) {
44
+ let words = split(text, " ")
45
+
46
+ // Dynamically initialize 49-dimensional vector
47
+ let vec = []
48
+ let k = 0
49
+ while k < 49 {
50
+ push(vec, 0.0)
51
+ k = k + 1
52
+ }
53
+
54
+ let w = 0
55
+ while w < len(words) {
56
+ let word = words[w]
57
+ if word == "print" { vec[0] = 1.0 }
58
+ if word == "str" { vec[1] = 1.0 }
59
+ if word == "type" { vec[2] = 1.0 }
60
+ if word == "num" { vec[3] = 1.0 }
61
+ if word == "bool" { vec[4] = 1.0 }
62
+ if word == "json" { vec[5] = 1.0 }
63
+ if word == "from_json" { vec[6] = 1.0 }
64
+ if word == "to_json" { vec[7] = 1.0 }
65
+ if word == "len" { vec[8] = 1.0 }
66
+ if word == "file" { vec[9] = 1.0 }
67
+ if word == "read_file" { vec[10] = 1.0 }
68
+ if word == "write_file" { vec[11] = 1.0 }
69
+ if word == "dir" { vec[12] = 1.0 }
70
+ if word == "list_dir" { vec[13] = 1.0 }
71
+ if word == "make_dir" { vec[14] = 1.0 }
72
+ if word == "exp" { vec[15] = 1.0 }
73
+ if word == "random" { vec[16] = 1.0 }
74
+ if word == "let" { vec[17] = 1.0 }
75
+ if word == "const" { vec[18] = 1.0 }
76
+ if word == "fn" { vec[19] = 1.0 }
77
+ if word == "if" { vec[20] = 1.0 }
78
+ if word == "else" { vec[21] = 1.0 }
79
+ if word == "while" { vec[22] = 1.0 }
80
+ if word == "for" { vec[23] = 1.0 }
81
+ if word == "return" { vec[24] = 1.0 }
82
+ if word == "break" { vec[25] = 1.0 }
83
+ if word == "continue" { vec[26] = 1.0 }
84
+ if word == "try" { vec[27] = 1.0 }
85
+ if word == "catch" { vec[28] = 1.0 }
86
+ if word == "import" { vec[29] = 1.0 }
87
+ if word == "export" { vec[30] = 1.0 }
88
+ if word == "memory" { vec[31] = 1.0 }
89
+ if word == "sleep" { vec[32] = 1.0 }
90
+ if word == "now" { vec[33] = 1.0 }
91
+ if word == "model" { vec[34] = 1.0 }
92
+ if word == "image" { vec[35] = 1.0 }
93
+ if word == "structured_output" { vec[36] = 1.0 }
94
+ if word == "tool_call" { vec[37] = 1.0 }
95
+ if word == "spawn" { vec[38] = 1.0 }
96
+ if word == "exec" { vec[39] = 1.0 }
97
+ if word == "time" { vec[40] = 1.0 }
98
+ if word == "range" { vec[41] = 1.0 }
99
+ if word == "push" { vec[42] = 1.0 }
100
+ if word == "pop" { vec[43] = 1.0 }
101
+ if word == "join" { vec[44] = 1.0 }
102
+ if word == "split" { vec[45] = 1.0 }
103
+ if word == "keys" { vec[46] = 1.0 }
104
+ if word == "values" { vec[47] = 1.0 }
105
+ if word == "array" { vec[48] = 1.0 }
106
+ w = w + 1
107
+ }
108
+ return vec
109
+ }
110
+
111
+ let db_files = list_dir("sesi-db")
112
+ let num_classes = len(db_files)
113
+
114
+ if num_classes == 0 {
115
+ print "⚠️ Database is empty! Run 'sesi indexer.sesi' first!"
116
+ } else {
117
+ print "✅ Found " + str(num_classes) + " knowledge documents in sesi-db!"
118
+
119
+ let database = []
120
+ let inputs = []
121
+ let targets = []
122
+
123
+ let i = 0
124
+ while i < num_classes {
125
+ let f = db_files[i]
126
+ let raw = read_file("sesi-db/" + f)
127
+ let parsed = from_json(raw)
128
+
129
+ // Combine summary and rules for training text
130
+ let doc_text = parsed["summary"] + " " + parsed["key_rules"]
131
+ let vec = vectorize(doc_text)
132
+ push(inputs, vec)
133
+
134
+ // Create one-hot targets dynamically
135
+ let t = []
136
+ let t_idx = 0
137
+ while t_idx < num_classes {
138
+ if t_idx == i {
139
+ push(t, 1.0)
140
+ } else {
141
+ push(t, 0.0)
142
+ }
143
+ t_idx = t_idx + 1
144
+ }
145
+ push(targets, t)
146
+ push(database, parsed)
147
+
148
+ i = i + 1
149
+ }
150
+
151
+ // 4. Dynamic Multi-Class Weights Matrix Initialization
152
+ let weights = []
153
+ let biases = []
154
+
155
+ let c = 0
156
+ while c < num_classes {
157
+ // Initialize random-seeded weights between -0.2 and 0.2
158
+ let w_row = []
159
+ let k = 0
160
+ while k < 49 {
161
+ let r_val = (random() * 0.4) - 0.2
162
+ push(w_row, r_val)
163
+ k = k + 1
164
+ }
165
+ push(weights, w_row)
166
+ push(biases, 0.0)
167
+ c = c + 1
168
+ }
169
+
170
+ // 5. Run dynamic multi-class gradient descent training loop (2,000 epochs)
171
+ let lr = 0.5
172
+ let epoch = 1
173
+ while epoch <= 2000 {
174
+ let c = 0
175
+ while c < num_classes {
176
+ let x = inputs[c]
177
+ let t = targets[c]
178
+
179
+ // Forward propagation (dynamic dot product)
180
+ let sum = 0.0
181
+ let w_row = weights[c]
182
+ let k = 0
183
+ while k < 49 {
184
+ sum = sum + (x[k] * w_row[k])
185
+ k = k + 1
186
+ }
187
+ let o = activate(sum + biases[c])
188
+
189
+ // Backpropagation delta
190
+ let delta = (t[c] - o) * derivative(o)
191
+
192
+ // Synaptic updates
193
+ k = 0
194
+ while k < 49 {
195
+ w_row[k] = w_row[k] + (lr * delta * x[k])
196
+ k = k + 1
197
+ }
198
+ biases[c] = biases[c] + (lr * delta)
199
+
200
+ c = c + 1
201
+ }
202
+ epoch = epoch + 1
203
+ }
204
+
205
+ let query_vec = vectorize(queryText)
206
+
207
+ // Forward propagation on user query across all dynamic classes
208
+ let outputs = []
209
+ let j = 0
210
+ while j < num_classes {
211
+ let sum = 0.0
212
+ let w_row = weights[j]
213
+ let k = 0
214
+ while k < 49 {
215
+ sum = sum + (query_vec[k] * w_row[k])
216
+ k = k + 1
217
+ }
218
+ let o = activate(sum + biases[j])
219
+ push(outputs, o)
220
+ j = j + 1
221
+ }
222
+
223
+ // Determine class index with highest score
224
+ let best_class = 0
225
+ let max_score = -1.0
226
+ let j = 0
227
+ while j < num_classes {
228
+ if outputs[j] > max_score {
229
+ max_score = outputs[j]
230
+ best_class = j
231
+ }
232
+ j = j + 1
233
+ }
234
+
235
+ // 7. Output Dynamic Recommendation with Confidence Thresholding
236
+ print "--------------------------------------------------"
237
+ print "🤖 SESI CO-PILOT RESPONDING:"
238
+ print "--------------------------------------------------"
239
+ if max_score < 0.40 {
240
+ print "🤔 Sesi's native synapses evaluated this query with low confidence: " + str(max_score)
241
+ print " It seems your question does not contain any Sesi keywords in our vocabulary!"
242
+ print " Please try asking about: 'print', 'str', 'files', 'json', 'model', 'image', or 'random'!"
243
+ } else {
244
+ let rec = database[best_class]
245
+ let docs_list = list_dir("docs")
246
+ let sesiDocs = ""
247
+ let d = 0
248
+ while d < len(docs_list) {
249
+ let f_name = docs_list[d]
250
+ let parts = split(f_name, ".")
251
+ let ext = parts[len(parts) - 1]
252
+
253
+ if ext == "md" {
254
+ let doc_content = read_file("docs/" + f_name)
255
+ sesiDocs = sesiDocs + "\n\n=== DOCUMENT: " + f_name + " ===\n" + doc_content
256
+ }
257
+ d = d + 1
258
+ }
259
+
260
+ // Auto-summarize if history exceeds ~3000 characters
261
+ if len(chatHistory) > 3000 {
262
+ summarizeHistory()
263
+ }
264
+
265
+ let ragPrompt = "Conversation History:\n" + chatHistory + "\n\nSesi Official Reference Documentation:\n" + sesiDocs + "\n\nUser Query: " + queryText + "\n\nMatched Context from Sesi DB:\nSummary: " + rec["summary"] + "\nKey Rules: " + rec["key_rules"] + "\n\nInstructions: Write a direct, beautiful, highly conversational response to the user's question using strictly the matched rules. Be helpful and concise. Do not mention that you got this from a database—act as a supportive code copilot. Reference any relevant prior conversation context when applicable."
266
+
267
+ let generated_response = model("gemini-3.1-flash-lite") {temperature: 0.3, max_tokens: 300} {ragPrompt}
268
+
269
+ // Append this turn to conversational memory
270
+ chatHistory = chatHistory + "\nUser: " + queryText + "\nAssistant: " + generated_response
271
+
272
+ // Persist memory to disk for next session
273
+ try {
274
+ write_file("sesi-db/chat_history.txt", chatHistory)
275
+ } catch (e) {}
276
+
277
+ print "--------------------------------------------------"
278
+ print generated_response
279
+ print "--------------------------------------------------"
280
+ }}
package/main/start.sesi CHANGED
@@ -9,5 +9,5 @@ print "Math check:" a + b
9
9
 
10
10
  // Or jump straight into reasoning tasks
11
11
  let topic = "building a new programming language"
12
- let response = model("gemini-3.1-flash-lite") {"temperature": 0.3} {"Write a motivational 2-sentence intro about" topic}
12
+ let response = model("gemini-3.5-flash") {thinkingLevel: "minimal"} {"Write a motivational 2-sentence intro about" topic}
13
13
  print "Sesi:" response
@@ -6,7 +6,7 @@
6
6
  // ==================================================
7
7
  // 💬 1. CHOOSE YOUR ADVANCED TECHNICAL QUERY HERE!
8
8
  // (Trained keywords: print, str, type, num, bool, json, convert, array, len, file, write, dir, exp, random)
9
- let queryText = "how do i convert json string to an array and print it?"
9
+ let queryText = "how do i convert integer to string?"
10
10
  // ==================================================
11
11
 
12
12
  print "=================================================="
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@misterscan/sesi",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "Sesi: A High-Performance Systems Language",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,8 +16,8 @@
16
16
  "scripts": {
17
17
  "lint": "npx eslint --fix",
18
18
  "build": "tsc",
19
- "dev": "npm run lint &&dotenvx run -- npm run build --watch",
20
- "test": "npx ts-node tests/basic.test.ts && npx ts-node tests/module.test.ts && npx ts-node tests/cache.test.ts && npx ts-node tests/http.test.ts",
19
+ "dev": "npm run lint && dotenvx run -- npm run build --watch",
20
+ "test": "npx ts-node tests/basic.test.ts && npx ts-node tests/module.test.ts && npx ts-node tests/cache.test.ts && npx ts-node tests/http.test.ts && npx ts-node tests/security.test.ts",
21
21
  "test:watch": "npm run lint && npx ts-node tests/basic.test.ts --watch",
22
22
  "build:exe": "node ./scripts/build-binaries.mjs",
23
23
  "msi:eula": "powershell -NoProfile -ExecutionPolicy Bypass -Command \"& 'C:\\Program Files\\WiX Toolset v7.0\\bin\\wix.exe' eula accept wix7\"",
@@ -47,17 +47,17 @@
47
47
  "author": "Misterscan",
48
48
  "license": "MIT",
49
49
  "dependencies": {
50
- "@dotenvx/dotenvx": "1.66.0",
51
- "@dotenvx/dotenvx-ops": "^0.46.1",
52
- "@google/genai": "2.4.0"
50
+ "@dotenvx/dotenvx": "1.69.1",
51
+ "@dotenvx/dotenvx-ops": "0.51.0",
52
+ "@google/genai": "2.6.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@eslint/js": "^10.0.1",
56
- "@types/node": "25.8.0",
56
+ "@types/node": "25.9.1",
57
57
  "eslint": "10.4.0",
58
58
  "globals": "^17.6.0",
59
59
  "rcedit": "^5.0.2",
60
60
  "typescript": "6.0.3",
61
- "typescript-eslint": "^8.59.3"
61
+ "typescript-eslint": "8.60.0"
62
62
  }
63
63
  }