prab-cli 1.1.0 → 1.2.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.
- package/dist/index.js +85 -1
- package/dist/lib/chat-handler.js +108 -23
- package/dist/lib/config.js +12 -12
- package/dist/lib/context.js +7 -12
- package/dist/lib/groq-models.js +3 -3
- package/dist/lib/groq.js +6 -6
- package/dist/lib/safety.js +29 -34
- package/dist/lib/tracker.js +74 -72
- package/dist/lib/ui.js +219 -101
- package/package.json +25 -3
package/dist/lib/tracker.js
CHANGED
|
@@ -12,14 +12,14 @@ const os_1 = __importDefault(require("os"));
|
|
|
12
12
|
*/
|
|
13
13
|
class SuperTracker {
|
|
14
14
|
constructor() {
|
|
15
|
-
this.logDir = path_1.default.join(os_1.default.homedir(),
|
|
15
|
+
this.logDir = path_1.default.join(os_1.default.homedir(), ".config", "groq-cli-tool", "logs");
|
|
16
16
|
this.sessionId = this.generateSessionId();
|
|
17
17
|
this.logFile = path_1.default.join(this.logDir, `session-${this.sessionId}.jsonl`);
|
|
18
18
|
this.ensureLogDir();
|
|
19
19
|
}
|
|
20
20
|
generateSessionId() {
|
|
21
21
|
const now = new Date();
|
|
22
|
-
return `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2,
|
|
22
|
+
return `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
|
|
23
23
|
}
|
|
24
24
|
ensureLogDir() {
|
|
25
25
|
if (!fs_1.default.existsSync(this.logDir)) {
|
|
@@ -30,8 +30,8 @@ class SuperTracker {
|
|
|
30
30
|
* Write a log entry to file (with immediate flush)
|
|
31
31
|
*/
|
|
32
32
|
write(entry) {
|
|
33
|
-
const line = JSON.stringify(entry) +
|
|
34
|
-
const fd = fs_1.default.openSync(this.logFile,
|
|
33
|
+
const line = JSON.stringify(entry) + "\n";
|
|
34
|
+
const fd = fs_1.default.openSync(this.logFile, "a");
|
|
35
35
|
fs_1.default.writeSync(fd, line);
|
|
36
36
|
fs_1.default.fsyncSync(fd);
|
|
37
37
|
fs_1.default.closeSync(fd);
|
|
@@ -42,10 +42,10 @@ class SuperTracker {
|
|
|
42
42
|
sessionStart(model, toolCount) {
|
|
43
43
|
this.write({
|
|
44
44
|
timestamp: new Date().toISOString(),
|
|
45
|
-
level:
|
|
46
|
-
event:
|
|
45
|
+
level: "info",
|
|
46
|
+
event: "SESSION_START",
|
|
47
47
|
message: `Session started with model: ${model}`,
|
|
48
|
-
data: { model, toolCount, sessionId: this.sessionId }
|
|
48
|
+
data: { model, toolCount, sessionId: this.sessionId },
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
@@ -54,10 +54,10 @@ class SuperTracker {
|
|
|
54
54
|
promptReceived(prompt) {
|
|
55
55
|
this.write({
|
|
56
56
|
timestamp: new Date().toISOString(),
|
|
57
|
-
level:
|
|
58
|
-
event:
|
|
59
|
-
message: `User: "${prompt.length > 100 ? prompt.substring(0, 100) +
|
|
60
|
-
data: { prompt, length: prompt.length }
|
|
57
|
+
level: "info",
|
|
58
|
+
event: "PROMPT_RECEIVED",
|
|
59
|
+
message: `User: "${prompt.length > 100 ? prompt.substring(0, 100) + "..." : prompt}"`,
|
|
60
|
+
data: { prompt, length: prompt.length },
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
@@ -66,10 +66,10 @@ class SuperTracker {
|
|
|
66
66
|
apiRequest(model, messageCount, toolCount) {
|
|
67
67
|
this.write({
|
|
68
68
|
timestamp: new Date().toISOString(),
|
|
69
|
-
level:
|
|
70
|
-
event:
|
|
69
|
+
level: "api",
|
|
70
|
+
event: "API_REQUEST",
|
|
71
71
|
message: `Sending request to Groq API`,
|
|
72
|
-
data: { model, messageCount, toolCount }
|
|
72
|
+
data: { model, messageCount, toolCount },
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
@@ -78,11 +78,11 @@ class SuperTracker {
|
|
|
78
78
|
apiResponse(hasContent, hasToolCalls, toolCallCount, duration) {
|
|
79
79
|
this.write({
|
|
80
80
|
timestamp: new Date().toISOString(),
|
|
81
|
-
level:
|
|
82
|
-
event:
|
|
81
|
+
level: "api",
|
|
82
|
+
event: "API_RESPONSE",
|
|
83
83
|
message: `Received response from Groq API`,
|
|
84
84
|
data: { hasContent, hasToolCalls, toolCallCount },
|
|
85
|
-
duration
|
|
85
|
+
duration,
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
@@ -91,10 +91,10 @@ class SuperTracker {
|
|
|
91
91
|
apiError(error, details) {
|
|
92
92
|
this.write({
|
|
93
93
|
timestamp: new Date().toISOString(),
|
|
94
|
-
level:
|
|
95
|
-
event:
|
|
94
|
+
level: "error",
|
|
95
|
+
event: "API_ERROR",
|
|
96
96
|
message: `API Error: ${error}`,
|
|
97
|
-
data: { error, details }
|
|
97
|
+
data: { error, details },
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
@@ -103,23 +103,23 @@ class SuperTracker {
|
|
|
103
103
|
aiResponse(content) {
|
|
104
104
|
this.write({
|
|
105
105
|
timestamp: new Date().toISOString(),
|
|
106
|
-
level:
|
|
107
|
-
event:
|
|
108
|
-
message: `AI: "${content.length > 150 ? content.substring(0, 150) +
|
|
109
|
-
data: { content: content.substring(0, 500), length: content.length }
|
|
106
|
+
level: "ai",
|
|
107
|
+
event: "AI_RESPONSE",
|
|
108
|
+
message: `AI: "${content.length > 150 ? content.substring(0, 150) + "..." : content}"`,
|
|
109
|
+
data: { content: content.substring(0, 500), length: content.length },
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
113
|
* Log AI decided to call tools
|
|
114
114
|
*/
|
|
115
115
|
aiToolDecision(toolCalls) {
|
|
116
|
-
const toolNames = toolCalls.map(t => t.name).join(
|
|
116
|
+
const toolNames = toolCalls.map((t) => t.name).join(", ");
|
|
117
117
|
this.write({
|
|
118
118
|
timestamp: new Date().toISOString(),
|
|
119
|
-
level:
|
|
120
|
-
event:
|
|
119
|
+
level: "ai",
|
|
120
|
+
event: "AI_TOOL_DECISION",
|
|
121
121
|
message: `AI decided to call: [${toolNames}]`,
|
|
122
|
-
data: { toolCalls }
|
|
122
|
+
data: { toolCalls },
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
@@ -128,10 +128,10 @@ class SuperTracker {
|
|
|
128
128
|
toolStart(toolName, args) {
|
|
129
129
|
this.write({
|
|
130
130
|
timestamp: new Date().toISOString(),
|
|
131
|
-
level:
|
|
132
|
-
event:
|
|
131
|
+
level: "info",
|
|
132
|
+
event: "TOOL_START",
|
|
133
133
|
message: `Executing tool: ${toolName}`,
|
|
134
|
-
data: { toolName, args }
|
|
134
|
+
data: { toolName, args },
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
/**
|
|
@@ -140,11 +140,11 @@ class SuperTracker {
|
|
|
140
140
|
toolSuccess(toolName, output, duration) {
|
|
141
141
|
this.write({
|
|
142
142
|
timestamp: new Date().toISOString(),
|
|
143
|
-
level:
|
|
144
|
-
event:
|
|
143
|
+
level: "success",
|
|
144
|
+
event: "TOOL_SUCCESS",
|
|
145
145
|
message: `Tool completed: ${toolName}`,
|
|
146
146
|
data: { toolName, outputPreview: output.substring(0, 200), outputLength: output.length },
|
|
147
|
-
duration
|
|
147
|
+
duration,
|
|
148
148
|
});
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
@@ -153,11 +153,11 @@ class SuperTracker {
|
|
|
153
153
|
toolError(toolName, error, duration, args) {
|
|
154
154
|
this.write({
|
|
155
155
|
timestamp: new Date().toISOString(),
|
|
156
|
-
level:
|
|
157
|
-
event:
|
|
156
|
+
level: "error",
|
|
157
|
+
event: "TOOL_ERROR",
|
|
158
158
|
message: `Tool failed: ${toolName}`,
|
|
159
159
|
data: { toolName, error, args, errorMessage: error },
|
|
160
|
-
duration
|
|
160
|
+
duration,
|
|
161
161
|
});
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
@@ -166,10 +166,10 @@ class SuperTracker {
|
|
|
166
166
|
toolCancelled(toolName) {
|
|
167
167
|
this.write({
|
|
168
168
|
timestamp: new Date().toISOString(),
|
|
169
|
-
level:
|
|
170
|
-
event:
|
|
169
|
+
level: "warn",
|
|
170
|
+
event: "TOOL_CANCELLED",
|
|
171
171
|
message: `Tool cancelled by user: ${toolName}`,
|
|
172
|
-
data: { toolName }
|
|
172
|
+
data: { toolName },
|
|
173
173
|
});
|
|
174
174
|
}
|
|
175
175
|
/**
|
|
@@ -178,10 +178,10 @@ class SuperTracker {
|
|
|
178
178
|
modelInit(modelId, provider, success, error) {
|
|
179
179
|
this.write({
|
|
180
180
|
timestamp: new Date().toISOString(),
|
|
181
|
-
level: success ?
|
|
182
|
-
event:
|
|
181
|
+
level: success ? "success" : "error",
|
|
182
|
+
event: "MODEL_INIT",
|
|
183
183
|
message: success ? `Model initialized: ${modelId}` : `Model init failed: ${error}`,
|
|
184
|
-
data: { modelId, provider, success, error }
|
|
184
|
+
data: { modelId, provider, success, error },
|
|
185
185
|
});
|
|
186
186
|
}
|
|
187
187
|
/**
|
|
@@ -190,10 +190,12 @@ class SuperTracker {
|
|
|
190
190
|
modelSwitch(fromModel, toModel, success) {
|
|
191
191
|
this.write({
|
|
192
192
|
timestamp: new Date().toISOString(),
|
|
193
|
-
level: success ?
|
|
194
|
-
event:
|
|
195
|
-
message: success
|
|
196
|
-
|
|
193
|
+
level: success ? "success" : "error",
|
|
194
|
+
event: "MODEL_SWITCH",
|
|
195
|
+
message: success
|
|
196
|
+
? `Switched model: ${fromModel} -> ${toModel}`
|
|
197
|
+
: `Model switch failed: ${fromModel} -> ${toModel}`,
|
|
198
|
+
data: { fromModel, toModel, success },
|
|
197
199
|
});
|
|
198
200
|
}
|
|
199
201
|
/**
|
|
@@ -202,11 +204,11 @@ class SuperTracker {
|
|
|
202
204
|
promptComplete(prompt, duration, iterations) {
|
|
203
205
|
this.write({
|
|
204
206
|
timestamp: new Date().toISOString(),
|
|
205
|
-
level:
|
|
206
|
-
event:
|
|
207
|
+
level: "success",
|
|
208
|
+
event: "PROMPT_COMPLETE",
|
|
207
209
|
message: `Prompt processed successfully`,
|
|
208
210
|
data: { promptPreview: prompt.substring(0, 50), iterations },
|
|
209
|
-
duration
|
|
211
|
+
duration,
|
|
210
212
|
});
|
|
211
213
|
}
|
|
212
214
|
/**
|
|
@@ -215,10 +217,10 @@ class SuperTracker {
|
|
|
215
217
|
promptFailed(prompt, error) {
|
|
216
218
|
this.write({
|
|
217
219
|
timestamp: new Date().toISOString(),
|
|
218
|
-
level:
|
|
219
|
-
event:
|
|
220
|
+
level: "error",
|
|
221
|
+
event: "PROMPT_FAILED",
|
|
220
222
|
message: `Prompt processing failed: ${error}`,
|
|
221
|
-
data: { promptPreview: prompt.substring(0, 50), error }
|
|
223
|
+
data: { promptPreview: prompt.substring(0, 50), error },
|
|
222
224
|
});
|
|
223
225
|
}
|
|
224
226
|
/**
|
|
@@ -227,10 +229,10 @@ class SuperTracker {
|
|
|
227
229
|
streamChunk(hasContent, hasToolCalls) {
|
|
228
230
|
this.write({
|
|
229
231
|
timestamp: new Date().toISOString(),
|
|
230
|
-
level:
|
|
231
|
-
event:
|
|
232
|
+
level: "debug",
|
|
233
|
+
event: "STREAM_CHUNK",
|
|
232
234
|
message: `Stream chunk: content=${hasContent}, tools=${hasToolCalls}`,
|
|
233
|
-
data: { hasContent, hasToolCalls }
|
|
235
|
+
data: { hasContent, hasToolCalls },
|
|
234
236
|
});
|
|
235
237
|
}
|
|
236
238
|
/**
|
|
@@ -239,10 +241,10 @@ class SuperTracker {
|
|
|
239
241
|
iteration(count, reason) {
|
|
240
242
|
this.write({
|
|
241
243
|
timestamp: new Date().toISOString(),
|
|
242
|
-
level:
|
|
243
|
-
event:
|
|
244
|
+
level: "debug",
|
|
245
|
+
event: "ITERATION",
|
|
244
246
|
message: `Loop iteration ${count}: ${reason}`,
|
|
245
|
-
data: { count, reason }
|
|
247
|
+
data: { count, reason },
|
|
246
248
|
});
|
|
247
249
|
}
|
|
248
250
|
/**
|
|
@@ -251,10 +253,10 @@ class SuperTracker {
|
|
|
251
253
|
contextAttached(files) {
|
|
252
254
|
this.write({
|
|
253
255
|
timestamp: new Date().toISOString(),
|
|
254
|
-
level:
|
|
255
|
-
event:
|
|
256
|
+
level: "info",
|
|
257
|
+
event: "CONTEXT_ATTACHED",
|
|
256
258
|
message: `Attached ${files.length} file(s) for context`,
|
|
257
|
-
data: { files }
|
|
259
|
+
data: { files },
|
|
258
260
|
});
|
|
259
261
|
}
|
|
260
262
|
/**
|
|
@@ -263,10 +265,10 @@ class SuperTracker {
|
|
|
263
265
|
debug(message, data) {
|
|
264
266
|
this.write({
|
|
265
267
|
timestamp: new Date().toISOString(),
|
|
266
|
-
level:
|
|
267
|
-
event:
|
|
268
|
+
level: "debug",
|
|
269
|
+
event: "DEBUG",
|
|
268
270
|
message,
|
|
269
|
-
data
|
|
271
|
+
data,
|
|
270
272
|
});
|
|
271
273
|
}
|
|
272
274
|
/**
|
|
@@ -275,10 +277,10 @@ class SuperTracker {
|
|
|
275
277
|
warn(message, data) {
|
|
276
278
|
this.write({
|
|
277
279
|
timestamp: new Date().toISOString(),
|
|
278
|
-
level:
|
|
279
|
-
event:
|
|
280
|
+
level: "warn",
|
|
281
|
+
event: "WARNING",
|
|
280
282
|
message,
|
|
281
|
-
data
|
|
283
|
+
data,
|
|
282
284
|
});
|
|
283
285
|
}
|
|
284
286
|
/**
|
|
@@ -287,14 +289,14 @@ class SuperTracker {
|
|
|
287
289
|
error(message, error, data) {
|
|
288
290
|
this.write({
|
|
289
291
|
timestamp: new Date().toISOString(),
|
|
290
|
-
level:
|
|
291
|
-
event:
|
|
292
|
+
level: "error",
|
|
293
|
+
event: "ERROR",
|
|
292
294
|
message,
|
|
293
295
|
data: {
|
|
294
296
|
error: error instanceof Error ? error.message : error,
|
|
295
297
|
stack: error instanceof Error ? error.stack : undefined,
|
|
296
|
-
...data
|
|
297
|
-
}
|
|
298
|
+
...data,
|
|
299
|
+
},
|
|
298
300
|
});
|
|
299
301
|
}
|
|
300
302
|
/**
|