rackmind-cli 0.1.6 → 0.2.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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -176
  3. package/bin/rackmind.js +5 -1
  4. package/dist/ai/providers/anthropic-provider.d.ts +4 -0
  5. package/dist/ai/providers/anthropic-provider.d.ts.map +1 -1
  6. package/dist/ai/providers/anthropic-provider.js +17 -4
  7. package/dist/ai/providers/anthropic-provider.js.map +1 -1
  8. package/dist/ai/providers/base.d.ts +15 -0
  9. package/dist/ai/providers/base.d.ts.map +1 -1
  10. package/dist/ai/providers/claude-code-bridge.d.ts +7 -0
  11. package/dist/ai/providers/claude-code-bridge.d.ts.map +1 -1
  12. package/dist/ai/providers/claude-code-bridge.js +1 -1
  13. package/dist/ai/providers/claude-code-bridge.js.map +1 -1
  14. package/dist/ai/providers/claude-code-provider.d.ts.map +1 -1
  15. package/dist/ai/providers/claude-code-provider.js +1 -0
  16. package/dist/ai/providers/claude-code-provider.js.map +1 -1
  17. package/dist/ai/providers/index.d.ts +1 -1
  18. package/dist/ai/providers/index.d.ts.map +1 -1
  19. package/dist/ai/providers/index.js.map +1 -1
  20. package/dist/ai/system-prompt.d.ts.map +1 -1
  21. package/dist/ai/system-prompt.js +1 -26
  22. package/dist/ai/system-prompt.js.map +1 -1
  23. package/dist/ai/tool-executor.d.ts +39 -1
  24. package/dist/ai/tool-executor.d.ts.map +1 -1
  25. package/dist/ai/tool-executor.js +157 -2
  26. package/dist/ai/tool-executor.js.map +1 -1
  27. package/dist/commands/auth.d.ts.map +1 -1
  28. package/dist/commands/auth.js +21 -15
  29. package/dist/commands/auth.js.map +1 -1
  30. package/dist/commands/config.d.ts.map +1 -1
  31. package/dist/commands/config.js +37 -7
  32. package/dist/commands/config.js.map +1 -1
  33. package/dist/commands/containers.d.ts.map +1 -1
  34. package/dist/commands/containers.js +10 -3
  35. package/dist/commands/containers.js.map +1 -1
  36. package/dist/commands/exec.d.ts.map +1 -1
  37. package/dist/commands/exec.js +19 -7
  38. package/dist/commands/exec.js.map +1 -1
  39. package/dist/commands/lifecycle.d.ts.map +1 -1
  40. package/dist/commands/lifecycle.js +133 -105
  41. package/dist/commands/lifecycle.js.map +1 -1
  42. package/dist/commands/logs.d.ts.map +1 -1
  43. package/dist/commands/logs.js +10 -4
  44. package/dist/commands/logs.js.map +1 -1
  45. package/dist/commands/report.d.ts.map +1 -1
  46. package/dist/commands/report.js +20 -12
  47. package/dist/commands/report.js.map +1 -1
  48. package/dist/commands/servers.d.ts.map +1 -1
  49. package/dist/commands/servers.js +29 -2
  50. package/dist/commands/servers.js.map +1 -1
  51. package/dist/commands/status.d.ts +5 -0
  52. package/dist/commands/status.d.ts.map +1 -1
  53. package/dist/commands/status.js +118 -51
  54. package/dist/commands/status.js.map +1 -1
  55. package/dist/commands/vms.d.ts.map +1 -1
  56. package/dist/commands/vms.js +9 -3
  57. package/dist/commands/vms.js.map +1 -1
  58. package/dist/config/crypto.d.ts +10 -0
  59. package/dist/config/crypto.d.ts.map +1 -1
  60. package/dist/config/crypto.js +47 -2
  61. package/dist/config/crypto.js.map +1 -1
  62. package/dist/config/index.d.ts +51 -0
  63. package/dist/config/index.d.ts.map +1 -1
  64. package/dist/config/index.js +161 -17
  65. package/dist/config/index.js.map +1 -1
  66. package/dist/globals.d.ts +21 -3
  67. package/dist/globals.d.ts.map +1 -1
  68. package/dist/globals.js +30 -4
  69. package/dist/globals.js.map +1 -1
  70. package/dist/index.js +48 -7
  71. package/dist/index.js.map +1 -1
  72. package/dist/interactive/App.d.ts.map +1 -1
  73. package/dist/interactive/App.js +11 -5
  74. package/dist/interactive/App.js.map +1 -1
  75. package/dist/interactive/components/ConfirmDialog.d.ts +9 -0
  76. package/dist/interactive/components/ConfirmDialog.d.ts.map +1 -0
  77. package/dist/interactive/components/ConfirmDialog.js +26 -0
  78. package/dist/interactive/components/ConfirmDialog.js.map +1 -0
  79. package/dist/interactive/components/InputBar.d.ts.map +1 -1
  80. package/dist/interactive/components/InputBar.js +10 -1
  81. package/dist/interactive/components/InputBar.js.map +1 -1
  82. package/dist/interactive/launch.d.ts +5 -0
  83. package/dist/interactive/launch.d.ts.map +1 -1
  84. package/dist/interactive/launch.js +16 -0
  85. package/dist/interactive/launch.js.map +1 -1
  86. package/dist/interactive/slashCommands.d.ts +1 -0
  87. package/dist/interactive/slashCommands.d.ts.map +1 -1
  88. package/dist/interactive/slashCommands.js +13 -0
  89. package/dist/interactive/slashCommands.js.map +1 -1
  90. package/dist/interactive/useRackMind.d.ts +9 -1
  91. package/dist/interactive/useRackMind.d.ts.map +1 -1
  92. package/dist/interactive/useRackMind.js +83 -4
  93. package/dist/interactive/useRackMind.js.map +1 -1
  94. package/dist/oneshot/run.d.ts.map +1 -1
  95. package/dist/oneshot/run.js +51 -9
  96. package/dist/oneshot/run.js.map +1 -1
  97. package/dist/server/client.d.ts +4 -2
  98. package/dist/server/client.d.ts.map +1 -1
  99. package/dist/server/client.js +6 -4
  100. package/dist/server/client.js.map +1 -1
  101. package/dist/server/ssh.d.ts.map +1 -1
  102. package/dist/server/ssh.js +1 -1
  103. package/dist/server/ssh.js.map +1 -1
  104. package/dist/utils/command-safety.d.ts.map +1 -1
  105. package/dist/utils/command-safety.js +157 -5
  106. package/dist/utils/command-safety.js.map +1 -1
  107. package/dist/utils/logger.d.ts +20 -0
  108. package/dist/utils/logger.d.ts.map +1 -1
  109. package/dist/utils/logger.js +68 -1
  110. package/dist/utils/logger.js.map +1 -1
  111. package/dist/utils/prompt.d.ts.map +1 -1
  112. package/dist/utils/prompt.js +4 -1
  113. package/dist/utils/prompt.js.map +1 -1
  114. package/dist/utils/table.d.ts +3 -0
  115. package/dist/utils/table.d.ts.map +1 -1
  116. package/dist/utils/table.js +4 -1
  117. package/dist/utils/table.js.map +1 -1
  118. package/package.json +45 -12
  119. package/dist/ai/client.d.ts +0 -71
  120. package/dist/ai/client.d.ts.map +0 -1
  121. package/dist/ai/client.js +0 -198
  122. package/dist/ai/client.js.map +0 -1
@@ -3,20 +3,172 @@
3
3
  // ---------------------------------------------------------------------------
4
4
  // Shared between `exec` command and AI tool executor to prevent accidental
5
5
  // or AI-initiated destructive operations without explicit user consent.
6
+ //
7
+ // The blocklist is intentionally regex-based (not literal-string-match) so
8
+ // that flag reordering (`pct destroy --purge 100` vs `pct destroy 100 --purge`)
9
+ // cannot trivially bypass the gate. Patterns are evaluated in order; the
10
+ // first match wins, so more-specific patterns are listed first when label
11
+ // specificity matters.
6
12
  // ---------------------------------------------------------------------------
7
13
  /** Patterns that match potentially destructive shell commands */
8
14
  export const DANGEROUS_PATTERNS = [
15
+ // -----------------------------------------------------------------------
16
+ // Filesystem destruction
17
+ // -----------------------------------------------------------------------
18
+ // `rm -rf /` and "rm root" variants — match `rm` with at least one
19
+ // recursive/force flag AND a path that targets the system root.
20
+ // Listed BEFORE the generic rm pattern so this more-specific label wins.
9
21
  {
10
- pattern: /\brm\s+(-[a-zA-Z]*f|-[a-zA-Z]*r|--force|--recursive)/i,
22
+ pattern: /\brm\s+(?:-[a-zA-Z]*[rfR][a-zA-Z]*|--recursive|--force|--no-preserve-root)(?:\s+(?:-[a-zA-Z-]+|--[a-zA-Z-]+))*\s+\/(?:\s|$|\*|;|&|\||>)/i,
23
+ label: 'rm -rf / (root filesystem destruction)',
24
+ },
25
+ // Generic rm -rf / rm -r / rm -f / rm --force / rm --recursive
26
+ {
27
+ pattern: /\brm\s+(?:-[a-zA-Z]*(?:f|r|R)[a-zA-Z]*|--force|--recursive)\b/i,
11
28
  label: 'rm with force/recursive',
12
29
  },
13
- { pattern: /\bmkfs\b/i, label: 'mkfs (format filesystem)' },
30
+ // find -delete or find -exec rm — recursive deletion via find
31
+ {
32
+ pattern: /\bfind\b[^|;&]*\s(?:-delete\b|-exec\s+rm\b)/i,
33
+ label: 'find with -delete or -exec rm (mass deletion)',
34
+ },
35
+ // chmod 000 -R / chmod -R 000 / chmod 0 recursive — permission wipe
36
+ {
37
+ pattern: /\bchmod\b[^|;&]*\s(?:-R\b|--recursive\b)[^|;&]*\s0{1,4}\b/i,
38
+ label: 'chmod recursive 000 (permission wipe)',
39
+ },
40
+ {
41
+ pattern: /\bchmod\b[^|;&]*\s0{2,4}\s+(?:-R\b|--recursive\b)/i,
42
+ label: 'chmod recursive 000 (permission wipe)',
43
+ },
44
+ // chown -R … / — recursive ownership change starting at /
45
+ {
46
+ pattern: /\bchown\b[^|;&]*\s(?:-R\b|--recursive\b)[^|;&]*\s\/(?:\s|$)/i,
47
+ label: 'chown -R targeting / (recursive ownership change)',
48
+ },
49
+ // -----------------------------------------------------------------------
50
+ // Disk / partition / filesystem operations
51
+ // -----------------------------------------------------------------------
52
+ { pattern: /\bmkfs(?:\.[a-z0-9]+)?\b/i, label: 'mkfs (format filesystem)' },
14
53
  { pattern: /\bdd\s+.*of=/i, label: 'dd (raw disk write)' },
15
54
  { pattern: /\bfdisk\b/i, label: 'fdisk (partition table)' },
16
- { pattern: /:\(\)\s*\{/, label: 'fork bomb' },
17
- { pattern: /\b(shutdown|reboot|poweroff|halt)\b/i, label: 'shutdown/reboot/poweroff' },
18
- { pattern: /\bsystemctl\s+(stop|disable|mask)\b/i, label: 'systemctl stop/disable/mask' },
55
+ { pattern: /\bsgdisk\b/i, label: 'sgdisk (partition table)' },
56
+ { pattern: /\bparted\b/i, label: 'parted (partition table)' },
57
+ { pattern: /\bwipefs\b/i, label: 'wipefs (wipe filesystem signature)' },
58
+ { pattern: /\b(?:lvremove|vgremove|pvremove)\b/i, label: 'LVM remove (storage destruction)' },
59
+ { pattern: /\bzpool\s+destroy\b/i, label: 'zpool destroy (ZFS pool destruction)' },
60
+ { pattern: /\bzfs\s+destroy\b/i, label: 'zfs destroy (ZFS dataset destruction)' },
61
+ { pattern: /\bmdadm\s+(?:--stop|--remove|--zero-superblock)\b/i, label: 'mdadm stop/remove' },
62
+ // -----------------------------------------------------------------------
63
+ // Container / VM destruction (Proxmox + Docker + libvirt)
64
+ // -----------------------------------------------------------------------
65
+ { pattern: /\bpct\s+(?:destroy|delete)\b/i, label: 'pct destroy/delete (LXC destruction)' },
66
+ { pattern: /\bqm\s+(?:destroy|delete)\b/i, label: 'qm destroy/delete (QEMU VM destruction)' },
67
+ { pattern: /\bvirsh\s+(?:destroy|undefine)\b/i, label: 'virsh destroy/undefine' },
68
+ { pattern: /\bdocker\s+(?:system\s+)?prune\b[^|;&]*-[a-z]*a/i, label: 'docker prune -a' },
69
+ { pattern: /\bdocker\s+rm\s+-f\b/i, label: 'docker rm -f' },
70
+ { pattern: /\bdocker\s+rmi\s+-f\b/i, label: 'docker rmi -f' },
71
+ // -----------------------------------------------------------------------
72
+ // Network blackholing
73
+ // -----------------------------------------------------------------------
74
+ {
75
+ pattern: /\biptables\s+(?:-F|--flush|-X|--delete-chain|-Z|--zero)\b/i,
76
+ label: 'iptables flush/delete chain (network blackhole)',
77
+ },
78
+ {
79
+ pattern: /\bip6tables\s+(?:-F|--flush|-X|--delete-chain|-Z|--zero)\b/i,
80
+ label: 'ip6tables flush/delete chain',
81
+ },
82
+ { pattern: /\bnft\s+flush\b/i, label: 'nft flush (nftables ruleset wipe)' },
83
+ {
84
+ pattern: /\bip\s+link\s+set\s+\S+\s+down\b/i,
85
+ label: 'ip link set <iface> down (network interface shutdown)',
86
+ },
87
+ {
88
+ pattern: /\bifconfig\s+\S+\s+down\b/i,
89
+ label: 'ifconfig <iface> down (network interface shutdown)',
90
+ },
91
+ { pattern: /\bip\s+route\s+(?:flush|del)\b/i, label: 'ip route flush/del (routing wipe)' },
92
+ // -----------------------------------------------------------------------
93
+ // User / authentication destruction
94
+ // -----------------------------------------------------------------------
95
+ { pattern: /\buserdel\b/i, label: 'userdel (delete user account)' },
96
+ { pattern: /\bgroupdel\b/i, label: 'groupdel (delete group)' },
97
+ { pattern: /\bdeluser\b/i, label: 'deluser (delete user account)' },
98
+ { pattern: /\bdelgroup\b/i, label: 'delgroup (delete group)' },
99
+ {
100
+ pattern: /\bpasswd\s+(?:-l|--lock|-d|--delete)\b/i,
101
+ label: 'passwd lock/delete (lock or wipe password)',
102
+ },
103
+ {
104
+ pattern: /\bchage\s+(?:-E\s+0|-E0)\b/i,
105
+ label: 'chage -E 0 (expire account immediately)',
106
+ },
107
+ { pattern: /\busermod\s+(?:-L|--lock)\b/i, label: 'usermod --lock (lock account)' },
108
+ {
109
+ pattern: />\s*\/etc\/(?:passwd|shadow|sudoers|group|gshadow)\b/i,
110
+ label: 'write to /etc/passwd|shadow|sudoers (auth file overwrite)',
111
+ },
112
+ {
113
+ pattern: /\brm\b[^|;&]*\/etc\/(?:passwd|shadow|sudoers|group|gshadow)\b/i,
114
+ label: 'rm /etc/passwd|shadow|sudoers (auth file deletion)',
115
+ },
116
+ // -----------------------------------------------------------------------
117
+ // Process disruption — kill init / PID 1
118
+ // -----------------------------------------------------------------------
119
+ { pattern: /\bkill\s+(?:-[a-zA-Z0-9]+\s+)?-?1\b(?!\d)/i, label: 'kill PID 1 (init kill)' },
120
+ { pattern: /\bkillall\s+(?:-[a-zA-Z0-9]+\s+)?init\b/i, label: 'killall init' },
121
+ { pattern: /\bkillall\s+(?:-[a-zA-Z0-9]+\s+)?systemd\b/i, label: 'killall systemd' },
122
+ { pattern: /\bpkill\b[^|;&]*\s-1\b(?!\d)/i, label: 'pkill -1 (signal all processes)' },
123
+ { pattern: /\bpkill\s+(?:-[a-zA-Z0-9]+\s+)?init\b/i, label: 'pkill init' },
124
+ { pattern: /\bpkill\s+(?:-[a-zA-Z0-9]+\s+)?systemd\b/i, label: 'pkill systemd' },
125
+ // -----------------------------------------------------------------------
126
+ // System shutdown / reboot
127
+ // -----------------------------------------------------------------------
128
+ { pattern: /\b(?:shutdown|reboot|poweroff|halt)\b/i, label: 'shutdown/reboot/poweroff' },
129
+ {
130
+ pattern: /\bsystemctl\s+(?:stop|disable|mask|isolate)\b/i,
131
+ label: 'systemctl stop/disable/mask',
132
+ },
133
+ {
134
+ pattern: /\bsystemctl\s+(?:reboot|poweroff|halt|emergency|rescue)\b/i,
135
+ label: 'systemctl reboot/poweroff/halt',
136
+ },
137
+ { pattern: /\binit\s+0\b/i, label: 'init 0 (shutdown)' },
138
+ { pattern: /\binit\s+6\b/i, label: 'init 6 (reboot)' },
139
+ { pattern: /\btelinit\s+(?:0|6)\b/i, label: 'telinit 0/6 (shutdown/reboot)' },
140
+ // -----------------------------------------------------------------------
141
+ // Raw device writes
142
+ // -----------------------------------------------------------------------
19
143
  { pattern: />\s*\/dev\//i, label: 'write to /dev/' },
144
+ // -----------------------------------------------------------------------
145
+ // Fork bomb
146
+ // -----------------------------------------------------------------------
147
+ // Matches the classic `:(){ :|:& };:` shape — a function named `:` that
148
+ // pipes itself into itself recursively in the background. Tolerates
149
+ // whitespace and minor formatting variation.
150
+ {
151
+ pattern: /:\s*\(\s*\)\s*\{[^}]*:\s*\|\s*:[^}]*&[^}]*\}\s*;\s*:/,
152
+ label: 'fork bomb',
153
+ },
154
+ // Backstop: matches the bare function-definition shape that pipes itself
155
+ // in background. Catches variants where the inner body is condensed.
156
+ { pattern: /:\(\)\s*\{[\s\S]{0,40}:\|:&/, label: 'fork bomb' },
157
+ // -----------------------------------------------------------------------
158
+ // Curl/wget piped to a shell — remote code execution
159
+ // -----------------------------------------------------------------------
160
+ {
161
+ pattern: /\b(?:curl|wget)\b[^|;&]*\|\s*(?:sudo\s+)?(?:bash|sh|zsh|ksh|dash|python|perl)\b/i,
162
+ label: 'curl|wget piped to shell (remote code execution)',
163
+ },
164
+ // -----------------------------------------------------------------------
165
+ // Crypto / key destruction
166
+ // -----------------------------------------------------------------------
167
+ { pattern: /\brm\b[^|;&]*~\/\.ssh\b/i, label: 'rm ~/.ssh (SSH key destruction)' },
168
+ {
169
+ pattern: /\brm\b[^|;&]*\/root\/\.ssh\b/i,
170
+ label: 'rm /root/.ssh (root SSH key destruction)',
171
+ },
20
172
  ];
21
173
  /**
22
174
  * Check a command string against the dangerous patterns blocklist.
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety.js","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAC9E,2EAA2E;AAC3E,wEAAwE;AACxE,8EAA8E;AAE9E,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACpE;QACI,OAAO,EAAE,uDAAuD;QAChE,KAAK,EAAE,yBAAyB;KACnC;IACD,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,0BAA0B,EAAE;IAC3D,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,qBAAqB,EAAE;IAC1D,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,yBAAyB,EAAE;IAC3D,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7C,EAAE,OAAO,EAAE,sCAAsC,EAAE,KAAK,EAAE,0BAA0B,EAAE;IACtF,EAAE,OAAO,EAAE,sCAAsC,EAAE,KAAK,EAAE,6BAA6B,EAAE;IACzF,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE;CACvD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACjD,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,kBAAkB,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"command-safety.js","sourceRoot":"","sources":["../../src/utils/command-safety.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,16 @@
1
+ declare function getLogFile(): string;
2
+ /**
3
+ * Rotate `logFile` if it exceeds MAX_FILE_BYTES.
4
+ *
5
+ * Strategy: shift `.N -> .N+1`, then rename the live file to `.1`. The next
6
+ * write to `logFile` will create a fresh, empty file.
7
+ *
8
+ * This is intentionally synchronous (CLI hot path, rare event, tiny rename
9
+ * cost) and best-effort — any failure here must NOT throw, so that a broken
10
+ * filesystem state cannot crash the CLI or the MCP. We swallow errors and let
11
+ * the caller fall back to appending to the (possibly oversized) file.
12
+ */
13
+ declare function rotateIfNeeded(logFile: string): void;
1
14
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
15
  export declare function setLogLevel(level: LogLevel): void;
3
16
  export declare const logger: {
@@ -6,4 +19,11 @@ export declare const logger: {
6
19
  warn: (message: string, meta?: Record<string, unknown>) => void;
7
20
  error: (message: string, meta?: Record<string, unknown>) => void;
8
21
  };
22
+ export declare const __testing: {
23
+ MAX_FILE_BYTES: number;
24
+ MAX_BACKUPS: number;
25
+ rotateIfNeeded: typeof rotateIfNeeded;
26
+ getLogFile: typeof getLogFile;
27
+ };
28
+ export {};
9
29
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAuBD,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"}
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"}
@@ -2,6 +2,14 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import os from 'node:os';
4
4
  const LOG_DIR = path.join(os.homedir(), '.rackmind', 'logs');
5
+ // Rotation policy: cap each log file at MAX_FILE_BYTES, keep MAX_BACKUPS rotated
6
+ // copies (`<file>.1` is the most recent rotation, `<file>.<MAX_BACKUPS>` is the
7
+ // oldest and is deleted on the next rotation).
8
+ // One file maxed out + N backups bounds disk usage at roughly
9
+ // MAX_FILE_BYTES * (MAX_BACKUPS + 1)
10
+ // = 10 MB * 6 = 60 MB per log basename.
11
+ const MAX_FILE_BYTES = 10 * 1024 * 1024;
12
+ const MAX_BACKUPS = 5;
5
13
  function ensureLogDir() {
6
14
  fs.mkdirSync(LOG_DIR, { recursive: true });
7
15
  }
@@ -12,6 +20,55 @@ function getLogFile() {
12
20
  function formatTimestamp() {
13
21
  return new Date().toISOString();
14
22
  }
23
+ /**
24
+ * Rotate `logFile` if it exceeds MAX_FILE_BYTES.
25
+ *
26
+ * Strategy: shift `.N -> .N+1`, then rename the live file to `.1`. The next
27
+ * write to `logFile` will create a fresh, empty file.
28
+ *
29
+ * This is intentionally synchronous (CLI hot path, rare event, tiny rename
30
+ * cost) and best-effort — any failure here must NOT throw, so that a broken
31
+ * filesystem state cannot crash the CLI or the MCP. We swallow errors and let
32
+ * the caller fall back to appending to the (possibly oversized) file.
33
+ */
34
+ function rotateIfNeeded(logFile) {
35
+ try {
36
+ const stat = fs.statSync(logFile);
37
+ if (stat.size <= MAX_FILE_BYTES)
38
+ return;
39
+ }
40
+ catch {
41
+ // File doesn't exist yet — nothing to rotate.
42
+ return;
43
+ }
44
+ try {
45
+ // Drop the oldest backup if it exists.
46
+ const oldest = `${logFile}.${MAX_BACKUPS}`;
47
+ try {
48
+ fs.unlinkSync(oldest);
49
+ }
50
+ catch {
51
+ // ignore — may not exist
52
+ }
53
+ // Shift .N -> .N+1, starting from the second-oldest.
54
+ for (let i = MAX_BACKUPS - 1; i >= 1; i--) {
55
+ const src = `${logFile}.${i}`;
56
+ const dest = `${logFile}.${i + 1}`;
57
+ try {
58
+ fs.renameSync(src, dest);
59
+ }
60
+ catch {
61
+ // ignore — backup at this index doesn't exist
62
+ }
63
+ }
64
+ // Live file -> .1. Atomic rename on POSIX.
65
+ fs.renameSync(logFile, `${logFile}.1`);
66
+ }
67
+ catch {
68
+ // Rotation failed — fall through, caller will append to the existing
69
+ // file. Bounded growth is preferred to a crashed CLI.
70
+ }
71
+ }
15
72
  const LOG_LEVELS = {
16
73
  debug: 0,
17
74
  info: 1,
@@ -30,13 +87,15 @@ function writeLog(level, message, meta) {
30
87
  return;
31
88
  try {
32
89
  ensureLogDir();
90
+ const file = getLogFile();
91
+ rotateIfNeeded(file);
33
92
  const entry = {
34
93
  timestamp: formatTimestamp(),
35
94
  level,
36
95
  message,
37
96
  ...(meta ? { meta } : {}),
38
97
  };
39
- fs.appendFileSync(getLogFile(), JSON.stringify(entry) + '\n');
98
+ fs.appendFileSync(file, JSON.stringify(entry) + '\n');
40
99
  }
41
100
  catch {
42
101
  // Silently fail — logging should never crash the CLI
@@ -48,4 +107,12 @@ export const logger = {
48
107
  warn: (message, meta) => writeLog('warn', message, meta),
49
108
  error: (message, meta) => writeLog('error', message, meta),
50
109
  };
110
+ // Exported for tests only. Keep undocumented in public README — the rotation
111
+ // policy is an implementation detail.
112
+ export const __testing = {
113
+ MAX_FILE_BYTES,
114
+ MAX_BACKUPS,
115
+ rotateIfNeeded,
116
+ getLogFile,
117
+ };
51
118
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
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,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;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,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,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE7D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzF;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC/C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC3C,YAAY,CAAC,EAAE,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE7D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzF;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC/C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC3C,YAAY,CAAC,EAAE,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
@@ -118,7 +118,10 @@ export async function promptSelect(message, options, defaultValue) {
118
118
  const marker = options[i].value === defaultValue ? ' (default)' : '';
119
119
  process.stderr.write(` ${i + 1}. ${options[i].label}${marker}\n`);
120
120
  }
121
- const raw = await promptText('Select', defaultValue ? '1' : undefined);
121
+ const defaultIdx = defaultValue
122
+ ? String(options.findIndex((o) => o.value === defaultValue) + 1 || 1)
123
+ : undefined;
124
+ const raw = await promptText('Select', defaultIdx);
122
125
  const index = parseInt(raw, 10) - 1;
123
126
  if (index >= 0 && index < options.length) {
124
127
  return options[index].value;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,9 @@ export declare function truncate(str: string, maxLen: number): string;
33
33
  export declare function createTable(head: string[]): Table.Table;
34
34
  /**
35
35
  * Print a section header with a title and optional count.
36
+ *
37
+ * Writes to stdout — section headers belong to the data stream, not the
38
+ * diagnostic stream. Callers that want to suppress should gate on `isQuietMode()`.
36
39
  */
37
40
  export declare function printSectionHeader(title: string, count?: number): void;
38
41
  //# sourceMappingURL=table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,YAAY,CAAC;AAM/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,OAAO,CAgB9D,CAAC;AAMF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUjD;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAQhE;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAapD;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAclD;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAMvD;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtE"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,YAAY,CAAC;AAM/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,OAAO,CAgB9D,CAAC;AAMF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUjD;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAQhE;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAapD;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAclD;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAMvD;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtE"}
@@ -142,9 +142,12 @@ export function createTable(head) {
142
142
  // ---------------------------------------------------------------------------
143
143
  /**
144
144
  * Print a section header with a title and optional count.
145
+ *
146
+ * Writes to stdout — section headers belong to the data stream, not the
147
+ * diagnostic stream. Callers that want to suppress should gate on `isQuietMode()`.
145
148
  */
146
149
  export function printSectionHeader(title, count) {
147
150
  const countStr = count !== undefined ? ` (${count})` : '';
148
- process.stderr.write(`\n${chalk.bold(title)}${chalk.dim(countStr)}\n`);
151
+ process.stdout.write(`\n${chalk.bold(title)}${chalk.dim(countStr)}\n`);
149
152
  }
150
153
  //# sourceMappingURL=table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/utils/table.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rackmind-cli",
3
- "version": "0.1.6",
4
- "description": "CLI interface for RackMind — Claude Code-style terminal experience for managing servers",
3
+ "version": "0.2.1",
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",
7
7
  "bin": {
@@ -9,7 +9,35 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
- "bin"
12
+ "bin",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/rackmind-ai/rackmind-cli.git"
19
+ },
20
+ "homepage": "https://rackmind.ai",
21
+ "bugs": {
22
+ "url": "https://github.com/rackmind-ai/rackmind-cli/issues"
23
+ },
24
+ "keywords": [
25
+ "rackmind",
26
+ "proxmox",
27
+ "lxc",
28
+ "qemu",
29
+ "msp",
30
+ "homelab",
31
+ "ai",
32
+ "cli",
33
+ "terminal",
34
+ "claude",
35
+ "infrastructure",
36
+ "devops",
37
+ "sysadmin",
38
+ "ssh",
39
+ "ink",
40
+ "anthropic"
13
41
  ],
14
42
  "exports": {
15
43
  ".": "./dist/index.js",
@@ -37,19 +65,23 @@
37
65
  },
38
66
  "scripts": {
39
67
  "dev": "tsx src/index.ts",
40
- "build": "tsc",
68
+ "build": "tsc -p tsconfig.json",
41
69
  "start": "node dist/index.js",
42
70
  "link": "npm link",
43
71
  "lint": "eslint .",
44
72
  "lint:fix": "eslint . --fix",
45
- "format": "prettier --write \"src/**/*.{ts,tsx}\"",
46
- "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
47
- "type-check": "tsc --noEmit",
48
- "prepare": "husky"
73
+ "format": "prettier --write .",
74
+ "format:check": "prettier --check .",
75
+ "type-check": "tsc --noEmit -p tsconfig.typecheck.json",
76
+ "test": "vitest run",
77
+ "test:homelab": "./scripts/test-against-homelab.sh",
78
+ "check": "npm run lint && npm run format:check && npm run type-check && npm test",
79
+ "prepare": "husky || true",
80
+ "prepublishOnly": "npm run check && npm run build"
49
81
  },
50
82
  "lint-staged": {
51
83
  "*.{ts,tsx}": [
52
- "eslint --fix --max-warnings 0",
84
+ "eslint --fix --max-warnings 0 --no-warn-ignored",
53
85
  "prettier --write"
54
86
  ],
55
87
  "*.json": [
@@ -57,12 +89,12 @@
57
89
  ]
58
90
  },
59
91
  "author": "RackMind <hello@rackmind.ai>",
60
- "license": "UNLICENSED",
92
+ "license": "MIT",
61
93
  "engines": {
62
94
  "node": ">=20.0.0"
63
95
  },
64
96
  "dependencies": {
65
- "@anthropic-ai/sdk": "^0.80.0",
97
+ "@anthropic-ai/sdk": "^0.90.0",
66
98
  "chalk": "^5.4.1",
67
99
  "cli-table3": "^0.6.5",
68
100
  "commander": "^13.1.0",
@@ -91,6 +123,7 @@
91
123
  "prettier": "^3.8.1",
92
124
  "tsx": "^4.19.4",
93
125
  "typescript": "^5.9.3",
94
- "typescript-eslint": "^8.57.0"
126
+ "typescript-eslint": "^8.57.0",
127
+ "vitest": "^4.1.4"
95
128
  }
96
129
  }
@@ -1,71 +0,0 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
- import type { ServerClient } from '../server/client.js';
3
- export interface AIClientOptions {
4
- /** Anthropic API key */
5
- apiKey: string;
6
- /** Model to use (default: claude-sonnet-4-5) */
7
- model?: string;
8
- /** Max tokens for the response */
9
- maxTokens?: number;
10
- /** API request timeout in milliseconds (default: 120000) */
11
- timeoutMs?: number;
12
- }
13
- export interface StreamCallbacks {
14
- /** Called for each text chunk as it streams in */
15
- onText: (text: string) => void;
16
- /** Called when a tool is about to be executed */
17
- onToolStart: (toolName: string, label: string) => void;
18
- /** Called when a tool finishes executing */
19
- onToolEnd: (toolName: string, label: string, isError: boolean) => void;
20
- /** Called when an error occurs */
21
- onError: (error: string) => void;
22
- }
23
- export interface ConversationMessage {
24
- role: 'user' | 'assistant';
25
- content: string;
26
- }
27
- export interface ToolExecution {
28
- toolName: string;
29
- label: string;
30
- isError: boolean;
31
- content: string;
32
- }
33
- export interface MultiTurnCallbacks extends StreamCallbacks {
34
- /** Called when a tool execution result is available (for display in REPL) */
35
- onToolResult?: (execution: ToolExecution) => void;
36
- }
37
- export declare class AIClient {
38
- private readonly anthropic;
39
- private readonly model;
40
- private readonly maxTokens;
41
- constructor(options: AIClientOptions);
42
- /**
43
- * Send a one-shot query to Claude with full server context and tool use.
44
- *
45
- * This method:
46
- * 1. Fetches live server context from the Proxmox API
47
- * 2. Builds a system prompt with the context
48
- * 3. Sends the user's query to Claude with tool definitions
49
- * 4. Streams the response, executing any tool calls in a loop
50
- * 5. Returns when Claude produces a final text response (stop_reason = "end_turn")
51
- */
52
- chat(query: string, serverClient: ServerClient, serverAlias: string, callbacks: StreamCallbacks): Promise<void>;
53
- /**
54
- * Multi-turn conversation method for the interactive REPL.
55
- *
56
- * Unlike `chat()`, this accepts the full conversation history so far
57
- * and appends the new user query. It returns the updated history
58
- * (including the assistant's response) for the caller to persist.
59
- *
60
- * The caller is responsible for building up `history` across turns.
61
- */
62
- chatMultiTurn(query: string, history: Anthropic.Messages.MessageParam[], serverClient: ServerClient, serverAlias: string, callbacks: MultiTurnCallbacks): Promise<Anthropic.Messages.MessageParam[]>;
63
- /**
64
- * Create a message with retry logic for transient errors.
65
- * Rate limits and overload errors trigger exponential backoff.
66
- */
67
- private createWithRetry;
68
- /** Get the current model name */
69
- getModel(): string;
70
- }
71
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"AASA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWxD,MAAM,WAAW,eAAe;IAC5B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,kDAAkD;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,iDAAiD;IACjD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,4CAA4C;IAC5C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,kCAAkC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AASD,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACvD,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;CACrD;AAMD,qBAAa,QAAQ;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,eAAe;IASpC;;;;;;;;;OASG;IACG,IAAI,CACN,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;IAwEhB;;;;;;;;OAQG;IACG,aAAa,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAC1C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,kBAAkB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;IAsF7C;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiCvB,iCAAiC;IACjC,QAAQ,IAAI,MAAM;CAGrB"}