centaurus-cli 3.0.1 → 3.1.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.
Files changed (552) hide show
  1. package/dist/ai/types.js +0 -1
  2. package/dist/ai/types.js.map +1 -1
  3. package/dist/cli-adapter.js +5047 -5158
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/commands/CommandParser.js +372 -315
  6. package/dist/commands/CommandParser.js.map +1 -1
  7. package/dist/config/build-config.js +11 -42
  8. package/dist/config/build-config.js.map +1 -1
  9. package/dist/config/defaultConfig.js +94 -82
  10. package/dist/config/defaultConfig.js.map +1 -1
  11. package/dist/config/manager.js +144 -160
  12. package/dist/config/manager.js.map +1 -1
  13. package/dist/config/mcp-config-manager.js +411 -364
  14. package/dist/config/mcp-config-manager.js.map +1 -1
  15. package/dist/config/models.js +118 -185
  16. package/dist/config/models.js.map +1 -1
  17. package/dist/config/slash-commands.js +186 -184
  18. package/dist/config/slash-commands.js.map +1 -1
  19. package/dist/config/types.js +33 -26
  20. package/dist/config/types.js.map +1 -1
  21. package/dist/context/command-detector.js +63 -67
  22. package/dist/context/command-detector.js.map +1 -1
  23. package/dist/context/context-manager.js +533 -518
  24. package/dist/context/context-manager.js.map +1 -1
  25. package/dist/context/handlers/docker-handler.js +518 -576
  26. package/dist/context/handlers/docker-handler.js.map +1 -1
  27. package/dist/context/handlers/ssh-handler.js +1050 -1109
  28. package/dist/context/handlers/ssh-handler.js.map +1 -1
  29. package/dist/context/handlers/wsl-handler.js +558 -630
  30. package/dist/context/handlers/wsl-handler.js.map +1 -1
  31. package/dist/context/index.js +42 -6
  32. package/dist/context/index.js.map +1 -1
  33. package/dist/context/subshell-handler.js +0 -4
  34. package/dist/context/subshell-handler.js.map +1 -1
  35. package/dist/context/types.js +20 -31
  36. package/dist/context/types.js.map +1 -1
  37. package/dist/hooks/useConnectivity.js +13 -10
  38. package/dist/hooks/useConnectivity.js.map +1 -1
  39. package/dist/hooks/useTerminalDimensions.js +67 -79
  40. package/dist/hooks/useTerminalDimensions.js.map +1 -1
  41. package/dist/index.js +228 -251
  42. package/dist/index.js.map +1 -1
  43. package/dist/mcp/mcp-command-handler.js +297 -260
  44. package/dist/mcp/mcp-command-handler.js.map +1 -1
  45. package/dist/mcp/mcp-server-manager.js +139 -155
  46. package/dist/mcp/mcp-server-manager.js.map +1 -1
  47. package/dist/mcp/mcp-tool-wrapper.js +74 -94
  48. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  49. package/dist/services/ai-autocomplete-agent.js +169 -181
  50. package/dist/services/ai-autocomplete-agent.js.map +1 -1
  51. package/dist/services/ai-context-injector.js +180 -93
  52. package/dist/services/ai-context-injector.js.map +1 -1
  53. package/dist/services/ai-service-client.js +513 -456
  54. package/dist/services/ai-service-client.js.map +1 -1
  55. package/dist/services/api-client.js +443 -441
  56. package/dist/services/api-client.js.map +1 -1
  57. package/dist/services/auth-handler.js +162 -198
  58. package/dist/services/auth-handler.js.map +1 -1
  59. package/dist/services/background-task-manager.js +258 -282
  60. package/dist/services/background-task-manager.js.map +1 -1
  61. package/dist/services/checkpoint-manager.js +1526 -1512
  62. package/dist/services/checkpoint-manager.js.map +1 -1
  63. package/dist/services/clipboard-service.js +151 -200
  64. package/dist/services/clipboard-service.js.map +1 -1
  65. package/dist/services/connectivity-manager.js +63 -65
  66. package/dist/services/connectivity-manager.js.map +1 -1
  67. package/dist/services/conversation-manager.js +118 -121
  68. package/dist/services/conversation-manager.js.map +1 -1
  69. package/dist/services/environment-context-injector.js +160 -187
  70. package/dist/services/environment-context-injector.js.map +1 -1
  71. package/dist/services/fast-context-agent.js +203 -243
  72. package/dist/services/fast-context-agent.js.map +1 -1
  73. package/dist/services/input-detection-agent.js +190 -202
  74. package/dist/services/input-detection-agent.js.map +1 -1
  75. package/dist/services/input-requirement-detector.js +155 -189
  76. package/dist/services/input-requirement-detector.js.map +1 -1
  77. package/dist/services/local-chat-storage.js +342 -365
  78. package/dist/services/local-chat-storage.js.map +1 -1
  79. package/dist/services/monitored-shell-manager.js +225 -233
  80. package/dist/services/monitored-shell-manager.js.map +1 -1
  81. package/dist/services/ollama-service.js +293 -310
  82. package/dist/services/ollama-service.js.map +1 -1
  83. package/dist/services/rules-storage.js +142 -0
  84. package/dist/services/rules-storage.js.map +1 -0
  85. package/dist/services/session-quota-manager.js +219 -235
  86. package/dist/services/session-quota-manager.js.map +1 -1
  87. package/dist/services/shell-input-agent.js +299 -334
  88. package/dist/services/shell-input-agent.js.map +1 -1
  89. package/dist/services/sub-agent-manager.js +459 -501
  90. package/dist/services/sub-agent-manager.js.map +1 -1
  91. package/dist/services/warpify-detector.js +133 -183
  92. package/dist/services/warpify-detector.js.map +1 -1
  93. package/dist/services/workflow-storage.js +202 -217
  94. package/dist/services/workflow-storage.js.map +1 -1
  95. package/dist/test-ssh-handler.js +148 -193
  96. package/dist/test-ssh-handler.js.map +1 -1
  97. package/dist/tools/add-mcp.js +161 -0
  98. package/dist/tools/add-mcp.js.map +1 -0
  99. package/dist/tools/background-command.js +240 -273
  100. package/dist/tools/background-command.js.map +1 -1
  101. package/dist/tools/command.js +447 -440
  102. package/dist/tools/command.js.map +1 -1
  103. package/dist/tools/create-image.js +172 -202
  104. package/dist/tools/create-image.js.map +1 -1
  105. package/dist/tools/enter-remote-session.js +169 -215
  106. package/dist/tools/enter-remote-session.js.map +1 -1
  107. package/dist/tools/fast-context.js +60 -67
  108. package/dist/tools/fast-context.js.map +1 -1
  109. package/dist/tools/file-ops.js +601 -572
  110. package/dist/tools/file-ops.js.map +1 -1
  111. package/dist/tools/find-files.js +262 -303
  112. package/dist/tools/find-files.js.map +1 -1
  113. package/dist/tools/get-diff.js +423 -406
  114. package/dist/tools/get-diff.js.map +1 -1
  115. package/dist/tools/grep-search.js +966 -948
  116. package/dist/tools/grep-search.js.map +1 -1
  117. package/dist/tools/inspect-symbol.js +308 -323
  118. package/dist/tools/inspect-symbol.js.map +1 -1
  119. package/dist/tools/plan-mode.js +459 -503
  120. package/dist/tools/plan-mode.js.map +1 -1
  121. package/dist/tools/read-binary-file.js +160 -190
  122. package/dist/tools/read-binary-file.js.map +1 -1
  123. package/dist/tools/registry.js +100 -84
  124. package/dist/tools/registry.js.map +1 -1
  125. package/dist/tools/reproduce_issue.js +170 -151
  126. package/dist/tools/reproduce_issue.js.map +1 -1
  127. package/dist/tools/sub-agent.js +223 -228
  128. package/dist/tools/sub-agent.js.map +1 -1
  129. package/dist/tools/task-complete.js +28 -27
  130. package/dist/tools/task-complete.js.map +1 -1
  131. package/dist/tools/types.js +0 -1
  132. package/dist/tools/types.js.map +1 -1
  133. package/dist/tools/validation.js +96 -118
  134. package/dist/tools/validation.js.map +1 -1
  135. package/dist/tools/web-search.js +194 -194
  136. package/dist/tools/web-search.js.map +1 -1
  137. package/dist/tools/workflow-tool.js +77 -82
  138. package/dist/tools/workflow-tool.js.map +1 -1
  139. package/dist/types/index.js +0 -1
  140. package/dist/types/index.js.map +1 -1
  141. package/dist/types/rule.js +1 -0
  142. package/dist/types/rule.js.map +1 -0
  143. package/dist/types/workflow.js +0 -7
  144. package/dist/types/workflow.js.map +1 -1
  145. package/dist/ui/components/AgentTimer.js +24 -25
  146. package/dist/ui/components/AgentTimer.js.map +1 -1
  147. package/dist/ui/components/App.js +3266 -3263
  148. package/dist/ui/components/App.js.map +1 -1
  149. package/dist/ui/components/AuthScreen.js +22 -34
  150. package/dist/ui/components/AuthScreen.js.map +1 -1
  151. package/dist/ui/components/AuthWelcomeScreen.js +30 -24
  152. package/dist/ui/components/AuthWelcomeScreen.js.map +1 -1
  153. package/dist/ui/components/Breadcrumbs.js +53 -82
  154. package/dist/ui/components/Breadcrumbs.js.map +1 -1
  155. package/dist/ui/components/CircularSelectInput.js +59 -67
  156. package/dist/ui/components/CircularSelectInput.js.map +1 -1
  157. package/dist/ui/components/ClipboardFileAutocomplete.js +78 -39
  158. package/dist/ui/components/ClipboardFileAutocomplete.js.map +1 -1
  159. package/dist/ui/components/CodeBlock.js +24 -42
  160. package/dist/ui/components/CodeBlock.js.map +1 -1
  161. package/dist/ui/components/ConfigViewer.js +18 -25
  162. package/dist/ui/components/ConfigViewer.js.map +1 -1
  163. package/dist/ui/components/ConfirmPrompt.js +49 -71
  164. package/dist/ui/components/ConfirmPrompt.js.map +1 -1
  165. package/dist/ui/components/ConnectionStatusMessage.js +32 -83
  166. package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
  167. package/dist/ui/components/ContextWindowIndicator.js +34 -49
  168. package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
  169. package/dist/ui/components/DetailedPlanReviewScreen.js +104 -106
  170. package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -1
  171. package/dist/ui/components/DiffViewer.js +68 -121
  172. package/dist/ui/components/DiffViewer.js.map +1 -1
  173. package/dist/ui/components/ErrorBoundary.js +40 -48
  174. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  175. package/dist/ui/components/FileCreationPreview.js +29 -60
  176. package/dist/ui/components/FileCreationPreview.js.map +1 -1
  177. package/dist/ui/components/FileOperation.js +34 -29
  178. package/dist/ui/components/FileOperation.js.map +1 -1
  179. package/dist/ui/components/FileTagAutocomplete.js +55 -25
  180. package/dist/ui/components/FileTagAutocomplete.js.map +1 -1
  181. package/dist/ui/components/FontRecommendation.js.map +1 -1
  182. package/dist/ui/components/GitDiffBreadcrumb.js +29 -0
  183. package/dist/ui/components/GitDiffBreadcrumb.js.map +1 -0
  184. package/dist/ui/components/InputBox.js +1620 -2150
  185. package/dist/ui/components/InputBox.js.map +1 -1
  186. package/dist/ui/components/InteractiveShell.js +234 -352
  187. package/dist/ui/components/InteractiveShell.js.map +1 -1
  188. package/dist/ui/components/KeyboardHelp.js +34 -35
  189. package/dist/ui/components/KeyboardHelp.js.map +1 -1
  190. package/dist/ui/components/LoadingIndicator.js +22 -25
  191. package/dist/ui/components/LoadingIndicator.js.map +1 -1
  192. package/dist/ui/components/MCPAddScreen.js +40 -51
  193. package/dist/ui/components/MCPAddScreen.js.map +1 -1
  194. package/dist/ui/components/MCPListScreen.js +40 -48
  195. package/dist/ui/components/MCPListScreen.js.map +1 -1
  196. package/dist/ui/components/MCPServerListScreen.js +49 -56
  197. package/dist/ui/components/MCPServerListScreen.js.map +1 -1
  198. package/dist/ui/components/MarkdownRenderer.js +69 -96
  199. package/dist/ui/components/MarkdownRenderer.js.map +1 -1
  200. package/dist/ui/components/MessageBox.js +66 -48
  201. package/dist/ui/components/MessageBox.js.map +1 -1
  202. package/dist/ui/components/MessageDisplay.js +150 -142
  203. package/dist/ui/components/MessageDisplay.js.map +1 -1
  204. package/dist/ui/components/MonitorModeAIPanel.js +46 -65
  205. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -1
  206. package/dist/ui/components/MultiLineInput.js +243 -277
  207. package/dist/ui/components/MultiLineInput.js.map +1 -1
  208. package/dist/ui/components/PasswordPrompt.js +37 -18
  209. package/dist/ui/components/PasswordPrompt.js.map +1 -1
  210. package/dist/ui/components/PlanAcceptedMessage.js +27 -38
  211. package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
  212. package/dist/ui/components/PlanReviewScreen.js +46 -50
  213. package/dist/ui/components/PlanReviewScreen.js.map +1 -1
  214. package/dist/ui/components/RulesEditorScreen.js +81 -0
  215. package/dist/ui/components/RulesEditorScreen.js.map +1 -0
  216. package/dist/ui/components/SelectPrompt.js +19 -8
  217. package/dist/ui/components/SelectPrompt.js.map +1 -1
  218. package/dist/ui/components/ShimmerText.js +44 -0
  219. package/dist/ui/components/ShimmerText.js.map +1 -0
  220. package/dist/ui/components/SlashCommandAutocomplete.js +49 -22
  221. package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
  222. package/dist/ui/components/StatusBar.js +56 -87
  223. package/dist/ui/components/StatusBar.js.map +1 -1
  224. package/dist/ui/components/StreamingMessageDisplay.js +116 -99
  225. package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
  226. package/dist/ui/components/TaskCompletedMessage.js +28 -23
  227. package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
  228. package/dist/ui/components/TaskProgressIndicator.js +44 -70
  229. package/dist/ui/components/TaskProgressIndicator.js.map +1 -1
  230. package/dist/ui/components/ThinkingDisplay.js +44 -41
  231. package/dist/ui/components/ThinkingDisplay.js.map +1 -1
  232. package/dist/ui/components/ToolExecutionMessage.js +772 -1326
  233. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  234. package/dist/ui/components/ToolExecutionStatus.js +53 -84
  235. package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
  236. package/dist/ui/components/ToolResult.js +22 -15
  237. package/dist/ui/components/ToolResult.js.map +1 -1
  238. package/dist/ui/components/VersionUpdatePrompt.js +88 -120
  239. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  240. package/dist/ui/components/WelcomeBanner.js +176 -26
  241. package/dist/ui/components/WelcomeBanner.js.map +1 -1
  242. package/dist/ui/components/WorkflowCreatorScreen.js +94 -161
  243. package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -1
  244. package/dist/utils/ansi-encoder.js +30 -61
  245. package/dist/utils/ansi-encoder.js.map +1 -1
  246. package/dist/utils/chat-formatter.js +327 -305
  247. package/dist/utils/chat-formatter.js.map +1 -1
  248. package/dist/utils/command-history.js +152 -174
  249. package/dist/utils/command-history.js.map +1 -1
  250. package/dist/utils/context-sanitizer.js +49 -112
  251. package/dist/utils/context-sanitizer.js.map +1 -1
  252. package/dist/utils/conversation-logger.js +292 -324
  253. package/dist/utils/conversation-logger.js.map +1 -1
  254. package/dist/utils/custom-commands-manager.js +126 -131
  255. package/dist/utils/custom-commands-manager.js.map +1 -1
  256. package/dist/utils/editor-utils.js +732 -837
  257. package/dist/utils/editor-utils.js.map +1 -1
  258. package/dist/utils/file.js +174 -213
  259. package/dist/utils/file.js.map +1 -1
  260. package/dist/utils/git-stats.js +169 -0
  261. package/dist/utils/git-stats.js.map +1 -0
  262. package/dist/utils/input-classifier.js +960 -482
  263. package/dist/utils/input-classifier.js.map +1 -1
  264. package/dist/utils/logger.js +48 -73
  265. package/dist/utils/logger.js.map +1 -1
  266. package/dist/utils/markdown-parser.js +277 -310
  267. package/dist/utils/markdown-parser.js.map +1 -1
  268. package/dist/utils/rule-reference-resolver.js +54 -0
  269. package/dist/utils/rule-reference-resolver.js.map +1 -0
  270. package/dist/utils/shell.js +144 -156
  271. package/dist/utils/shell.js.map +1 -1
  272. package/dist/utils/state.js +23 -22
  273. package/dist/utils/state.js.map +1 -1
  274. package/dist/utils/syntax-checker.js +279 -327
  275. package/dist/utils/syntax-checker.js.map +1 -1
  276. package/dist/utils/terminal-output.js +199 -302
  277. package/dist/utils/terminal-output.js.map +1 -1
  278. package/dist/utils/text-clipboard.js +47 -70
  279. package/dist/utils/text-clipboard.js.map +1 -1
  280. package/dist/utils/unicode-sanitizer.js +134 -197
  281. package/dist/utils/unicode-sanitizer.js.map +1 -1
  282. package/dist/utils/version-checker.js +46 -56
  283. package/dist/utils/version-checker.js.map +1 -1
  284. package/package.json +6 -4
  285. package/dist/ai/types.d.ts +0 -20
  286. package/dist/ai/types.d.ts.map +0 -1
  287. package/dist/cli-adapter.d.ts +0 -514
  288. package/dist/cli-adapter.d.ts.map +0 -1
  289. package/dist/commands/CommandParser.d.ts +0 -27
  290. package/dist/commands/CommandParser.d.ts.map +0 -1
  291. package/dist/config/build-config.d.ts +0 -42
  292. package/dist/config/build-config.d.ts.map +0 -1
  293. package/dist/config/defaultConfig.d.ts +0 -79
  294. package/dist/config/defaultConfig.d.ts.map +0 -1
  295. package/dist/config/manager.d.ts +0 -62
  296. package/dist/config/manager.d.ts.map +0 -1
  297. package/dist/config/mcp-config-manager.d.ts +0 -79
  298. package/dist/config/mcp-config-manager.d.ts.map +0 -1
  299. package/dist/config/models.d.ts +0 -83
  300. package/dist/config/models.d.ts.map +0 -1
  301. package/dist/config/slash-commands.d.ts +0 -23
  302. package/dist/config/slash-commands.d.ts.map +0 -1
  303. package/dist/config/types.d.ts +0 -35
  304. package/dist/config/types.d.ts.map +0 -1
  305. package/dist/context/command-detector.d.ts +0 -50
  306. package/dist/context/command-detector.d.ts.map +0 -1
  307. package/dist/context/context-manager.d.ts +0 -157
  308. package/dist/context/context-manager.d.ts.map +0 -1
  309. package/dist/context/handlers/docker-handler.d.ts +0 -130
  310. package/dist/context/handlers/docker-handler.d.ts.map +0 -1
  311. package/dist/context/handlers/ssh-handler.d.ts +0 -201
  312. package/dist/context/handlers/ssh-handler.d.ts.map +0 -1
  313. package/dist/context/handlers/wsl-handler.d.ts +0 -146
  314. package/dist/context/handlers/wsl-handler.d.ts.map +0 -1
  315. package/dist/context/index.d.ts +0 -8
  316. package/dist/context/index.d.ts.map +0 -1
  317. package/dist/context/subshell-handler.d.ts +0 -165
  318. package/dist/context/subshell-handler.d.ts.map +0 -1
  319. package/dist/context/types.d.ts +0 -70
  320. package/dist/context/types.d.ts.map +0 -1
  321. package/dist/hooks/useConnectivity.d.ts +0 -2
  322. package/dist/hooks/useConnectivity.d.ts.map +0 -1
  323. package/dist/hooks/useTerminalDimensions.d.ts +0 -41
  324. package/dist/hooks/useTerminalDimensions.d.ts.map +0 -1
  325. package/dist/index.d.ts +0 -9
  326. package/dist/index.d.ts.map +0 -1
  327. package/dist/mcp/mcp-command-handler.d.ts +0 -47
  328. package/dist/mcp/mcp-command-handler.d.ts.map +0 -1
  329. package/dist/mcp/mcp-server-manager.d.ts +0 -30
  330. package/dist/mcp/mcp-server-manager.d.ts.map +0 -1
  331. package/dist/mcp/mcp-tool-wrapper.d.ts +0 -12
  332. package/dist/mcp/mcp-tool-wrapper.d.ts.map +0 -1
  333. package/dist/services/ai-autocomplete-agent.d.ts +0 -39
  334. package/dist/services/ai-autocomplete-agent.d.ts.map +0 -1
  335. package/dist/services/ai-context-injector.d.ts +0 -41
  336. package/dist/services/ai-context-injector.d.ts.map +0 -1
  337. package/dist/services/ai-service-client.d.ts +0 -128
  338. package/dist/services/ai-service-client.d.ts.map +0 -1
  339. package/dist/services/api-client.d.ts +0 -353
  340. package/dist/services/api-client.d.ts.map +0 -1
  341. package/dist/services/auth-handler.d.ts +0 -30
  342. package/dist/services/auth-handler.d.ts.map +0 -1
  343. package/dist/services/background-task-manager.d.ts +0 -114
  344. package/dist/services/background-task-manager.d.ts.map +0 -1
  345. package/dist/services/checkpoint-manager.d.ts +0 -204
  346. package/dist/services/checkpoint-manager.d.ts.map +0 -1
  347. package/dist/services/clipboard-service.d.ts +0 -37
  348. package/dist/services/clipboard-service.d.ts.map +0 -1
  349. package/dist/services/connectivity-manager.d.ts +0 -18
  350. package/dist/services/connectivity-manager.d.ts.map +0 -1
  351. package/dist/services/conversation-manager.d.ts +0 -73
  352. package/dist/services/conversation-manager.d.ts.map +0 -1
  353. package/dist/services/environment-context-injector.d.ts +0 -69
  354. package/dist/services/environment-context-injector.d.ts.map +0 -1
  355. package/dist/services/fast-context-agent.d.ts +0 -12
  356. package/dist/services/fast-context-agent.d.ts.map +0 -1
  357. package/dist/services/input-detection-agent.d.ts +0 -40
  358. package/dist/services/input-detection-agent.d.ts.map +0 -1
  359. package/dist/services/input-requirement-detector.d.ts +0 -28
  360. package/dist/services/input-requirement-detector.d.ts.map +0 -1
  361. package/dist/services/local-chat-storage.d.ts +0 -182
  362. package/dist/services/local-chat-storage.d.ts.map +0 -1
  363. package/dist/services/monitored-shell-manager.d.ts +0 -120
  364. package/dist/services/monitored-shell-manager.d.ts.map +0 -1
  365. package/dist/services/ollama-service.d.ts +0 -197
  366. package/dist/services/ollama-service.d.ts.map +0 -1
  367. package/dist/services/session-quota-manager.d.ts +0 -101
  368. package/dist/services/session-quota-manager.d.ts.map +0 -1
  369. package/dist/services/shell-input-agent.d.ts +0 -89
  370. package/dist/services/shell-input-agent.d.ts.map +0 -1
  371. package/dist/services/sub-agent-manager.d.ts +0 -140
  372. package/dist/services/sub-agent-manager.d.ts.map +0 -1
  373. package/dist/services/warpify-detector.d.ts +0 -43
  374. package/dist/services/warpify-detector.d.ts.map +0 -1
  375. package/dist/services/workflow-storage.d.ts +0 -72
  376. package/dist/services/workflow-storage.d.ts.map +0 -1
  377. package/dist/test-ssh-handler.d.ts +0 -8
  378. package/dist/test-ssh-handler.d.ts.map +0 -1
  379. package/dist/tools/background-command.d.ts +0 -11
  380. package/dist/tools/background-command.d.ts.map +0 -1
  381. package/dist/tools/command.d.ts +0 -3
  382. package/dist/tools/command.d.ts.map +0 -1
  383. package/dist/tools/create-image.d.ts +0 -10
  384. package/dist/tools/create-image.d.ts.map +0 -1
  385. package/dist/tools/enter-remote-session.d.ts +0 -48
  386. package/dist/tools/enter-remote-session.d.ts.map +0 -1
  387. package/dist/tools/fast-context.d.ts +0 -3
  388. package/dist/tools/fast-context.d.ts.map +0 -1
  389. package/dist/tools/file-ops.d.ts +0 -7
  390. package/dist/tools/file-ops.d.ts.map +0 -1
  391. package/dist/tools/find-files.d.ts +0 -49
  392. package/dist/tools/find-files.d.ts.map +0 -1
  393. package/dist/tools/get-diff.d.ts +0 -14
  394. package/dist/tools/get-diff.d.ts.map +0 -1
  395. package/dist/tools/grep-search.d.ts +0 -155
  396. package/dist/tools/grep-search.d.ts.map +0 -1
  397. package/dist/tools/inspect-symbol.d.ts +0 -32
  398. package/dist/tools/inspect-symbol.d.ts.map +0 -1
  399. package/dist/tools/plan-mode.d.ts +0 -140
  400. package/dist/tools/plan-mode.d.ts.map +0 -1
  401. package/dist/tools/read-binary-file.d.ts +0 -10
  402. package/dist/tools/read-binary-file.d.ts.map +0 -1
  403. package/dist/tools/registry.d.ts +0 -31
  404. package/dist/tools/registry.d.ts.map +0 -1
  405. package/dist/tools/reproduce_issue.d.ts +0 -2
  406. package/dist/tools/reproduce_issue.d.ts.map +0 -1
  407. package/dist/tools/sub-agent.d.ts +0 -9
  408. package/dist/tools/sub-agent.d.ts.map +0 -1
  409. package/dist/tools/task-complete.d.ts +0 -3
  410. package/dist/tools/task-complete.d.ts.map +0 -1
  411. package/dist/tools/types.d.ts +0 -40
  412. package/dist/tools/types.d.ts.map +0 -1
  413. package/dist/tools/validation.d.ts +0 -47
  414. package/dist/tools/validation.d.ts.map +0 -1
  415. package/dist/tools/web-search.d.ts +0 -24
  416. package/dist/tools/web-search.d.ts.map +0 -1
  417. package/dist/tools/workflow-tool.d.ts +0 -11
  418. package/dist/tools/workflow-tool.d.ts.map +0 -1
  419. package/dist/types/index.d.ts +0 -123
  420. package/dist/types/index.d.ts.map +0 -1
  421. package/dist/types/workflow.d.ts +0 -110
  422. package/dist/types/workflow.d.ts.map +0 -1
  423. package/dist/ui/components/AgentTimer.d.ts +0 -7
  424. package/dist/ui/components/AgentTimer.d.ts.map +0 -1
  425. package/dist/ui/components/App.d.ts +0 -197
  426. package/dist/ui/components/App.d.ts.map +0 -1
  427. package/dist/ui/components/AuthScreen.d.ts +0 -8
  428. package/dist/ui/components/AuthScreen.d.ts.map +0 -1
  429. package/dist/ui/components/AuthWelcomeScreen.d.ts +0 -8
  430. package/dist/ui/components/AuthWelcomeScreen.d.ts.map +0 -1
  431. package/dist/ui/components/Breadcrumbs.d.ts +0 -13
  432. package/dist/ui/components/Breadcrumbs.d.ts.map +0 -1
  433. package/dist/ui/components/CircularSelectInput.d.ts +0 -24
  434. package/dist/ui/components/CircularSelectInput.d.ts.map +0 -1
  435. package/dist/ui/components/ClipboardFileAutocomplete.d.ts +0 -10
  436. package/dist/ui/components/ClipboardFileAutocomplete.d.ts.map +0 -1
  437. package/dist/ui/components/CodeBlock.d.ts +0 -9
  438. package/dist/ui/components/CodeBlock.d.ts.map +0 -1
  439. package/dist/ui/components/ConfigViewer.d.ts +0 -11
  440. package/dist/ui/components/ConfigViewer.d.ts.map +0 -1
  441. package/dist/ui/components/ConfirmPrompt.d.ts +0 -13
  442. package/dist/ui/components/ConfirmPrompt.d.ts.map +0 -1
  443. package/dist/ui/components/ConnectionStatusMessage.d.ts +0 -17
  444. package/dist/ui/components/ConnectionStatusMessage.d.ts.map +0 -1
  445. package/dist/ui/components/ContextWindowIndicator.d.ts +0 -8
  446. package/dist/ui/components/ContextWindowIndicator.d.ts.map +0 -1
  447. package/dist/ui/components/DetailedPlanReviewScreen.d.ts +0 -17
  448. package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +0 -1
  449. package/dist/ui/components/DiffViewer.d.ts +0 -9
  450. package/dist/ui/components/DiffViewer.d.ts.map +0 -1
  451. package/dist/ui/components/ErrorBoundary.d.ts +0 -17
  452. package/dist/ui/components/ErrorBoundary.d.ts.map +0 -1
  453. package/dist/ui/components/FileCreationPreview.d.ts +0 -8
  454. package/dist/ui/components/FileCreationPreview.d.ts.map +0 -1
  455. package/dist/ui/components/FileOperation.d.ts +0 -10
  456. package/dist/ui/components/FileOperation.d.ts.map +0 -1
  457. package/dist/ui/components/FileTagAutocomplete.d.ts +0 -11
  458. package/dist/ui/components/FileTagAutocomplete.d.ts.map +0 -1
  459. package/dist/ui/components/FontRecommendation.d.ts +0 -1
  460. package/dist/ui/components/FontRecommendation.d.ts.map +0 -1
  461. package/dist/ui/components/InputBox.d.ts +0 -42
  462. package/dist/ui/components/InputBox.d.ts.map +0 -1
  463. package/dist/ui/components/InteractiveShell.d.ts +0 -30
  464. package/dist/ui/components/InteractiveShell.d.ts.map +0 -1
  465. package/dist/ui/components/KeyboardHelp.d.ts +0 -7
  466. package/dist/ui/components/KeyboardHelp.d.ts.map +0 -1
  467. package/dist/ui/components/LoadingIndicator.d.ts +0 -3
  468. package/dist/ui/components/LoadingIndicator.d.ts.map +0 -1
  469. package/dist/ui/components/MCPAddScreen.d.ts +0 -13
  470. package/dist/ui/components/MCPAddScreen.d.ts.map +0 -1
  471. package/dist/ui/components/MCPListScreen.d.ts +0 -17
  472. package/dist/ui/components/MCPListScreen.d.ts.map +0 -1
  473. package/dist/ui/components/MCPServerListScreen.d.ts +0 -16
  474. package/dist/ui/components/MCPServerListScreen.d.ts.map +0 -1
  475. package/dist/ui/components/MarkdownRenderer.d.ts +0 -8
  476. package/dist/ui/components/MarkdownRenderer.d.ts.map +0 -1
  477. package/dist/ui/components/MessageBox.d.ts +0 -10
  478. package/dist/ui/components/MessageBox.d.ts.map +0 -1
  479. package/dist/ui/components/MessageDisplay.d.ts +0 -14
  480. package/dist/ui/components/MessageDisplay.d.ts.map +0 -1
  481. package/dist/ui/components/MonitorModeAIPanel.d.ts +0 -23
  482. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +0 -1
  483. package/dist/ui/components/MultiLineInput.d.ts +0 -13
  484. package/dist/ui/components/MultiLineInput.d.ts.map +0 -1
  485. package/dist/ui/components/PasswordPrompt.d.ts +0 -9
  486. package/dist/ui/components/PasswordPrompt.d.ts.map +0 -1
  487. package/dist/ui/components/PlanAcceptedMessage.d.ts +0 -20
  488. package/dist/ui/components/PlanAcceptedMessage.d.ts.map +0 -1
  489. package/dist/ui/components/PlanReviewScreen.d.ts +0 -14
  490. package/dist/ui/components/PlanReviewScreen.d.ts.map +0 -1
  491. package/dist/ui/components/SelectPrompt.d.ts +0 -12
  492. package/dist/ui/components/SelectPrompt.d.ts.map +0 -1
  493. package/dist/ui/components/SlashCommandAutocomplete.d.ts +0 -13
  494. package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +0 -1
  495. package/dist/ui/components/StatusBar.d.ts +0 -14
  496. package/dist/ui/components/StatusBar.d.ts.map +0 -1
  497. package/dist/ui/components/StreamingMessageDisplay.d.ts +0 -15
  498. package/dist/ui/components/StreamingMessageDisplay.d.ts.map +0 -1
  499. package/dist/ui/components/TaskCompletedMessage.d.ts +0 -14
  500. package/dist/ui/components/TaskCompletedMessage.d.ts.map +0 -1
  501. package/dist/ui/components/TaskProgressIndicator.d.ts +0 -18
  502. package/dist/ui/components/TaskProgressIndicator.d.ts.map +0 -1
  503. package/dist/ui/components/ThinkingDisplay.d.ts +0 -15
  504. package/dist/ui/components/ThinkingDisplay.d.ts.map +0 -1
  505. package/dist/ui/components/ToolExecutionMessage.d.ts +0 -8
  506. package/dist/ui/components/ToolExecutionMessage.d.ts.map +0 -1
  507. package/dist/ui/components/ToolExecutionStatus.d.ts +0 -10
  508. package/dist/ui/components/ToolExecutionStatus.d.ts.map +0 -1
  509. package/dist/ui/components/ToolResult.d.ts +0 -10
  510. package/dist/ui/components/ToolResult.d.ts.map +0 -1
  511. package/dist/ui/components/VersionUpdatePrompt.d.ts +0 -9
  512. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +0 -1
  513. package/dist/ui/components/WelcomeBanner.d.ts +0 -3
  514. package/dist/ui/components/WelcomeBanner.d.ts.map +0 -1
  515. package/dist/ui/components/WorkflowCreatorScreen.d.ts +0 -25
  516. package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +0 -1
  517. package/dist/utils/ansi-encoder.d.ts +0 -7
  518. package/dist/utils/ansi-encoder.d.ts.map +0 -1
  519. package/dist/utils/chat-formatter.d.ts +0 -12
  520. package/dist/utils/chat-formatter.d.ts.map +0 -1
  521. package/dist/utils/command-history.d.ts +0 -24
  522. package/dist/utils/command-history.d.ts.map +0 -1
  523. package/dist/utils/context-sanitizer.d.ts +0 -50
  524. package/dist/utils/context-sanitizer.d.ts.map +0 -1
  525. package/dist/utils/conversation-logger.d.ts +0 -142
  526. package/dist/utils/conversation-logger.d.ts.map +0 -1
  527. package/dist/utils/custom-commands-manager.d.ts +0 -59
  528. package/dist/utils/custom-commands-manager.d.ts.map +0 -1
  529. package/dist/utils/editor-utils.d.ts +0 -101
  530. package/dist/utils/editor-utils.d.ts.map +0 -1
  531. package/dist/utils/file.d.ts +0 -61
  532. package/dist/utils/file.d.ts.map +0 -1
  533. package/dist/utils/input-classifier.d.ts +0 -25
  534. package/dist/utils/input-classifier.d.ts.map +0 -1
  535. package/dist/utils/logger.d.ts +0 -17
  536. package/dist/utils/logger.d.ts.map +0 -1
  537. package/dist/utils/markdown-parser.d.ts +0 -60
  538. package/dist/utils/markdown-parser.d.ts.map +0 -1
  539. package/dist/utils/shell.d.ts +0 -47
  540. package/dist/utils/shell.d.ts.map +0 -1
  541. package/dist/utils/state.d.ts +0 -13
  542. package/dist/utils/state.d.ts.map +0 -1
  543. package/dist/utils/syntax-checker.d.ts +0 -24
  544. package/dist/utils/syntax-checker.d.ts.map +0 -1
  545. package/dist/utils/terminal-output.d.ts +0 -25
  546. package/dist/utils/terminal-output.d.ts.map +0 -1
  547. package/dist/utils/text-clipboard.d.ts +0 -12
  548. package/dist/utils/text-clipboard.d.ts.map +0 -1
  549. package/dist/utils/unicode-sanitizer.d.ts +0 -44
  550. package/dist/utils/unicode-sanitizer.d.ts.map +0 -1
  551. package/dist/utils/version-checker.d.ts +0 -14
  552. package/dist/utils/version-checker.d.ts.map +0 -1
@@ -1,242 +1,226 @@
1
- /**
2
- * Session Quota Manager
3
- *
4
- * Tracks and enforces rate limits based on backend configuration.
5
- * Each agent loop turn counts as one message.
6
- * Configuration is fetched from backend API on startup with fallback defaults.
7
- */
8
- import * as fs from 'fs';
9
- import * as path from 'path';
10
- import * as os from 'os';
11
- import { logError, logWarning, logInfo } from '../utils/logger.js';
12
- import { apiClient } from './api-client.js';
13
- // Default constants (fallback if backend is unreachable)
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ import { logError, logWarning, logInfo } from "../utils/logger.js";
5
+ import { apiClient } from "./api-client.js";
14
6
  let MAX_MESSAGES_PER_SESSION = 50;
15
- let SESSION_DURATION_MS = 4 * 60 * 60 * 1000; // 4 hours in milliseconds
7
+ let SESSION_DURATION_MS = 4 * 60 * 60 * 1e3;
16
8
  let WARNING_THRESHOLD = 10;
17
- /**
18
- * SessionQuotaManager class for managing rate limits
19
- */
20
9
  class SessionQuotaManager {
21
- quotaFilePath;
22
- configFilePath;
23
- state;
24
- configLoaded = false;
25
- constructor() {
26
- const homeDir = os.homedir();
27
- const centaurusDir = path.join(homeDir, '.centaurus');
28
- this.quotaFilePath = path.join(centaurusDir, 'session-quota.json');
29
- this.configFilePath = path.join(centaurusDir, 'rate-limits-config.json');
30
- // Ensure directory exists
31
- if (!fs.existsSync(centaurusDir)) {
32
- fs.mkdirSync(centaurusDir, { recursive: true });
33
- }
34
- // Load cached config first (sync, for immediate use)
35
- this.loadCachedConfig();
36
- // Load or initialize state
37
- this.state = this.loadState();
38
- }
39
- /**
40
- * Load cached config from disk (synced on previous fetch)
41
- */
42
- loadCachedConfig() {
43
- try {
44
- if (fs.existsSync(this.configFilePath)) {
45
- const data = fs.readFileSync(this.configFilePath, 'utf-8');
46
- const config = JSON.parse(data);
47
- this.applyConfig(config);
48
- this.configLoaded = true;
49
- }
50
- }
51
- catch (error) {
52
- logWarning(`Failed to load cached rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);
53
- }
54
- }
55
- /**
56
- * Apply configuration values
57
- */
58
- applyConfig(config) {
59
- MAX_MESSAGES_PER_SESSION = config.maxMessagesPerSession;
60
- SESSION_DURATION_MS = config.sessionDurationHours * 60 * 60 * 1000;
61
- WARNING_THRESHOLD = config.warningThreshold || 10;
62
- }
63
- /**
64
- * Save config to disk for caching
65
- */
66
- saveConfigCache(config) {
67
- try {
68
- fs.writeFileSync(this.configFilePath, JSON.stringify(config, null, 2), 'utf-8');
69
- }
70
- catch (error) {
71
- logWarning(`Failed to cache rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);
72
- }
73
- }
74
- /**
75
- * Fetch configuration from backend API
76
- * Call this on CLI startup to get latest config
77
- */
78
- async fetchConfigFromBackend() {
79
- try {
80
- const config = await apiClient.getRateLimitsConfig();
81
- if (config) {
82
- this.applyConfig(config);
83
- this.saveConfigCache(config);
84
- this.configLoaded = true;
85
- logInfo(`Rate limits config fetched from backend: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);
86
- }
87
- }
88
- catch (error) {
89
- // Backend unreachable - use cached or default config
90
- if (!this.configLoaded) {
91
- logWarning(`Backend unreachable for rate limits config, using defaults: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);
92
- }
93
- }
94
- }
95
- /**
96
- * Load quota state from disk, or create fresh state if expired or missing
97
- */
98
- loadState() {
99
- try {
100
- if (fs.existsSync(this.quotaFilePath)) {
101
- const data = fs.readFileSync(this.quotaFilePath, 'utf-8');
102
- const state = JSON.parse(data);
103
- // Check if session has expired
104
- const now = Date.now();
105
- const sessionAge = now - state.sessionStartTime;
106
- if (sessionAge >= SESSION_DURATION_MS) {
107
- // Session expired, return fresh state (but don't save yet)
108
- return this.createFreshState();
109
- }
110
- return state;
111
- }
112
- }
113
- catch (error) {
114
- logWarning(`Failed to load session quota state: ${error instanceof Error ? error.message : 'Unknown error'}`);
115
- }
116
- return this.createFreshState();
117
- }
118
- /**
119
- * Create a fresh session state
120
- */
121
- createFreshState() {
122
- return {
123
- sessionStartTime: 0, // Will be set on first message
124
- messagesUsed: 0
125
- };
126
- }
127
- /**
128
- * Save current state to disk
129
- */
130
- saveState() {
131
- try {
132
- fs.writeFileSync(this.quotaFilePath, JSON.stringify(this.state, null, 2), 'utf-8');
133
- }
134
- catch (error) {
135
- logError('Failed to save session quota state', error instanceof Error ? error : new Error(String(error)));
136
- }
137
- }
138
- /**
139
- * Check if session has expired and reset if needed
140
- */
141
- checkAndResetIfExpired() {
142
- if (this.state.sessionStartTime === 0) {
143
- // No session started yet
144
- return;
145
- }
10
+ quotaFilePath;
11
+ configFilePath;
12
+ state;
13
+ configLoaded = false;
14
+ currentPlan = "free";
15
+ constructor() {
16
+ const homeDir = os.homedir();
17
+ const centaurusDir = path.join(homeDir, ".centaurus");
18
+ this.quotaFilePath = path.join(centaurusDir, "session-quota.json");
19
+ this.configFilePath = path.join(centaurusDir, "rate-limits-config.json");
20
+ if (!fs.existsSync(centaurusDir)) {
21
+ fs.mkdirSync(centaurusDir, { recursive: true });
22
+ }
23
+ this.loadCachedConfig();
24
+ this.state = this.loadState();
25
+ }
26
+ /**
27
+ * Load cached config from disk (synced on previous fetch)
28
+ */
29
+ loadCachedConfig() {
30
+ try {
31
+ if (fs.existsSync(this.configFilePath)) {
32
+ const data = fs.readFileSync(this.configFilePath, "utf-8");
33
+ const config = JSON.parse(data);
34
+ this.applyConfig(config);
35
+ this.configLoaded = true;
36
+ }
37
+ } catch (error) {
38
+ logWarning(`Failed to load cached rate limits config: ${error instanceof Error ? error.message : "Unknown error"}`);
39
+ }
40
+ }
41
+ /**
42
+ * Apply configuration values
43
+ */
44
+ applyConfig(config) {
45
+ MAX_MESSAGES_PER_SESSION = config.maxMessagesPerSession;
46
+ SESSION_DURATION_MS = config.sessionDurationHours * 60 * 60 * 1e3;
47
+ WARNING_THRESHOLD = config.warningThreshold || 10;
48
+ if (config.defaultPlan) {
49
+ this.currentPlan = config.defaultPlan;
50
+ }
51
+ }
52
+ /**
53
+ * Save config to disk for caching
54
+ */
55
+ saveConfigCache(config) {
56
+ try {
57
+ fs.writeFileSync(this.configFilePath, JSON.stringify(config, null, 2), "utf-8");
58
+ } catch (error) {
59
+ logWarning(`Failed to cache rate limits config: ${error instanceof Error ? error.message : "Unknown error"}`);
60
+ }
61
+ }
62
+ /**
63
+ * Fetch configuration from backend API
64
+ * Call this on CLI startup to get latest config
65
+ */
66
+ async fetchConfigFromBackend() {
67
+ try {
68
+ const config = await apiClient.getRateLimitsConfig();
69
+ if (config) {
70
+ this.applyConfig(config);
71
+ this.saveConfigCache(config);
72
+ this.configLoaded = true;
73
+ logInfo(`Rate limits config fetched from backend: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1e3)}h`);
74
+ }
75
+ } catch (error) {
76
+ if (!this.configLoaded) {
77
+ logWarning(`Backend unreachable for rate limits config, using defaults: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1e3)}h`);
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Load quota state from disk, or create fresh state if expired or missing
83
+ */
84
+ loadState() {
85
+ try {
86
+ if (fs.existsSync(this.quotaFilePath)) {
87
+ const data = fs.readFileSync(this.quotaFilePath, "utf-8");
88
+ const state = JSON.parse(data);
146
89
  const now = Date.now();
147
- const sessionAge = now - this.state.sessionStartTime;
90
+ const sessionAge = now - state.sessionStartTime;
148
91
  if (sessionAge >= SESSION_DURATION_MS) {
149
- // Session expired, reset state
150
- this.state = this.createFreshState();
151
- // Don't save yet - will be saved when first message is sent
152
- }
153
- }
154
- /**
155
- * Check if user can send a message (has remaining quota)
156
- */
157
- canSendMessage() {
158
- this.checkAndResetIfExpired();
159
- return this.state.messagesUsed < MAX_MESSAGES_PER_SESSION;
160
- }
161
- /**
162
- * Increment the message count (call this on each agent loop turn)
163
- */
164
- incrementMessageCount() {
165
- this.checkAndResetIfExpired();
166
- // Start session on first message
167
- if (this.state.sessionStartTime === 0) {
168
- this.state.sessionStartTime = Date.now();
169
- }
170
- this.state.messagesUsed++;
171
- this.saveState();
172
- }
173
- /**
174
- * Get the number of remaining messages in the current session
175
- */
176
- getRemainingMessages() {
177
- this.checkAndResetIfExpired();
178
- return Math.max(0, MAX_MESSAGES_PER_SESSION - this.state.messagesUsed);
179
- }
180
- /**
181
- * Get the total messages used in the current session
182
- */
183
- getMessagesUsed() {
184
- this.checkAndResetIfExpired();
185
- return this.state.messagesUsed;
186
- }
187
- /**
188
- * Get time remaining until session resets (in milliseconds)
189
- * Returns 0 if no session has started
190
- */
191
- getTimeUntilReset() {
192
- if (this.state.sessionStartTime === 0) {
193
- return 0;
194
- }
195
- const now = Date.now();
196
- const sessionAge = now - this.state.sessionStartTime;
197
- const timeRemaining = SESSION_DURATION_MS - sessionAge;
198
- return Math.max(0, timeRemaining);
199
- }
200
- /**
201
- * Get formatted time remaining as "Xh Ym" string
202
- */
203
- getFormattedTimeRemaining() {
204
- const timeMs = this.getTimeUntilReset();
205
- if (timeMs <= 0) {
206
- return '0h 0m';
207
- }
208
- const totalMinutes = Math.ceil(timeMs / (60 * 1000));
209
- const hours = Math.floor(totalMinutes / 60);
210
- const minutes = totalMinutes % 60;
211
- if (hours > 0) {
212
- return `${hours}h ${minutes}m`;
213
- }
214
- return `${minutes}m`;
215
- }
216
- /**
217
- * Get session start time (for debugging)
218
- */
219
- getSessionStartTime() {
220
- return this.state.sessionStartTime;
221
- }
222
- /**
223
- * Force reset the session (for testing purposes)
224
- */
225
- resetSession() {
226
- this.state = this.createFreshState();
227
- this.saveState();
228
- }
229
- /**
230
- * Get current config values (for debugging)
231
- */
232
- getCurrentConfig() {
233
- return {
234
- maxMessagesPerSession: MAX_MESSAGES_PER_SESSION,
235
- sessionDurationMs: SESSION_DURATION_MS,
236
- warningThreshold: WARNING_THRESHOLD
237
- };
238
- }
92
+ return this.createFreshState();
93
+ }
94
+ return state;
95
+ }
96
+ } catch (error) {
97
+ logWarning(`Failed to load session quota state: ${error instanceof Error ? error.message : "Unknown error"}`);
98
+ }
99
+ return this.createFreshState();
100
+ }
101
+ /**
102
+ * Create a fresh session state
103
+ */
104
+ createFreshState() {
105
+ return {
106
+ sessionStartTime: 0,
107
+ // Will be set on first message
108
+ messagesUsed: 0
109
+ };
110
+ }
111
+ /**
112
+ * Save current state to disk
113
+ */
114
+ saveState() {
115
+ try {
116
+ fs.writeFileSync(this.quotaFilePath, JSON.stringify(this.state, null, 2), "utf-8");
117
+ } catch (error) {
118
+ logError("Failed to save session quota state", error instanceof Error ? error : new Error(String(error)));
119
+ }
120
+ }
121
+ /**
122
+ * Check if session has expired and reset if needed
123
+ */
124
+ checkAndResetIfExpired() {
125
+ if (this.state.sessionStartTime === 0) {
126
+ return;
127
+ }
128
+ const now = Date.now();
129
+ const sessionAge = now - this.state.sessionStartTime;
130
+ if (sessionAge >= SESSION_DURATION_MS) {
131
+ this.state = this.createFreshState();
132
+ }
133
+ }
134
+ /**
135
+ * Check if user can send a message (has remaining quota)
136
+ */
137
+ canSendMessage() {
138
+ this.checkAndResetIfExpired();
139
+ return this.state.messagesUsed < MAX_MESSAGES_PER_SESSION;
140
+ }
141
+ /**
142
+ * Increment the message count (call this on each agent loop turn)
143
+ */
144
+ incrementMessageCount() {
145
+ this.checkAndResetIfExpired();
146
+ if (this.state.sessionStartTime === 0) {
147
+ this.state.sessionStartTime = Date.now();
148
+ }
149
+ this.state.messagesUsed++;
150
+ this.saveState();
151
+ }
152
+ /**
153
+ * Get the number of remaining messages in the current session
154
+ */
155
+ getRemainingMessages() {
156
+ this.checkAndResetIfExpired();
157
+ return Math.max(0, MAX_MESSAGES_PER_SESSION - this.state.messagesUsed);
158
+ }
159
+ /**
160
+ * Get the total messages used in the current session
161
+ */
162
+ getMessagesUsed() {
163
+ this.checkAndResetIfExpired();
164
+ return this.state.messagesUsed;
165
+ }
166
+ /**
167
+ * Get time remaining until session resets (in milliseconds)
168
+ * Returns 0 if no session has started
169
+ */
170
+ getTimeUntilReset() {
171
+ if (this.state.sessionStartTime === 0) {
172
+ return 0;
173
+ }
174
+ const now = Date.now();
175
+ const sessionAge = now - this.state.sessionStartTime;
176
+ const timeRemaining = SESSION_DURATION_MS - sessionAge;
177
+ return Math.max(0, timeRemaining);
178
+ }
179
+ /**
180
+ * Get formatted time remaining as "Xh Ym" string
181
+ */
182
+ getFormattedTimeRemaining() {
183
+ const timeMs = this.getTimeUntilReset();
184
+ if (timeMs <= 0) {
185
+ return "0h 0m";
186
+ }
187
+ const totalMinutes = Math.ceil(timeMs / (60 * 1e3));
188
+ const hours = Math.floor(totalMinutes / 60);
189
+ const minutes = totalMinutes % 60;
190
+ if (hours > 0) {
191
+ return `${hours}h ${minutes}m`;
192
+ }
193
+ return `${minutes}m`;
194
+ }
195
+ /**
196
+ * Get session start time (for debugging)
197
+ */
198
+ getSessionStartTime() {
199
+ return this.state.sessionStartTime;
200
+ }
201
+ /**
202
+ * Force reset the session (for testing purposes)
203
+ */
204
+ resetSession() {
205
+ this.state = this.createFreshState();
206
+ this.saveState();
207
+ }
208
+ /**
209
+ * Get current config values (for debugging)
210
+ */
211
+ getCurrentConfig() {
212
+ return {
213
+ maxMessagesPerSession: MAX_MESSAGES_PER_SESSION,
214
+ sessionDurationMs: SESSION_DURATION_MS,
215
+ warningThreshold: WARNING_THRESHOLD
216
+ };
217
+ }
218
+ getPlan() {
219
+ return this.currentPlan;
220
+ }
239
221
  }
240
- // Export singleton instance
241
- export const sessionQuotaManager = new SessionQuotaManager();
222
+ const sessionQuotaManager = new SessionQuotaManager();
223
+ export {
224
+ sessionQuotaManager
225
+ };
242
226
  //# sourceMappingURL=session-quota-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-quota-manager.js","sourceRoot":"","sources":["../../src/services/session-quota-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/services/session-quota-manager.ts"],"sourcesContent":["/**\r\n * Session Quota Manager\r\n * \r\n * Tracks and enforces rate limits based on backend configuration.\r\n * Each agent loop turn counts as one message.\r\n * Configuration is fetched from backend API on startup with fallback defaults.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logError, logWarning, logInfo } from '../utils/logger.js';\r\nimport { apiClient } from './api-client.js';\r\n\r\n// Default constants (fallback if backend is unreachable)\r\nlet MAX_MESSAGES_PER_SESSION = 50;\r\nlet SESSION_DURATION_MS = 4 * 60 * 60 * 1000; // 4 hours in milliseconds\r\nlet WARNING_THRESHOLD = 10;\r\n\r\n/**\r\n * Session quota state stored on disk\r\n */\r\ninterface SessionQuotaState {\r\n sessionStartTime: number; // Unix timestamp (ms)\r\n messagesUsed: number; // Count of agent loop turns\r\n}\r\n\r\n/**\r\n * Backend config response\r\n */\r\ninterface SessionQuotaConfig {\r\n maxMessagesPerSession: number;\r\n sessionDurationHours: number;\r\n warningThreshold: number;\r\n defaultPlan: string;\r\n}\r\n\r\n/**\r\n * SessionQuotaManager class for managing rate limits\r\n */\r\nclass SessionQuotaManager {\r\n private quotaFilePath: string;\r\n private configFilePath: string;\r\n private state: SessionQuotaState;\r\n private configLoaded: boolean = false;\r\n private currentPlan: string = 'free';\r\n\r\n constructor() {\r\n const homeDir = os.homedir();\r\n const centaurusDir = path.join(homeDir, '.centaurus');\r\n this.quotaFilePath = path.join(centaurusDir, 'session-quota.json');\r\n this.configFilePath = path.join(centaurusDir, 'rate-limits-config.json');\r\n\r\n // Ensure directory exists\r\n if (!fs.existsSync(centaurusDir)) {\r\n fs.mkdirSync(centaurusDir, { recursive: true });\r\n }\r\n\r\n // Load cached config first (sync, for immediate use)\r\n this.loadCachedConfig();\r\n\r\n // Load or initialize state\r\n this.state = this.loadState();\r\n }\r\n\r\n /**\r\n * Load cached config from disk (synced on previous fetch)\r\n */\r\n private loadCachedConfig(): void {\r\n try {\r\n if (fs.existsSync(this.configFilePath)) {\r\n const data = fs.readFileSync(this.configFilePath, 'utf-8');\r\n const config = JSON.parse(data) as SessionQuotaConfig;\r\n this.applyConfig(config);\r\n this.configLoaded = true;\r\n }\r\n } catch (error) {\r\n logWarning(`Failed to load cached rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Apply configuration values\r\n */\r\n private applyConfig(config: SessionQuotaConfig): void {\r\n MAX_MESSAGES_PER_SESSION = config.maxMessagesPerSession;\r\n SESSION_DURATION_MS = config.sessionDurationHours * 60 * 60 * 1000;\r\n WARNING_THRESHOLD = config.warningThreshold || 10;\r\n if (config.defaultPlan) {\r\n this.currentPlan = config.defaultPlan;\r\n }\r\n }\r\n\r\n /**\r\n * Save config to disk for caching\r\n */\r\n private saveConfigCache(config: SessionQuotaConfig): void {\r\n try {\r\n fs.writeFileSync(this.configFilePath, JSON.stringify(config, null, 2), 'utf-8');\r\n } catch (error) {\r\n logWarning(`Failed to cache rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Fetch configuration from backend API\r\n * Call this on CLI startup to get latest config\r\n */\r\n async fetchConfigFromBackend(): Promise<void> {\r\n try {\r\n const config = await apiClient.getRateLimitsConfig();\r\n\r\n if (config) {\r\n this.applyConfig(config);\r\n this.saveConfigCache(config);\r\n this.configLoaded = true;\r\n logInfo(`Rate limits config fetched from backend: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);\r\n }\r\n } catch (error) {\r\n // Backend unreachable - use cached or default config\r\n if (!this.configLoaded) {\r\n logWarning(`Backend unreachable for rate limits config, using defaults: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load quota state from disk, or create fresh state if expired or missing\r\n */\r\n private loadState(): SessionQuotaState {\r\n try {\r\n if (fs.existsSync(this.quotaFilePath)) {\r\n const data = fs.readFileSync(this.quotaFilePath, 'utf-8');\r\n const state = JSON.parse(data) as SessionQuotaState;\r\n\r\n // Check if session has expired\r\n const now = Date.now();\r\n const sessionAge = now - state.sessionStartTime;\r\n\r\n if (sessionAge >= SESSION_DURATION_MS) {\r\n // Session expired, return fresh state (but don't save yet)\r\n return this.createFreshState();\r\n }\r\n\r\n return state;\r\n }\r\n } catch (error) {\r\n logWarning(`Failed to load session quota state: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n\r\n return this.createFreshState();\r\n }\r\n\r\n /**\r\n * Create a fresh session state\r\n */\r\n private createFreshState(): SessionQuotaState {\r\n return {\r\n sessionStartTime: 0, // Will be set on first message\r\n messagesUsed: 0\r\n };\r\n }\r\n\r\n /**\r\n * Save current state to disk\r\n */\r\n private saveState(): void {\r\n try {\r\n fs.writeFileSync(this.quotaFilePath, JSON.stringify(this.state, null, 2), 'utf-8');\r\n } catch (error) {\r\n logError('Failed to save session quota state', error instanceof Error ? error : new Error(String(error)));\r\n }\r\n }\r\n\r\n /**\r\n * Check if session has expired and reset if needed\r\n */\r\n private checkAndResetIfExpired(): void {\r\n if (this.state.sessionStartTime === 0) {\r\n // No session started yet\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n const sessionAge = now - this.state.sessionStartTime;\r\n\r\n if (sessionAge >= SESSION_DURATION_MS) {\r\n // Session expired, reset state\r\n this.state = this.createFreshState();\r\n // Don't save yet - will be saved when first message is sent\r\n }\r\n }\r\n\r\n /**\r\n * Check if user can send a message (has remaining quota)\r\n */\r\n canSendMessage(): boolean {\r\n this.checkAndResetIfExpired();\r\n return this.state.messagesUsed < MAX_MESSAGES_PER_SESSION;\r\n }\r\n\r\n /**\r\n * Increment the message count (call this on each agent loop turn)\r\n */\r\n incrementMessageCount(): void {\r\n this.checkAndResetIfExpired();\r\n\r\n // Start session on first message\r\n if (this.state.sessionStartTime === 0) {\r\n this.state.sessionStartTime = Date.now();\r\n }\r\n\r\n this.state.messagesUsed++;\r\n this.saveState();\r\n }\r\n\r\n /**\r\n * Get the number of remaining messages in the current session\r\n */\r\n getRemainingMessages(): number {\r\n this.checkAndResetIfExpired();\r\n return Math.max(0, MAX_MESSAGES_PER_SESSION - this.state.messagesUsed);\r\n }\r\n\r\n /**\r\n * Get the total messages used in the current session\r\n */\r\n getMessagesUsed(): number {\r\n this.checkAndResetIfExpired();\r\n return this.state.messagesUsed;\r\n }\r\n\r\n /**\r\n * Get time remaining until session resets (in milliseconds)\r\n * Returns 0 if no session has started\r\n */\r\n getTimeUntilReset(): number {\r\n if (this.state.sessionStartTime === 0) {\r\n return 0;\r\n }\r\n\r\n const now = Date.now();\r\n const sessionAge = now - this.state.sessionStartTime;\r\n const timeRemaining = SESSION_DURATION_MS - sessionAge;\r\n\r\n return Math.max(0, timeRemaining);\r\n }\r\n\r\n /**\r\n * Get formatted time remaining as \"Xh Ym\" string\r\n */\r\n getFormattedTimeRemaining(): string {\r\n const timeMs = this.getTimeUntilReset();\r\n\r\n if (timeMs <= 0) {\r\n return '0h 0m';\r\n }\r\n\r\n const totalMinutes = Math.ceil(timeMs / (60 * 1000));\r\n const hours = Math.floor(totalMinutes / 60);\r\n const minutes = totalMinutes % 60;\r\n\r\n if (hours > 0) {\r\n return `${hours}h ${minutes}m`;\r\n }\r\n return `${minutes}m`;\r\n }\r\n\r\n /**\r\n * Get session start time (for debugging)\r\n */\r\n getSessionStartTime(): number {\r\n return this.state.sessionStartTime;\r\n }\r\n\r\n /**\r\n * Force reset the session (for testing purposes)\r\n */\r\n resetSession(): void {\r\n this.state = this.createFreshState();\r\n this.saveState();\r\n }\r\n\r\n /**\r\n * Get current config values (for debugging)\r\n */\r\n getCurrentConfig() {\r\n return {\r\n maxMessagesPerSession: MAX_MESSAGES_PER_SESSION,\r\n sessionDurationMs: SESSION_DURATION_MS,\r\n warningThreshold: WARNING_THRESHOLD\r\n };\r\n }\r\n\r\n getPlan(): string {\r\n return this.currentPlan;\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const sessionQuotaManager = new SessionQuotaManager();\r\n\r\n// Export types for use elsewhere\r\nexport { SessionQuotaState };\r\n"],"mappings":"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","names":[]}