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
package/dist/ai/client.js DELETED
@@ -1,198 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // AI client — Claude API integration with tool use loop
3
- // ---------------------------------------------------------------------------
4
- // Wraps @anthropic-ai/sdk to handle:
5
- // 1. Sending messages with system prompt + tools
6
- // 2. Streaming text responses to a callback
7
- // 3. Executing tool calls and feeding results back until a final text response
8
- // ---------------------------------------------------------------------------
9
- import Anthropic from '@anthropic-ai/sdk';
10
- import { getToolDefinitions } from './tools.js';
11
- import { fetchServerContext, buildSystemPrompt } from './system-prompt.js';
12
- import { executeTool } from './tool-executor.js';
13
- import { logger } from '../utils/logger.js';
14
- import { withRetry, isTransientError, isRateLimitError } from '../utils/retry.js';
15
- // Max iterations for the tool use loop to prevent infinite loops
16
- const MAX_TOOL_ITERATIONS = 20;
17
- // ---------------------------------------------------------------------------
18
- // AI Client
19
- // ---------------------------------------------------------------------------
20
- export class AIClient {
21
- anthropic;
22
- model;
23
- maxTokens;
24
- constructor(options) {
25
- this.anthropic = new Anthropic({
26
- apiKey: options.apiKey,
27
- timeout: options.timeoutMs ?? 120_000, // 2 minutes default
28
- });
29
- this.model = options.model ?? 'claude-sonnet-4-5';
30
- this.maxTokens = options.maxTokens ?? 4096;
31
- }
32
- /**
33
- * Send a one-shot query to Claude with full server context and tool use.
34
- *
35
- * This method:
36
- * 1. Fetches live server context from the Proxmox API
37
- * 2. Builds a system prompt with the context
38
- * 3. Sends the user's query to Claude with tool definitions
39
- * 4. Streams the response, executing any tool calls in a loop
40
- * 5. Returns when Claude produces a final text response (stop_reason = "end_turn")
41
- */
42
- async chat(query, serverClient, serverAlias, callbacks) {
43
- // Fetch live server context
44
- const context = await fetchServerContext(serverClient);
45
- const systemPrompt = buildSystemPrompt(context, serverAlias);
46
- const tools = getToolDefinitions();
47
- // Build initial messages
48
- const messages = [{ role: 'user', content: query }];
49
- // Tool use loop — keep going until Claude gives a final text response
50
- for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
51
- logger.debug('AI request iteration', { iteration, messageCount: messages.length });
52
- const response = await this.createWithRetry(systemPrompt, tools, messages, callbacks);
53
- // Process the response content blocks
54
- const assistantContent = [];
55
- const toolUseBlocks = [];
56
- for (const block of response.content) {
57
- assistantContent.push(block);
58
- if (block.type === 'text') {
59
- callbacks.onText(block.text);
60
- }
61
- else if (block.type === 'tool_use') {
62
- toolUseBlocks.push(block);
63
- }
64
- }
65
- // Add the assistant's response to the conversation
66
- messages.push({ role: 'assistant', content: assistantContent });
67
- // If Claude is done (no more tool calls), we're finished
68
- if (response.stop_reason === 'end_turn' || toolUseBlocks.length === 0) {
69
- logger.debug('AI conversation complete', {
70
- iterations: iteration + 1,
71
- stopReason: response.stop_reason,
72
- });
73
- return;
74
- }
75
- // Execute all tool calls and collect results
76
- const toolResults = [];
77
- for (const toolBlock of toolUseBlocks) {
78
- const toolInput = toolBlock.input;
79
- callbacks.onToolStart(toolBlock.name, toolBlock.name);
80
- const result = await executeTool(toolBlock.name, toolInput, serverClient);
81
- callbacks.onToolEnd(toolBlock.name, result.label, result.isError);
82
- toolResults.push({
83
- type: 'tool_result',
84
- tool_use_id: toolBlock.id,
85
- content: result.content,
86
- is_error: result.isError,
87
- });
88
- }
89
- // Add tool results to the conversation and loop back
90
- messages.push({ role: 'user', content: toolResults });
91
- }
92
- callbacks.onError('Reached maximum tool iterations. The AI may be stuck in a loop.');
93
- }
94
- /**
95
- * Multi-turn conversation method for the interactive REPL.
96
- *
97
- * Unlike `chat()`, this accepts the full conversation history so far
98
- * and appends the new user query. It returns the updated history
99
- * (including the assistant's response) for the caller to persist.
100
- *
101
- * The caller is responsible for building up `history` across turns.
102
- */
103
- async chatMultiTurn(query, history, serverClient, serverAlias, callbacks) {
104
- // Fetch live server context
105
- const context = await fetchServerContext(serverClient);
106
- const systemPrompt = buildSystemPrompt(context, serverAlias);
107
- const tools = getToolDefinitions();
108
- // Clone history and append the new user message
109
- const messages = [
110
- ...history,
111
- { role: 'user', content: query },
112
- ];
113
- // Tool use loop
114
- for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
115
- logger.debug('AI multi-turn request iteration', {
116
- iteration,
117
- messageCount: messages.length,
118
- });
119
- const response = await this.createWithRetry(systemPrompt, tools, messages, callbacks);
120
- // Process content blocks
121
- const assistantContent = [];
122
- const toolUseBlocks = [];
123
- for (const block of response.content) {
124
- assistantContent.push(block);
125
- if (block.type === 'text') {
126
- callbacks.onText(block.text);
127
- }
128
- else if (block.type === 'tool_use') {
129
- toolUseBlocks.push(block);
130
- }
131
- }
132
- messages.push({ role: 'assistant', content: assistantContent });
133
- // If done, return the full updated history
134
- if (response.stop_reason === 'end_turn' || toolUseBlocks.length === 0) {
135
- logger.debug('AI multi-turn conversation turn complete', {
136
- iterations: iteration + 1,
137
- stopReason: response.stop_reason,
138
- });
139
- return messages;
140
- }
141
- // Execute tool calls
142
- const toolResults = [];
143
- for (const toolBlock of toolUseBlocks) {
144
- const toolInput = toolBlock.input;
145
- callbacks.onToolStart(toolBlock.name, toolBlock.name);
146
- const result = await executeTool(toolBlock.name, toolInput, serverClient);
147
- callbacks.onToolEnd(toolBlock.name, result.label, result.isError);
148
- if (callbacks.onToolResult) {
149
- callbacks.onToolResult({
150
- toolName: toolBlock.name,
151
- label: result.label,
152
- isError: result.isError,
153
- content: result.content,
154
- });
155
- }
156
- toolResults.push({
157
- type: 'tool_result',
158
- tool_use_id: toolBlock.id,
159
- content: result.content,
160
- is_error: result.isError,
161
- });
162
- }
163
- messages.push({ role: 'user', content: toolResults });
164
- }
165
- callbacks.onError('Reached maximum tool iterations. The AI may be stuck in a loop.');
166
- return messages;
167
- }
168
- /**
169
- * Create a message with retry logic for transient errors.
170
- * Rate limits and overload errors trigger exponential backoff.
171
- */
172
- createWithRetry(system, tools, messages, callbacks) {
173
- return withRetry(() => this.anthropic.messages.create({
174
- model: this.model,
175
- max_tokens: this.maxTokens,
176
- system,
177
- tools,
178
- messages,
179
- }), {
180
- maxAttempts: 3,
181
- initialDelayMs: 2000,
182
- maxDelayMs: 30_000,
183
- isRetryable: isTransientError,
184
- onRetry: (attempt, error, delayMs) => {
185
- const msg = error instanceof Error ? error.message : String(error);
186
- const isRateLimit = isRateLimitError(error);
187
- const label = isRateLimit ? 'Rate limited' : 'API error';
188
- callbacks.onError(`${label}, retrying in ${Math.round(delayMs / 1000)}s (attempt ${attempt + 1}/3)...`);
189
- logger.warn('API call retry', { attempt, delayMs, error: msg });
190
- },
191
- });
192
- }
193
- /** Get the current model name */
194
- getModel() {
195
- return this.model;
196
- }
197
- }
198
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"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"}