rackmind-cli 0.2.1 → 0.4.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.
@@ -1,4 +1,39 @@
1
+ import type Anthropic from '@anthropic-ai/sdk';
1
2
  import { type ToolExecution, type PendingDestructiveAction } from '../ai/providers/index.js';
3
+ /**
4
+ * Soft cap on conversation history. Tune to fit ≈80 % of the model's 200 K-token window.
5
+ * 400 K chars ≈ 100 K tokens at ~4 chars/token — leaves headroom for the system prompt,
6
+ * tool definitions, and the model's own 4 K max_tokens response budget.
7
+ */
8
+ export declare const HISTORY_CAP_CHARS = 400000;
9
+ /** Maximum number of API message entries before trimming. */
10
+ export declare const HISTORY_CAP_TURNS = 150;
11
+ /** Fraction of the cap at which a /clear hint is shown (fires once per session). */
12
+ export declare const HISTORY_WARN_FRACTION = 0.75;
13
+ /**
14
+ * Estimate the total character count of a conversation history.
15
+ * Uses JSON serialisation for simplicity; slightly over-counts JSON structural
16
+ * overhead (safer: we trim a little earlier than strictly necessary).
17
+ */
18
+ export declare function historyCharCount(history: Anthropic.Messages.MessageParam[]): number;
19
+ /**
20
+ * Trim the oldest entries from `history` so the result is back below
21
+ * HISTORY_WARN_FRACTION of each cap. Always ensures the first remaining
22
+ * entry has role 'user' so the Anthropic API constraint is satisfied.
23
+ * Returns the (possibly unchanged) array and a flag indicating whether
24
+ * any trimming was done.
25
+ */
26
+ export declare function trimHistory(history: Anthropic.Messages.MessageParam[], capChars: number, capTurns: number): {
27
+ history: Anthropic.Messages.MessageParam[];
28
+ trimmed: boolean;
29
+ };
30
+ /**
31
+ * Check whether a /clear hint should be shown. Returns the warning message
32
+ * string when history is at or above HISTORY_WARN_FRACTION of either cap,
33
+ * or null otherwise. Pure function — the "fires once per session" guard is
34
+ * maintained by the caller via historyWarnFiredRef.
35
+ */
36
+ export declare function checkHistoryWarnMsg(history: Anthropic.Messages.MessageParam[], capChars: number, capTurns: number): string | null;
2
37
  export interface ChatMessage {
3
38
  id: string;
4
39
  role: 'user' | 'assistant' | 'system';
@@ -29,6 +64,8 @@ export interface RackMindState {
29
64
  }
30
65
  export interface RackMindActions {
31
66
  sendMessage: (text: string) => Promise<void>;
67
+ /** Abort the in-flight AI turn (if any). Safe to call when idle. */
68
+ abortTurn: () => void;
32
69
  clearMessages: () => void;
33
70
  connect: () => Promise<void>;
34
71
  disconnect: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useRackMind.d.ts","sourceRoot":"","sources":["../../src/interactive/useRackMind.ts"],"names":[],"mappings":"AAUA,OAAO,EAIH,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAChC,MAAM,0BAA0B,CAAC;AAiBlC,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,wBAAwB,CAAC;IACjC,kDAAkD;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC;AAiBD,wBAAgB,WAAW,IAAI,aAAa,GAAG,eAAe,CAqV7D"}
1
+ {"version":3,"file":"useRackMind.d.ts","sourceRoot":"","sources":["../../src/interactive/useRackMind.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAIH,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAChC,MAAM,0BAA0B,CAAC;AAkBlC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AACzC,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,MAAM,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAwBlE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CASf;AAMD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,wBAAwB,CAAC;IACjC,kDAAkD;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,oEAAoE;IACpE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC;AA0BD,wBAAgB,WAAW,IAAI,aAAa,GAAG,eAAe,CAoa7D"}
@@ -7,6 +7,7 @@
7
7
  // ---------------------------------------------------------------------------
8
8
  import { useState, useCallback, useRef, useEffect } from 'react';
9
9
  import { getAIProvider, } from '../ai/providers/index.js';
10
+ import { isAbortError } from '../ai/providers/anthropic-provider.js';
10
11
  import { resolveUsableModelId } from '../ai/models.js';
11
12
  import { ServerClient } from '../server/client.js';
12
13
  import { getAnthropicApiKey, resolveServerAlias, readConfig, MachineKeyMismatchError, } from '../config/index.js';
@@ -14,6 +15,69 @@ import { logger } from '../utils/logger.js';
14
15
  import { isAutoYes, getServerAliasOverride } from '../globals.js';
15
16
  import { onShutdown, removeShutdownHandler } from '../utils/shutdown.js';
16
17
  // ---------------------------------------------------------------------------
18
+ // History soft-cap
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Soft cap on conversation history. Tune to fit ≈80 % of the model's 200 K-token window.
22
+ * 400 K chars ≈ 100 K tokens at ~4 chars/token — leaves headroom for the system prompt,
23
+ * tool definitions, and the model's own 4 K max_tokens response budget.
24
+ */
25
+ export const HISTORY_CAP_CHARS = 400_000;
26
+ /** Maximum number of API message entries before trimming. */
27
+ export const HISTORY_CAP_TURNS = 150;
28
+ /** Fraction of the cap at which a /clear hint is shown (fires once per session). */
29
+ export const HISTORY_WARN_FRACTION = 0.75;
30
+ /**
31
+ * Estimate the total character count of a conversation history.
32
+ * Uses JSON serialisation for simplicity; slightly over-counts JSON structural
33
+ * overhead (safer: we trim a little earlier than strictly necessary).
34
+ */
35
+ export function historyCharCount(history) {
36
+ return JSON.stringify(history).length;
37
+ }
38
+ /**
39
+ * Trim the oldest entries from `history` so the result is back below
40
+ * HISTORY_WARN_FRACTION of each cap. Always ensures the first remaining
41
+ * entry has role 'user' so the Anthropic API constraint is satisfied.
42
+ * Returns the (possibly unchanged) array and a flag indicating whether
43
+ * any trimming was done.
44
+ */
45
+ export function trimHistory(history, capChars, capTurns) {
46
+ if (historyCharCount(history) <= capChars && history.length <= capTurns) {
47
+ return { history, trimmed: false };
48
+ }
49
+ const targetChars = Math.floor(capChars * HISTORY_WARN_FRACTION);
50
+ const targetTurns = Math.floor(capTurns * HISTORY_WARN_FRACTION);
51
+ let slice = history;
52
+ let didTrim = false;
53
+ while (slice.length > 2 &&
54
+ (historyCharCount(slice) > targetChars || slice.length > targetTurns)) {
55
+ slice = slice.slice(1);
56
+ didTrim = true;
57
+ // Preserve the Anthropic API invariant: history must start with a user message.
58
+ while (slice.length > 1 && slice[0].role !== 'user') {
59
+ slice = slice.slice(1);
60
+ }
61
+ }
62
+ return { history: slice, trimmed: didTrim };
63
+ }
64
+ /**
65
+ * Check whether a /clear hint should be shown. Returns the warning message
66
+ * string when history is at or above HISTORY_WARN_FRACTION of either cap,
67
+ * or null otherwise. Pure function — the "fires once per session" guard is
68
+ * maintained by the caller via historyWarnFiredRef.
69
+ */
70
+ export function checkHistoryWarnMsg(history, capChars, capTurns) {
71
+ const charFrac = historyCharCount(history) / capChars;
72
+ const turnFrac = history.length / capTurns;
73
+ const maxFrac = Math.max(charFrac, turnFrac);
74
+ if (maxFrac >= HISTORY_WARN_FRACTION) {
75
+ const pct = Math.round(maxFrac * 100);
76
+ return `History is large (${pct}% of context). Consider /clear to start fresh.`;
77
+ }
78
+ return null;
79
+ }
80
+ // ---------------------------------------------------------------------------
17
81
  // ID generation
18
82
  // ---------------------------------------------------------------------------
19
83
  let messageCounter = 0;
@@ -21,6 +85,14 @@ function nextMessageId() {
21
85
  messageCounter += 1;
22
86
  return `msg-${Date.now()}-${messageCounter}`;
23
87
  }
88
+ function makeSystemMessage(content) {
89
+ return {
90
+ id: nextMessageId(),
91
+ role: 'system',
92
+ content,
93
+ timestamp: Date.now(),
94
+ };
95
+ }
24
96
  // ---------------------------------------------------------------------------
25
97
  // Hook
26
98
  // ---------------------------------------------------------------------------
@@ -43,6 +115,16 @@ export function useRackMind() {
43
115
  const aiClientRef = useRef(null);
44
116
  const historyRef = useRef([]);
45
117
  const toolExecutionsRef = useRef([]);
118
+ /** AbortController for the currently in-flight turn, null when idle. */
119
+ const abortControllerRef = useRef(null);
120
+ /**
121
+ * Mirror of the pendingConfirmation React state kept in a ref so that
122
+ * abortTurn() can auto-decline the dialog synchronously without waiting
123
+ * for a React re-render, which would leave the confirm await hanging.
124
+ */
125
+ const pendingConfirmationRef = useRef(null);
126
+ /** Tracks whether the "history is large" hint has been shown this session. */
127
+ const historyWarnFiredRef = useRef(false);
46
128
  // -----------------------------------------------------------------------
47
129
  // Connect to server
48
130
  // -----------------------------------------------------------------------
@@ -183,7 +265,30 @@ export function useRackMind() {
183
265
  setStreamingText('');
184
266
  setError(null);
185
267
  toolExecutionsRef.current = [];
268
+ // ------------------------------------------------------------------
269
+ // History soft-cap: warn when approaching the limit, trim when over.
270
+ // ------------------------------------------------------------------
271
+ if (!historyWarnFiredRef.current) {
272
+ const warnMsg = checkHistoryWarnMsg(historyRef.current, HISTORY_CAP_CHARS, HISTORY_CAP_TURNS);
273
+ if (warnMsg !== null) {
274
+ historyWarnFiredRef.current = true;
275
+ setMessages((prev) => [...prev, makeSystemMessage(warnMsg)]);
276
+ }
277
+ }
278
+ const trimResult = trimHistory(historyRef.current, HISTORY_CAP_CHARS, HISTORY_CAP_TURNS);
279
+ if (trimResult.trimmed) {
280
+ historyRef.current = trimResult.history;
281
+ setMessages((prev) => [
282
+ ...prev,
283
+ makeSystemMessage('Trimmed old history to fit context.'),
284
+ ]);
285
+ }
286
+ // ------------------------------------------------------------------
186
287
  let accumulatedText = '';
288
+ // One AbortController per turn — stored in a ref so abortTurn() can
289
+ // reach it. Cleared in the finally block so the ref is never stale.
290
+ const ac = new AbortController();
291
+ abortControllerRef.current = ac;
187
292
  const callbacks = {
188
293
  onText: (chunk) => {
189
294
  accumulatedText += chunk;
@@ -218,17 +323,21 @@ export function useRackMind() {
218
323
  label: action.label,
219
324
  details: action.details,
220
325
  });
221
- setPendingConfirmation({
326
+ const confirmation = {
222
327
  action,
223
328
  respond: (allow) => {
329
+ pendingConfirmationRef.current = null;
224
330
  setPendingConfirmation(null);
225
331
  resolve(allow);
226
332
  },
227
- });
333
+ };
334
+ pendingConfirmationRef.current = confirmation;
335
+ setPendingConfirmation(confirmation);
228
336
  }),
229
337
  };
230
338
  try {
231
- const updatedHistory = await aiClientRef.current.chatMultiTurn(trimmed, historyRef.current, serverClientRef.current, connection.serverAlias, callbacks);
339
+ const updatedHistory = await aiClientRef.current.chatMultiTurn(trimmed, historyRef.current, serverClientRef.current, connection.serverAlias, callbacks, ac.signal);
340
+ // Only persist history when the turn completed normally.
232
341
  historyRef.current = updatedHistory;
233
342
  // Add assistant message with final text
234
343
  const assistantMessage = {
@@ -243,42 +352,70 @@ export function useRackMind() {
243
352
  setMessages((prev) => [...prev, assistantMessage]);
244
353
  }
245
354
  catch (err) {
246
- const message = err instanceof Error ? err.message : String(err);
247
- logger.error('Interactive chat failed', { error: message });
248
- // Provide human-readable errors
249
- let userError = message;
250
- if (message.includes('401') || message.includes('authentication_error')) {
251
- userError = 'Anthropic API authentication failed. Check your API key.';
252
- }
253
- else if (message.includes('429') || message.includes('rate_limit')) {
254
- userError = 'Rate limit hit. Please wait and try again.';
355
+ if (isAbortError(err)) {
356
+ // User cancelled do NOT persist the partial turn to history,
357
+ // do NOT surface a red error. Show a quiet "Cancelled." note.
358
+ logger.info('Interactive turn cancelled by user');
359
+ const cancelledMessage = {
360
+ id: nextMessageId(),
361
+ role: 'system',
362
+ content: 'Cancelled.',
363
+ timestamp: Date.now(),
364
+ };
365
+ setMessages((prev) => [...prev, cancelledMessage]);
255
366
  }
256
- else if (message.includes('overloaded')) {
257
- userError = 'Anthropic API is overloaded. Try again in a moment.';
258
- }
259
- else if (message.includes('ECONNREFUSED') || message.includes('ETIMEDOUT')) {
260
- userError = 'Cannot connect to server. Check your configuration.';
367
+ else {
368
+ const message = err instanceof Error ? err.message : String(err);
369
+ logger.error('Interactive chat failed', { error: message });
370
+ // Provide human-readable errors
371
+ let userError = message;
372
+ if (message.includes('401') || message.includes('authentication_error')) {
373
+ userError = 'Anthropic API authentication failed. Check your API key.';
374
+ }
375
+ else if (message.includes('429') || message.includes('rate_limit')) {
376
+ userError = 'Rate limit hit. Please wait and try again.';
377
+ }
378
+ else if (message.includes('overloaded')) {
379
+ userError = 'Anthropic API is overloaded. Try again in a moment.';
380
+ }
381
+ else if (message.includes('ECONNREFUSED') || message.includes('ETIMEDOUT')) {
382
+ userError = 'Cannot connect to server. Check your configuration.';
383
+ }
384
+ const errorMessage = {
385
+ id: nextMessageId(),
386
+ role: 'system',
387
+ content: userError,
388
+ timestamp: Date.now(),
389
+ };
390
+ setMessages((prev) => [...prev, errorMessage]);
261
391
  }
262
- const errorMessage = {
263
- id: nextMessageId(),
264
- role: 'system',
265
- content: userError,
266
- timestamp: Date.now(),
267
- };
268
- setMessages((prev) => [...prev, errorMessage]);
269
392
  }
270
393
  finally {
394
+ abortControllerRef.current = null;
395
+ pendingConfirmationRef.current = null;
396
+ setPendingConfirmation(null);
271
397
  setIsThinking(false);
272
398
  setStreamingText('');
273
399
  setActiveTools([]);
274
400
  }
275
401
  }, [connection.serverAlias]);
276
402
  // -----------------------------------------------------------------------
403
+ // Abort current turn
404
+ // -----------------------------------------------------------------------
405
+ const abortTurn = useCallback(() => {
406
+ // Auto-decline any open destructive-action dialog so the awaiting
407
+ // confirm() Promise resolves (to false) and unblocks the tool loop.
408
+ // Without this the chatMultiTurn await would hang even after abort().
409
+ pendingConfirmationRef.current?.respond(false);
410
+ abortControllerRef.current?.abort();
411
+ }, []);
412
+ // -----------------------------------------------------------------------
277
413
  // Clear messages
278
414
  // -----------------------------------------------------------------------
279
415
  const clearMessages = useCallback(() => {
280
416
  setMessages([]);
281
417
  historyRef.current = [];
418
+ historyWarnFiredRef.current = false;
282
419
  setStreamingText('');
283
420
  setError(null);
284
421
  }, []);
@@ -319,6 +456,7 @@ export function useRackMind() {
319
456
  error,
320
457
  pendingConfirmation,
321
458
  sendMessage,
459
+ abortTurn,
322
460
  clearMessages,
323
461
  connect,
324
462
  disconnect,
@@ -1 +1 @@
1
- {"version":3,"file":"useRackMind.js","sourceRoot":"","sources":["../../src/interactive/useRackMind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRackMind.js","sourceRoot":"","sources":["../../src/interactive/useRackMind.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety.d.ts","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"AAaA,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAyKlE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
1
+ {"version":3,"file":"command-safety.d.ts","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"AAaA,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAwLlE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
@@ -113,6 +113,20 @@ export const DANGEROUS_PATTERNS = [
113
113
  pattern: /\brm\b[^|;&]*\/etc\/(?:passwd|shadow|sudoers|group|gshadow)\b/i,
114
114
  label: 'rm /etc/passwd|shadow|sudoers (auth file deletion)',
115
115
  },
116
+ // sed -i (in-place edit) on auth files — any in-place sed on these files
117
+ // is dangerous regardless of the sed command (substitution or delete).
118
+ {
119
+ pattern: /\bsed\b[^|;&]*-i\b[^|;&]*\/etc\/(?:passwd|shadow|sudoers|group|gshadow)\b/i,
120
+ label: 'sed -i on auth file (in-place edit of auth file)',
121
+ },
122
+ // truncate -s 0 on system paths — zeros out a file without deleting it,
123
+ // bypassing the `rm` blocklist while having the same effect.
124
+ {
125
+ pattern: /\btruncate\b[^|;&]*-s\s*0\b[^|;&]*\/(?:etc|boot|usr|lib(?:64)?|bin|sbin|root)(?:\/|$|\s)/i,
126
+ label: 'truncate -s 0 on system path (file zeroing)',
127
+ },
128
+ // crontab -r removes ALL of the user's cron jobs with no undo.
129
+ { pattern: /\bcrontab\b[^|;&]*-r\b/i, label: 'crontab -r (cron removal)' },
116
130
  // -----------------------------------------------------------------------
117
131
  // Process disruption — kill init / PID 1
118
132
  // -----------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety.js","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-safety.js","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
1
  declare function getLogFile(): string;
2
+ /**
3
+ * Attempt to acquire the rotation lock for `logFile` using an O_EXCL sentinel
4
+ * file (`<logFile>.rotating`).
5
+ *
6
+ * Returns `true` when the lock is acquired; the caller MUST call
7
+ * `releaseRotationLock` in a `finally` block. Returns `false` when another
8
+ * process is actively rotating — the caller should skip this cycle silently.
9
+ *
10
+ * A sentinel whose mtime is older than SENTINEL_STALE_MS is treated as
11
+ * abandoned by a crashed process and is forcibly reclaimed.
12
+ */
13
+ declare function acquireRotationLock(logFile: string): boolean;
14
+ declare function releaseRotationLock(logFile: string): void;
2
15
  /**
3
16
  * Rotate `logFile` if it exceeds MAX_FILE_BYTES.
4
17
  *
@@ -9,6 +22,10 @@ declare function getLogFile(): string;
9
22
  * cost) and best-effort — any failure here must NOT throw, so that a broken
10
23
  * filesystem state cannot crash the CLI or the MCP. We swallow errors and let
11
24
  * the caller fall back to appending to the (possibly oversized) file.
25
+ *
26
+ * Concurrent-write safety: an O_EXCL sentinel file (`<logFile>.rotating`)
27
+ * ensures exactly one process executes the rename sequence. The loser skips
28
+ * the cycle silently; the next write will re-check the size and retry.
12
29
  */
13
30
  declare function rotateIfNeeded(logFile: string): void;
14
31
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
@@ -22,7 +39,11 @@ export declare const logger: {
22
39
  export declare const __testing: {
23
40
  MAX_FILE_BYTES: number;
24
41
  MAX_BACKUPS: number;
42
+ SENTINEL_SUFFIX: string;
43
+ SENTINEL_STALE_MS: number;
25
44
  rotateIfNeeded: typeof rotateIfNeeded;
45
+ acquireRotationLock: typeof acquireRotationLock;
46
+ releaseRotationLock: typeof releaseRotationLock;
26
47
  getLogFile: typeof getLogFile;
27
48
  };
28
49
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAmBA,iBAAS,UAAU,IAAI,MAAM,CAG5B;AAMD;;;;;;;;;;GAUG;AACH,iBAAS,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAmC7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAyBD,eAAO,MAAM,MAAM;qBACE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBACrC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1D,CAAC;AAIF,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AA0BA,iBAAS,UAAU,IAAI,MAAM,CAG5B;AAMD;;;;;;;;;;GAUG;AACH,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA2BrD;AAED,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOlD;AAED;;;;;;;;;;;;;;GAcG;AACH,iBAAS,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAgD7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAyBD,eAAO,MAAM,MAAM;qBACE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBACrC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1D,CAAC;AAIF,eAAO,MAAM,SAAS;;;;;;;;;CASrB,CAAC"}
@@ -10,6 +10,12 @@ const LOG_DIR = path.join(os.homedir(), '.rackmind', 'logs');
10
10
  // = 10 MB * 6 = 60 MB per log basename.
11
11
  const MAX_FILE_BYTES = 10 * 1024 * 1024;
12
12
  const MAX_BACKUPS = 5;
13
+ // Sentinel-file lock constants for concurrent-rotation safety.
14
+ // Multiple processes (CLI + MCP child, cron + interactive) may log to the same
15
+ // file. We use an O_EXCL sentinel to guarantee only one process executes the
16
+ // rotate-and-rename sequence at a time.
17
+ const SENTINEL_SUFFIX = '.rotating';
18
+ const SENTINEL_STALE_MS = 30_000; // 30 s — treat older sentinels as from a crashed process
13
19
  function ensureLogDir() {
14
20
  fs.mkdirSync(LOG_DIR, { recursive: true });
15
21
  }
@@ -20,6 +26,56 @@ function getLogFile() {
20
26
  function formatTimestamp() {
21
27
  return new Date().toISOString();
22
28
  }
29
+ /**
30
+ * Attempt to acquire the rotation lock for `logFile` using an O_EXCL sentinel
31
+ * file (`<logFile>.rotating`).
32
+ *
33
+ * Returns `true` when the lock is acquired; the caller MUST call
34
+ * `releaseRotationLock` in a `finally` block. Returns `false` when another
35
+ * process is actively rotating — the caller should skip this cycle silently.
36
+ *
37
+ * A sentinel whose mtime is older than SENTINEL_STALE_MS is treated as
38
+ * abandoned by a crashed process and is forcibly reclaimed.
39
+ */
40
+ function acquireRotationLock(logFile) {
41
+ const sentinel = `${logFile}${SENTINEL_SUFFIX}`;
42
+ try {
43
+ // 'wx' = O_WRONLY|O_CREAT|O_EXCL — atomic on POSIX; throws EEXIST if
44
+ // the sentinel is already present.
45
+ const fd = fs.openSync(sentinel, 'wx');
46
+ fs.closeSync(fd);
47
+ return true;
48
+ }
49
+ catch (err) {
50
+ if (err.code !== 'EEXIST') {
51
+ // Unexpected error (EACCES, ENOENT, …) — skip rotation rather than crash.
52
+ return false;
53
+ }
54
+ // Sentinel exists. Check if it belongs to a crashed process.
55
+ try {
56
+ const st = fs.statSync(sentinel);
57
+ if (Date.now() - st.mtimeMs > SENTINEL_STALE_MS) {
58
+ fs.unlinkSync(sentinel);
59
+ const fd = fs.openSync(sentinel, 'wx');
60
+ fs.closeSync(fd);
61
+ return true;
62
+ }
63
+ }
64
+ catch {
65
+ // Lost the reclaim race or sentinel vanished — skip this cycle.
66
+ }
67
+ return false;
68
+ }
69
+ }
70
+ function releaseRotationLock(logFile) {
71
+ const sentinel = `${logFile}${SENTINEL_SUFFIX}`;
72
+ try {
73
+ fs.unlinkSync(sentinel);
74
+ }
75
+ catch {
76
+ // ignore — may already be gone
77
+ }
78
+ }
23
79
  /**
24
80
  * Rotate `logFile` if it exceeds MAX_FILE_BYTES.
25
81
  *
@@ -30,6 +86,10 @@ function formatTimestamp() {
30
86
  * cost) and best-effort — any failure here must NOT throw, so that a broken
31
87
  * filesystem state cannot crash the CLI or the MCP. We swallow errors and let
32
88
  * the caller fall back to appending to the (possibly oversized) file.
89
+ *
90
+ * Concurrent-write safety: an O_EXCL sentinel file (`<logFile>.rotating`)
91
+ * ensures exactly one process executes the rename sequence. The loser skips
92
+ * the cycle silently; the next write will re-check the size and retry.
33
93
  */
34
94
  function rotateIfNeeded(logFile) {
35
95
  try {
@@ -41,7 +101,20 @@ function rotateIfNeeded(logFile) {
41
101
  // File doesn't exist yet — nothing to rotate.
42
102
  return;
43
103
  }
104
+ // Skip silently if another process is already rotating.
105
+ if (!acquireRotationLock(logFile))
106
+ return;
44
107
  try {
108
+ // Re-stat after acquiring the lock: if the winning peer already rotated,
109
+ // the live file will be gone or small — no work needed.
110
+ try {
111
+ const stat = fs.statSync(logFile);
112
+ if (stat.size <= MAX_FILE_BYTES)
113
+ return;
114
+ }
115
+ catch {
116
+ return; // file disappeared — nothing to rotate
117
+ }
45
118
  // Drop the oldest backup if it exists.
46
119
  const oldest = `${logFile}.${MAX_BACKUPS}`;
47
120
  try {
@@ -68,6 +141,9 @@ function rotateIfNeeded(logFile) {
68
141
  // Rotation failed — fall through, caller will append to the existing
69
142
  // file. Bounded growth is preferred to a crashed CLI.
70
143
  }
144
+ finally {
145
+ releaseRotationLock(logFile);
146
+ }
71
147
  }
72
148
  const LOG_LEVELS = {
73
149
  debug: 0,
@@ -112,7 +188,11 @@ export const logger = {
112
188
  export const __testing = {
113
189
  MAX_FILE_BYTES,
114
190
  MAX_BACKUPS,
191
+ SENTINEL_SUFFIX,
192
+ SENTINEL_STALE_MS,
115
193
  rotateIfNeeded,
194
+ acquireRotationLock,
195
+ releaseRotationLock,
116
196
  getLogFile,
117
197
  };
118
198
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAE7D,iFAAiF;AACjF,gFAAgF;AAChF,+CAA+C;AAC/C,8DAA8D;AAC9D,uCAAuC;AACvC,wCAAwC;AACxC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACxC,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,+DAA+D;AAC/D,+EAA+E;AAC/E,8EAA8E;AAC9E,wCAAwC;AACxC,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,yDAAyD;AAE3F,SAAS,YAAY;IACjB,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU;IACf,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,eAAe;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,OAAe;IACxC,MAAM,QAAQ,GAAG,GAAG,OAAO,GAAG,eAAe,EAAE,CAAC;IAChD,IAAI,CAAC;QACD,qEAAqE;QACrE,mCAAmC;QACnC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACpB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,0EAA0E;YAC1E,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,8DAA8D;QAC9D,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBAC9C,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACxB,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACvC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,gEAAgE;QACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IACxC,MAAM,QAAQ,GAAG,GAAG,OAAO,GAAG,eAAe,EAAE,CAAC;IAChD,IAAI,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,+BAA+B;IACnC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,cAAc,CAAC,OAAe;IACnC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,IAAI,cAAc;YAAE,OAAO;IAC5C,CAAC;IAAC,MAAM,CAAC;QACL,8CAA8C;QAC9C,OAAO;IACX,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;QAAE,OAAO;IAC1C,IAAI,CAAC;QACD,yEAAyE;QACzE,wDAAwD;QACxD,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,IAAI,cAAc;gBAAE,OAAO;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,uCAAuC;QACnD,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC;YACD,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACL,yBAAyB;QAC7B,CAAC;QAED,qDAAqD;QACrD,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACD,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACL,8CAA8C;YAClD,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACL,qEAAqE;QACrE,sDAAsD;IAC1D,CAAC;YAAS,CAAC;QACP,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,GAA6B;IACzC,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACX,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAe;IACvC,YAAY,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAC9B,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;IAC9E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAE9B,IAAI,CAAC;QACD,YAAY,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG;YACV,SAAS,EAAE,eAAe,EAAE;YAC5B,KAAK;YACL,OAAO;YACP,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC;QACF,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,qDAAqD;IACzD,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;IAC5F,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IAC1F,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IAC1F,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;CAC/F,CAAC;AAEF,6EAA6E;AAC7E,sCAAsC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,cAAc;IACd,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,UAAU;CACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rackmind-cli",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "CLI interface for RackMind — Claude Code-style terminal experience for managing Proxmox servers, LXC containers, and QEMU VMs from your terminal.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -89,7 +89,7 @@
89
89
  ]
90
90
  },
91
91
  "author": "RackMind <hello@rackmind.ai>",
92
- "license": "MIT",
92
+ "license": "BUSL-1.1",
93
93
  "engines": {
94
94
  "node": ">=20.0.0"
95
95
  },