@phuetz/code-buddy 0.1.18 → 0.1.19

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 (273) hide show
  1. package/dist/agent/background-tasks.d.ts +49 -0
  2. package/dist/agent/background-tasks.js +153 -0
  3. package/dist/agent/background-tasks.js.map +1 -0
  4. package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
  5. package/dist/agent/definitions/agent-definition-loader.js +161 -0
  6. package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
  7. package/dist/agent/definitions/index.d.ts +1 -0
  8. package/dist/agent/definitions/index.js +2 -0
  9. package/dist/agent/definitions/index.js.map +1 -0
  10. package/dist/agent/extended-thinking.d.ts +64 -0
  11. package/dist/agent/extended-thinking.js +103 -0
  12. package/dist/agent/extended-thinking.js.map +1 -0
  13. package/dist/agent/prompt-suggestions.d.ts +55 -0
  14. package/dist/agent/prompt-suggestions.js +125 -0
  15. package/dist/agent/prompt-suggestions.js.map +1 -0
  16. package/dist/agent/rewind-manager.d.ts +59 -0
  17. package/dist/agent/rewind-manager.js +124 -0
  18. package/dist/agent/rewind-manager.js.map +1 -0
  19. package/dist/agent/teams/agent-team.d.ts +54 -0
  20. package/dist/agent/teams/agent-team.js +114 -0
  21. package/dist/agent/teams/agent-team.js.map +1 -0
  22. package/dist/agent/teams/index.d.ts +1 -0
  23. package/dist/agent/teams/index.js +2 -0
  24. package/dist/agent/teams/index.js.map +1 -0
  25. package/dist/agent/teams/team-v2.d.ts +166 -0
  26. package/dist/agent/teams/team-v2.js +376 -0
  27. package/dist/agent/teams/team-v2.js.map +1 -0
  28. package/dist/channels/imessage/index.d.ts +40 -0
  29. package/dist/channels/imessage/index.js +69 -0
  30. package/dist/channels/imessage/index.js.map +1 -0
  31. package/dist/channels/line/index.d.ts +36 -0
  32. package/dist/channels/line/index.js +71 -0
  33. package/dist/channels/line/index.js.map +1 -0
  34. package/dist/channels/mattermost/index.d.ts +34 -0
  35. package/dist/channels/mattermost/index.js +56 -0
  36. package/dist/channels/mattermost/index.js.map +1 -0
  37. package/dist/channels/nextcloud-talk/index.d.ts +37 -0
  38. package/dist/channels/nextcloud-talk/index.js +67 -0
  39. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  40. package/dist/channels/niche-channels.d.ts +61 -0
  41. package/dist/channels/niche-channels.js +131 -0
  42. package/dist/channels/niche-channels.js.map +1 -0
  43. package/dist/channels/nostr/index.d.ts +30 -0
  44. package/dist/channels/nostr/index.js +68 -0
  45. package/dist/channels/nostr/index.js.map +1 -0
  46. package/dist/channels/twilio-voice/index.d.ts +37 -0
  47. package/dist/channels/twilio-voice/index.js +76 -0
  48. package/dist/channels/twilio-voice/index.js.map +1 -0
  49. package/dist/channels/whatsapp/index.js +0 -1
  50. package/dist/channels/whatsapp/index.js.map +1 -1
  51. package/dist/channels/zalo/index.d.ts +28 -0
  52. package/dist/channels/zalo/index.js +53 -0
  53. package/dist/channels/zalo/index.js.map +1 -0
  54. package/dist/cloud/cloud-sessions.d.ts +56 -0
  55. package/dist/cloud/cloud-sessions.js +187 -0
  56. package/dist/cloud/cloud-sessions.js.map +1 -0
  57. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  58. package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
  59. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  60. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  61. package/dist/codebuddy/tool-definitions/index.js +1 -1
  62. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  63. package/dist/commands/handlers/auth-handler.d.ts +32 -0
  64. package/dist/commands/handlers/auth-handler.js +137 -0
  65. package/dist/commands/handlers/auth-handler.js.map +1 -0
  66. package/dist/commands/handlers/context-handler.d.ts +46 -0
  67. package/dist/commands/handlers/context-handler.js +102 -0
  68. package/dist/commands/handlers/context-handler.js.map +1 -0
  69. package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
  70. package/dist/commands/handlers/keybindings-handler.js +124 -0
  71. package/dist/commands/handlers/keybindings-handler.js.map +1 -0
  72. package/dist/commands/handlers/session-commands.d.ts +17 -0
  73. package/dist/commands/handlers/session-commands.js +119 -0
  74. package/dist/commands/handlers/session-commands.js.map +1 -0
  75. package/dist/commands/slash/builtin-commands.js +1 -1
  76. package/dist/commands/slash/builtin-commands.js.map +1 -1
  77. package/dist/config/admin-config.d.ts +54 -0
  78. package/dist/config/admin-config.js +144 -0
  79. package/dist/config/admin-config.js.map +1 -0
  80. package/dist/config/advanced-config.d.ts +118 -0
  81. package/dist/config/advanced-config.js +364 -0
  82. package/dist/config/advanced-config.js.map +1 -0
  83. package/dist/config/managed-policies.d.ts +50 -0
  84. package/dist/config/managed-policies.js +120 -0
  85. package/dist/config/managed-policies.js.map +1 -0
  86. package/dist/config/settings-hierarchy.d.ts +59 -0
  87. package/dist/config/settings-hierarchy.js +188 -0
  88. package/dist/config/settings-hierarchy.js.map +1 -0
  89. package/dist/config/tool-profiles.d.ts +37 -0
  90. package/dist/config/tool-profiles.js +150 -0
  91. package/dist/config/tool-profiles.js.map +1 -0
  92. package/dist/config/user-settings.d.ts +31 -0
  93. package/dist/config/user-settings.js +66 -0
  94. package/dist/config/user-settings.js.map +1 -0
  95. package/dist/context/context-files.d.ts +1 -1
  96. package/dist/context/context-files.js +2 -2
  97. package/dist/context/context-files.js.map +1 -1
  98. package/dist/context/partial-summarizer.d.ts +32 -0
  99. package/dist/context/partial-summarizer.js +144 -0
  100. package/dist/context/partial-summarizer.js.map +1 -0
  101. package/dist/desktop/desktop-app.d.ts +44 -0
  102. package/dist/desktop/desktop-app.js +136 -0
  103. package/dist/desktop/desktop-app.js.map +1 -0
  104. package/dist/git/worktree-sessions.d.ts +24 -0
  105. package/dist/git/worktree-sessions.js +93 -0
  106. package/dist/git/worktree-sessions.js.map +1 -0
  107. package/dist/hooks/advanced-hooks.d.ts +110 -0
  108. package/dist/hooks/advanced-hooks.js +256 -0
  109. package/dist/hooks/advanced-hooks.js.map +1 -0
  110. package/dist/hooks/async-hooks.d.ts +73 -0
  111. package/dist/hooks/async-hooks.js +213 -0
  112. package/dist/hooks/async-hooks.js.map +1 -0
  113. package/dist/hooks/env-persistence.d.ts +58 -0
  114. package/dist/hooks/env-persistence.js +195 -0
  115. package/dist/hooks/env-persistence.js.map +1 -0
  116. package/dist/hooks/hook-events.d.ts +36 -0
  117. package/dist/hooks/hook-events.js +55 -0
  118. package/dist/hooks/hook-events.js.map +1 -0
  119. package/dist/hooks/smart-hooks.d.ts +85 -0
  120. package/dist/hooks/smart-hooks.js +199 -0
  121. package/dist/hooks/smart-hooks.js.map +1 -0
  122. package/dist/ide/jetbrains-plugin.d.ts +55 -0
  123. package/dist/ide/jetbrains-plugin.js +156 -0
  124. package/dist/ide/jetbrains-plugin.js.map +1 -0
  125. package/dist/ide/vscode-extension.d.ts +94 -0
  126. package/dist/ide/vscode-extension.js +229 -0
  127. package/dist/ide/vscode-extension.js.map +1 -0
  128. package/dist/index.js +77 -3
  129. package/dist/index.js.map +1 -1
  130. package/dist/input/file-autocomplete.d.ts +42 -0
  131. package/dist/input/file-autocomplete.js +154 -0
  132. package/dist/input/file-autocomplete.js.map +1 -0
  133. package/dist/integrations/chrome-bridge.d.ts +90 -0
  134. package/dist/integrations/chrome-bridge.js +151 -0
  135. package/dist/integrations/chrome-bridge.js.map +1 -0
  136. package/dist/integrations/github-action-runner.d.ts +40 -0
  137. package/dist/integrations/github-action-runner.js +163 -0
  138. package/dist/integrations/github-action-runner.js.map +1 -0
  139. package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
  140. package/dist/integrations/gitlab-ci-runner.js +104 -0
  141. package/dist/integrations/gitlab-ci-runner.js.map +1 -0
  142. package/dist/integrations/pr-session-linker.d.ts +44 -0
  143. package/dist/integrations/pr-session-linker.js +103 -0
  144. package/dist/integrations/pr-session-linker.js.map +1 -0
  145. package/dist/integrations/tailscale.d.ts +36 -0
  146. package/dist/integrations/tailscale.js +101 -0
  147. package/dist/integrations/tailscale.js.map +1 -0
  148. package/dist/lsp/lsp-client.d.ts +68 -0
  149. package/dist/lsp/lsp-client.js +182 -0
  150. package/dist/lsp/lsp-client.js.map +1 -0
  151. package/dist/mcp/connectors.d.ts +28 -0
  152. package/dist/mcp/connectors.js +148 -0
  153. package/dist/mcp/connectors.js.map +1 -0
  154. package/dist/mcp/index.d.ts +7 -4
  155. package/dist/mcp/index.js +7 -4
  156. package/dist/mcp/index.js.map +1 -1
  157. package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
  158. package/dist/mcp/mcp-auto-discovery.js +104 -0
  159. package/dist/mcp/mcp-auto-discovery.js.map +1 -0
  160. package/dist/mcp/mcp-server.d.ts +70 -0
  161. package/dist/mcp/mcp-server.js +374 -0
  162. package/dist/mcp/mcp-server.js.map +1 -0
  163. package/dist/memory/auto-memory.d.ts +53 -0
  164. package/dist/memory/auto-memory.js +250 -0
  165. package/dist/memory/auto-memory.js.map +1 -0
  166. package/dist/memory/hybrid-search.d.ts +51 -0
  167. package/dist/memory/hybrid-search.js +199 -0
  168. package/dist/memory/hybrid-search.js.map +1 -0
  169. package/dist/memory/memory-flush.d.ts +51 -0
  170. package/dist/memory/memory-flush.js +102 -0
  171. package/dist/memory/memory-flush.js.map +1 -0
  172. package/dist/memory/subagent-memory.d.ts +73 -0
  173. package/dist/memory/subagent-memory.js +172 -0
  174. package/dist/memory/subagent-memory.js.map +1 -0
  175. package/dist/nodes/device-node.d.ts +40 -0
  176. package/dist/nodes/device-node.js +117 -0
  177. package/dist/nodes/device-node.js.map +1 -0
  178. package/dist/output/json-schema-output.d.ts +67 -0
  179. package/dist/output/json-schema-output.js +273 -0
  180. package/dist/output/json-schema-output.js.map +1 -0
  181. package/dist/persistence/session-picker.d.ts +22 -0
  182. package/dist/persistence/session-picker.js +47 -0
  183. package/dist/persistence/session-picker.js.map +1 -0
  184. package/dist/persistence/session-store.d.ts +11 -0
  185. package/dist/persistence/session-store.js +17 -0
  186. package/dist/persistence/session-store.js.map +1 -1
  187. package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
  188. package/dist/plugins/git-pinned-marketplace.js +152 -0
  189. package/dist/plugins/git-pinned-marketplace.js.map +1 -0
  190. package/dist/plugins/plugin-manifest.d.ts +116 -0
  191. package/dist/plugins/plugin-manifest.js +283 -0
  192. package/dist/plugins/plugin-manifest.js.map +1 -0
  193. package/dist/sandbox/os-sandbox.d.ts +49 -1
  194. package/dist/sandbox/os-sandbox.js +347 -6
  195. package/dist/sandbox/os-sandbox.js.map +1 -1
  196. package/dist/sdk/agent-sdk.d.ts +61 -0
  197. package/dist/sdk/agent-sdk.js +90 -0
  198. package/dist/sdk/agent-sdk.js.map +1 -0
  199. package/dist/security/permission-modes.d.ts +76 -0
  200. package/dist/security/permission-modes.js +195 -0
  201. package/dist/security/permission-modes.js.map +1 -0
  202. package/dist/security/permission-patterns.d.ts +61 -0
  203. package/dist/security/permission-patterns.js +171 -0
  204. package/dist/security/permission-patterns.js.map +1 -0
  205. package/dist/security/safe-binaries.d.ts +23 -0
  206. package/dist/security/safe-binaries.js +96 -0
  207. package/dist/security/safe-binaries.js.map +1 -0
  208. package/dist/security/sender-policies.d.ts +46 -0
  209. package/dist/security/sender-policies.js +90 -0
  210. package/dist/security/sender-policies.js.map +1 -0
  211. package/dist/server/dashboard.d.ts +53 -0
  212. package/dist/server/dashboard.js +93 -0
  213. package/dist/server/dashboard.js.map +1 -0
  214. package/dist/services/system-prompt-override.d.ts +34 -0
  215. package/dist/services/system-prompt-override.js +64 -0
  216. package/dist/services/system-prompt-override.js.map +1 -0
  217. package/dist/skills/skill-enhancements.d.ts +37 -0
  218. package/dist/skills/skill-enhancements.js +69 -0
  219. package/dist/skills/skill-enhancements.js.map +1 -0
  220. package/dist/telemetry/otel-tracer.d.ts +98 -0
  221. package/dist/telemetry/otel-tracer.js +245 -0
  222. package/dist/telemetry/otel-tracer.js.map +1 -0
  223. package/dist/tools/browser-stub.d.ts +61 -0
  224. package/dist/tools/browser-stub.js +184 -0
  225. package/dist/tools/browser-stub.js.map +1 -0
  226. package/dist/tools/gateway-tool.d.ts +43 -0
  227. package/dist/tools/gateway-tool.js +92 -0
  228. package/dist/tools/gateway-tool.js.map +1 -0
  229. package/dist/tools/image-stub.d.ts +32 -0
  230. package/dist/tools/image-stub.js +97 -0
  231. package/dist/tools/image-stub.js.map +1 -0
  232. package/dist/tools/js-repl.d.ts +78 -0
  233. package/dist/tools/js-repl.js +280 -0
  234. package/dist/tools/js-repl.js.map +1 -0
  235. package/dist/tools/message-tool.d.ts +42 -0
  236. package/dist/tools/message-tool.js +113 -0
  237. package/dist/tools/message-tool.js.map +1 -0
  238. package/dist/ui/cli-enhancements.d.ts +178 -0
  239. package/dist/ui/cli-enhancements.js +430 -0
  240. package/dist/ui/cli-enhancements.js.map +1 -0
  241. package/dist/ui/status-line.d.ts +90 -0
  242. package/dist/ui/status-line.js +160 -0
  243. package/dist/ui/status-line.js.map +1 -0
  244. package/dist/ui/terminal-enhancements.d.ts +34 -0
  245. package/dist/ui/terminal-enhancements.js +97 -0
  246. package/dist/ui/terminal-enhancements.js.map +1 -0
  247. package/dist/ui/ui-enhancements.d.ts +38 -0
  248. package/dist/ui/ui-enhancements.js +116 -0
  249. package/dist/ui/ui-enhancements.js.map +1 -0
  250. package/dist/utils/custom-instructions.js +4 -1
  251. package/dist/utils/custom-instructions.js.map +1 -1
  252. package/dist/utils/init-project.d.ts +1 -1
  253. package/dist/utils/init-project.js +20 -20
  254. package/dist/utils/init-project.js.map +1 -1
  255. package/dist/utils/output-schema-validator.d.ts +40 -0
  256. package/dist/utils/output-schema-validator.js +137 -0
  257. package/dist/utils/output-schema-validator.js.map +1 -0
  258. package/dist/utils/safety-misc.d.ts +24 -0
  259. package/dist/utils/safety-misc.js +91 -0
  260. package/dist/utils/safety-misc.js.map +1 -0
  261. package/dist/utils/session-enhancements.d.ts +40 -0
  262. package/dist/utils/session-enhancements.js +118 -0
  263. package/dist/utils/session-enhancements.js.map +1 -0
  264. package/dist/utils/shell-snapshot.d.ts +38 -0
  265. package/dist/utils/shell-snapshot.js +323 -0
  266. package/dist/utils/shell-snapshot.js.map +1 -0
  267. package/dist/utils/stream-json-formatter.d.ts +77 -0
  268. package/dist/utils/stream-json-formatter.js +61 -0
  269. package/dist/utils/stream-json-formatter.js.map +1 -0
  270. package/dist/workflows/lobster-engine.d.ts +43 -0
  271. package/dist/workflows/lobster-engine.js +167 -0
  272. package/dist/workflows/lobster-engine.js.map +1 -0
  273. package/package.json +3 -6
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Auth Handler
3
+ *
4
+ * Manages authentication flows for multiple LLM providers,
5
+ * including login, logout, and status reporting.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { logger } from '../../utils/logger.js';
11
+ // ============================================================================
12
+ // Constants
13
+ // ============================================================================
14
+ const KNOWN_PROVIDERS = {
15
+ grok: 'GROK_API_KEY',
16
+ openai: 'OPENAI_API_KEY',
17
+ anthropic: 'ANTHROPIC_API_KEY',
18
+ gemini: 'GEMINI_API_KEY',
19
+ ollama: 'OLLAMA_API_KEY',
20
+ openrouter: 'OPENROUTER_API_KEY',
21
+ };
22
+ // ============================================================================
23
+ // AuthHandler
24
+ // ============================================================================
25
+ export class AuthHandler {
26
+ credentials = {};
27
+ configPath;
28
+ constructor(configDir) {
29
+ const dir = configDir || path.join(os.homedir(), '.codebuddy');
30
+ this.configPath = path.join(dir, 'auth.json');
31
+ this.loadCredentials();
32
+ }
33
+ loadCredentials() {
34
+ try {
35
+ if (fs.existsSync(this.configPath)) {
36
+ this.credentials = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'));
37
+ }
38
+ }
39
+ catch (err) {
40
+ logger.warn('Failed to load auth credentials', { error: err });
41
+ this.credentials = {};
42
+ }
43
+ }
44
+ saveCredentials() {
45
+ try {
46
+ const dir = path.dirname(this.configPath);
47
+ if (!fs.existsSync(dir)) {
48
+ fs.mkdirSync(dir, { recursive: true });
49
+ }
50
+ fs.writeFileSync(this.configPath, JSON.stringify(this.credentials, null, 2), { mode: 0o600 });
51
+ }
52
+ catch (err) {
53
+ logger.warn('Failed to save auth credentials', { error: err });
54
+ }
55
+ }
56
+ login(provider) {
57
+ const providerName = provider || 'grok';
58
+ const envVar = KNOWN_PROVIDERS[providerName];
59
+ if (!envVar) {
60
+ return {
61
+ success: false,
62
+ provider: providerName,
63
+ message: `Unknown provider: ${providerName}. Available: ${Object.keys(KNOWN_PROVIDERS).join(', ')}`,
64
+ };
65
+ }
66
+ // Check environment variable
67
+ const apiKey = process.env[envVar];
68
+ if (!apiKey) {
69
+ return {
70
+ success: false,
71
+ provider: providerName,
72
+ message: `No API key found. Set ${envVar} environment variable.`,
73
+ };
74
+ }
75
+ this.credentials[providerName] = {
76
+ apiKey,
77
+ storedAt: Date.now(),
78
+ };
79
+ this.saveCredentials();
80
+ logger.info(`Logged in to ${providerName}`);
81
+ return {
82
+ success: true,
83
+ provider: providerName,
84
+ message: `Successfully authenticated with ${providerName}.`,
85
+ };
86
+ }
87
+ logout(provider) {
88
+ if (provider) {
89
+ if (this.credentials[provider]) {
90
+ delete this.credentials[provider];
91
+ this.saveCredentials();
92
+ logger.info(`Logged out from ${provider}`);
93
+ return { success: true, message: `Logged out from ${provider}.` };
94
+ }
95
+ return { success: false, message: `Not logged in to ${provider}.` };
96
+ }
97
+ // Logout from all
98
+ const count = Object.keys(this.credentials).length;
99
+ this.credentials = {};
100
+ this.saveCredentials();
101
+ logger.info('Logged out from all providers');
102
+ return { success: true, message: `Logged out from ${count} provider(s).` };
103
+ }
104
+ status() {
105
+ return this.listProviders().map(p => this.getProviderStatus(p));
106
+ }
107
+ getProviderStatus(provider) {
108
+ const stored = this.credentials[provider];
109
+ const envVar = KNOWN_PROVIDERS[provider];
110
+ const envKey = envVar ? process.env[envVar] : undefined;
111
+ const apiKey = stored?.apiKey || envKey || '';
112
+ return {
113
+ authenticated: !!apiKey,
114
+ provider,
115
+ keyPrefix: apiKey ? apiKey.substring(0, 8) + '...' : '',
116
+ expiresAt: stored?.expiresAt,
117
+ };
118
+ }
119
+ listProviders() {
120
+ return Object.keys(KNOWN_PROVIDERS);
121
+ }
122
+ formatStatusTable() {
123
+ const statuses = this.status();
124
+ const lines = [];
125
+ lines.push('Authentication Status:');
126
+ lines.push('─'.repeat(60));
127
+ lines.push(`${'Provider'.padEnd(15)} ${'Status'.padEnd(15)} ${'Key Prefix'.padEnd(15)} Expires`);
128
+ lines.push('─'.repeat(60));
129
+ for (const s of statuses) {
130
+ const statusStr = s.authenticated ? 'authenticated' : 'not configured';
131
+ const expires = s.expiresAt ? new Date(s.expiresAt).toISOString() : 'n/a';
132
+ lines.push(`${s.provider.padEnd(15)} ${statusStr.padEnd(15)} ${s.keyPrefix.padEnd(15)} ${expires}`);
133
+ }
134
+ return lines.join('\n');
135
+ }
136
+ }
137
+ //# sourceMappingURL=auth-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.js","sourceRoot":"","sources":["../../../src/commands/handlers/auth-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Context Visualization Handler
3
+ *
4
+ * Renders a colored grid showing context window usage breakdown.
5
+ * Each cell represents ~1% of the total context window.
6
+ *
7
+ * Colors:
8
+ * Green = available space
9
+ * Blue = system prompt tokens
10
+ * Yellow = message tokens
11
+ * Magenta = tool definition tokens
12
+ *
13
+ * @module commands/handlers/context-handler
14
+ */
15
+ /**
16
+ * Token usage breakdown for the context window
17
+ */
18
+ export interface ContextTokenCounts {
19
+ /** Tokens used by the system prompt */
20
+ systemPrompt: number;
21
+ /** Tokens used by conversation messages */
22
+ messages: number;
23
+ /** Tokens used by tool definitions */
24
+ tools: number;
25
+ /** Tokens available (remaining) */
26
+ available: number;
27
+ /** Total context window size */
28
+ total: number;
29
+ }
30
+ /**
31
+ * Render a colored grid visualizing context window usage.
32
+ *
33
+ * @param counts - Token usage breakdown
34
+ * @returns Formatted string with ANSI colors
35
+ */
36
+ export declare function handleContextVisualization(counts: ContextTokenCounts): string;
37
+ /**
38
+ * Slash command definition for /context-viz
39
+ */
40
+ export declare const CONTEXT_COMMAND: {
41
+ name: string;
42
+ description: string;
43
+ prompt: string;
44
+ filePath: string;
45
+ isBuiltin: boolean;
46
+ };
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Context Visualization Handler
3
+ *
4
+ * Renders a colored grid showing context window usage breakdown.
5
+ * Each cell represents ~1% of the total context window.
6
+ *
7
+ * Colors:
8
+ * Green = available space
9
+ * Blue = system prompt tokens
10
+ * Yellow = message tokens
11
+ * Magenta = tool definition tokens
12
+ *
13
+ * @module commands/handlers/context-handler
14
+ */
15
+ // ANSI color codes
16
+ const COLORS = {
17
+ green: '\x1b[42m', // Background green (available)
18
+ blue: '\x1b[44m', // Background blue (system prompt)
19
+ yellow: '\x1b[43m', // Background yellow (messages)
20
+ magenta: '\x1b[45m', // Background magenta (tools)
21
+ reset: '\x1b[0m',
22
+ bold: '\x1b[1m',
23
+ dim: '\x1b[2m',
24
+ fgGreen: '\x1b[32m',
25
+ fgBlue: '\x1b[34m',
26
+ fgYellow: '\x1b[33m',
27
+ fgMagenta: '\x1b[35m',
28
+ fgWhite: '\x1b[37m',
29
+ };
30
+ /**
31
+ * Grid dimensions
32
+ */
33
+ const GRID_WIDTH = 50;
34
+ const GRID_TOTAL_CELLS = 100;
35
+ /**
36
+ * Render a colored grid visualizing context window usage.
37
+ *
38
+ * @param counts - Token usage breakdown
39
+ * @returns Formatted string with ANSI colors
40
+ */
41
+ export function handleContextVisualization(counts) {
42
+ const { systemPrompt, messages, tools, available, total } = counts;
43
+ // Calculate percentages (ensure they sum to 100)
44
+ const usedTotal = systemPrompt + messages + tools + available;
45
+ const scale = usedTotal > 0 ? total / usedTotal : 1;
46
+ const systemPct = total > 0 ? Math.round((systemPrompt / total) * 100) : 0;
47
+ const messagesPct = total > 0 ? Math.round((messages / total) * 100) : 0;
48
+ const toolsPct = total > 0 ? Math.round((tools / total) * 100) : 0;
49
+ // Available gets the remainder to ensure we always sum to 100
50
+ const availablePct = Math.max(0, 100 - systemPct - messagesPct - toolsPct);
51
+ // Build the grid cells
52
+ const cells = [];
53
+ // Fill cells in order: system prompt, messages, tools, available
54
+ for (let i = 0; i < systemPct && cells.length < GRID_TOTAL_CELLS; i++) {
55
+ cells.push(`${COLORS.blue} ${COLORS.reset}`);
56
+ }
57
+ for (let i = 0; i < messagesPct && cells.length < GRID_TOTAL_CELLS; i++) {
58
+ cells.push(`${COLORS.yellow} ${COLORS.reset}`);
59
+ }
60
+ for (let i = 0; i < toolsPct && cells.length < GRID_TOTAL_CELLS; i++) {
61
+ cells.push(`${COLORS.magenta} ${COLORS.reset}`);
62
+ }
63
+ // Fill remaining with available (green)
64
+ while (cells.length < GRID_TOTAL_CELLS) {
65
+ cells.push(`${COLORS.green} ${COLORS.reset}`);
66
+ }
67
+ // Render grid rows
68
+ const lines = [];
69
+ lines.push(`${COLORS.bold}Context Window Usage${COLORS.reset}`);
70
+ lines.push('');
71
+ for (let row = 0; row < GRID_TOTAL_CELLS / GRID_WIDTH; row++) {
72
+ const start = row * GRID_WIDTH;
73
+ const end = Math.min(start + GRID_WIDTH, GRID_TOTAL_CELLS);
74
+ lines.push(cells.slice(start, end).join(''));
75
+ }
76
+ lines.push('');
77
+ // Legend and summary
78
+ lines.push(`${COLORS.fgBlue}██${COLORS.reset} System Prompt: ${formatTokens(systemPrompt)} (${systemPct}%)`);
79
+ lines.push(`${COLORS.fgYellow}██${COLORS.reset} Messages: ${formatTokens(messages)} (${messagesPct}%)`);
80
+ lines.push(`${COLORS.fgMagenta}██${COLORS.reset} Tools: ${formatTokens(tools)} (${toolsPct}%)`);
81
+ lines.push(`${COLORS.fgGreen}██${COLORS.reset} Available: ${formatTokens(available)} (${availablePct}%)`);
82
+ lines.push('');
83
+ lines.push(`${COLORS.dim}Total: ${formatTokens(total)} tokens${COLORS.reset}`);
84
+ return lines.join('\n');
85
+ }
86
+ /**
87
+ * Format token count with thousands separators
88
+ */
89
+ function formatTokens(n) {
90
+ return n.toLocaleString('en-US');
91
+ }
92
+ /**
93
+ * Slash command definition for /context-viz
94
+ */
95
+ export const CONTEXT_COMMAND = {
96
+ name: 'context-viz',
97
+ description: 'Visualize context window usage as a colored grid',
98
+ prompt: '__CONTEXT_VIZ__',
99
+ filePath: '',
100
+ isBuiltin: true,
101
+ };
102
+ //# sourceMappingURL=context-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-handler.js","sourceRoot":"","sources":["../../../src/commands/handlers/context-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Keybindings Handler
3
+ *
4
+ * Manages custom keybindings for the terminal UI with
5
+ * load/save persistence and sensible defaults.
6
+ */
7
+ export interface KeyBinding {
8
+ key: string;
9
+ action: string;
10
+ context?: string;
11
+ chord?: string[];
12
+ }
13
+ export declare class KeybindingsManager {
14
+ private bindings;
15
+ private configPath;
16
+ constructor(configDir?: string);
17
+ static getInstance(configDir?: string): KeybindingsManager;
18
+ static resetInstance(): void;
19
+ loadKeybindings(): KeyBinding[];
20
+ saveKeybindings(): void;
21
+ setBinding(key: string, action: string, context?: string): void;
22
+ removeBinding(key: string): boolean;
23
+ getBinding(key: string): KeyBinding | undefined;
24
+ listBindings(): KeyBinding[];
25
+ getDefaults(): KeyBinding[];
26
+ resetToDefaults(): void;
27
+ formatBindingsTable(): string;
28
+ }
29
+ export declare function getKeybindingsManager(configDir?: string): KeybindingsManager;
30
+ export declare function resetKeybindingsManager(): void;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Keybindings Handler
3
+ *
4
+ * Manages custom keybindings for the terminal UI with
5
+ * load/save persistence and sensible defaults.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { logger } from '../../utils/logger.js';
11
+ // ============================================================================
12
+ // KeybindingsManager
13
+ // ============================================================================
14
+ let instance = null;
15
+ const DEFAULT_KEYBINDINGS = [
16
+ { key: 'ctrl+c', action: 'cancel' },
17
+ { key: 'ctrl+d', action: 'exit' },
18
+ { key: 'ctrl+l', action: 'clear' },
19
+ { key: 'ctrl+z', action: 'undo' },
20
+ { key: 'ctrl+y', action: 'redo' },
21
+ { key: 'ctrl+s', action: 'save' },
22
+ { key: 'tab', action: 'autocomplete' },
23
+ { key: 'up', action: 'history-prev' },
24
+ { key: 'down', action: 'history-next' },
25
+ { key: 'escape', action: 'dismiss' },
26
+ ];
27
+ export class KeybindingsManager {
28
+ bindings = new Map();
29
+ configPath;
30
+ constructor(configDir) {
31
+ const dir = configDir || path.join(os.homedir(), '.codebuddy');
32
+ this.configPath = path.join(dir, 'keybindings.json');
33
+ }
34
+ static getInstance(configDir) {
35
+ if (!instance) {
36
+ instance = new KeybindingsManager(configDir);
37
+ }
38
+ return instance;
39
+ }
40
+ static resetInstance() {
41
+ instance = null;
42
+ }
43
+ loadKeybindings() {
44
+ try {
45
+ if (fs.existsSync(this.configPath)) {
46
+ const data = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'));
47
+ this.bindings.clear();
48
+ if (Array.isArray(data)) {
49
+ for (const binding of data) {
50
+ this.bindings.set(binding.key, binding);
51
+ }
52
+ }
53
+ logger.debug('Loaded keybindings', { count: this.bindings.size });
54
+ return Array.from(this.bindings.values());
55
+ }
56
+ }
57
+ catch (err) {
58
+ logger.warn('Failed to load keybindings', { error: err });
59
+ }
60
+ // Load defaults if no file
61
+ this.resetToDefaults();
62
+ return Array.from(this.bindings.values());
63
+ }
64
+ saveKeybindings() {
65
+ try {
66
+ const dir = path.dirname(this.configPath);
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ fs.writeFileSync(this.configPath, JSON.stringify(Array.from(this.bindings.values()), null, 2));
71
+ logger.debug('Saved keybindings', { count: this.bindings.size });
72
+ }
73
+ catch (err) {
74
+ logger.warn('Failed to save keybindings', { error: err });
75
+ }
76
+ }
77
+ setBinding(key, action, context) {
78
+ const binding = { key, action };
79
+ if (context) {
80
+ binding.context = context;
81
+ }
82
+ this.bindings.set(key, binding);
83
+ }
84
+ removeBinding(key) {
85
+ return this.bindings.delete(key);
86
+ }
87
+ getBinding(key) {
88
+ return this.bindings.get(key);
89
+ }
90
+ listBindings() {
91
+ return Array.from(this.bindings.values());
92
+ }
93
+ getDefaults() {
94
+ return [...DEFAULT_KEYBINDINGS];
95
+ }
96
+ resetToDefaults() {
97
+ this.bindings.clear();
98
+ for (const binding of DEFAULT_KEYBINDINGS) {
99
+ this.bindings.set(binding.key, { ...binding });
100
+ }
101
+ }
102
+ formatBindingsTable() {
103
+ const bindings = this.listBindings();
104
+ if (bindings.length === 0) {
105
+ return 'No keybindings configured.';
106
+ }
107
+ const lines = [];
108
+ lines.push('Key Bindings:');
109
+ lines.push('─'.repeat(50));
110
+ lines.push(`${'Key'.padEnd(20)} ${'Action'.padEnd(20)} Context`);
111
+ lines.push('─'.repeat(50));
112
+ for (const binding of bindings) {
113
+ lines.push(`${binding.key.padEnd(20)} ${binding.action.padEnd(20)} ${binding.context || ''}`);
114
+ }
115
+ return lines.join('\n');
116
+ }
117
+ }
118
+ export function getKeybindingsManager(configDir) {
119
+ return KeybindingsManager.getInstance(configDir);
120
+ }
121
+ export function resetKeybindingsManager() {
122
+ KeybindingsManager.resetInstance();
123
+ }
124
+ //# sourceMappingURL=keybindings-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keybindings-handler.js","sourceRoot":"","sources":["../../../src/commands/handlers/keybindings-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Session Commands Handler
3
+ *
4
+ * Provides /rename and /tag commands for session management,
5
+ * including auto-name generation from message context.
6
+ */
7
+ export declare class SessionCommandHandler {
8
+ private sessions;
9
+ private getOrCreate;
10
+ renameSession(sessionId: string, name?: string): string;
11
+ tagSession(sessionId: string, tags: string[]): string[];
12
+ removeTag(sessionId: string, tag: string): boolean;
13
+ getSessionTags(sessionId: string): string[];
14
+ searchByTag(tag: string): string[];
15
+ generateSessionName(messages: unknown[]): string;
16
+ formatSessionInfo(sessionId: string): string;
17
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Session Commands Handler
3
+ *
4
+ * Provides /rename and /tag commands for session management,
5
+ * including auto-name generation from message context.
6
+ */
7
+ import { logger } from '../../utils/logger.js';
8
+ // ============================================================================
9
+ // SessionCommandHandler
10
+ // ============================================================================
11
+ export class SessionCommandHandler {
12
+ sessions = new Map();
13
+ getOrCreate(sessionId) {
14
+ let data = this.sessions.get(sessionId);
15
+ if (!data) {
16
+ data = { tags: [] };
17
+ this.sessions.set(sessionId, data);
18
+ }
19
+ return data;
20
+ }
21
+ renameSession(sessionId, name) {
22
+ const data = this.getOrCreate(sessionId);
23
+ if (name) {
24
+ data.name = name;
25
+ }
26
+ else {
27
+ data.name = `session-${sessionId.substring(0, 8)}`;
28
+ }
29
+ logger.info(`Renamed session ${sessionId} to "${data.name}"`);
30
+ return data.name;
31
+ }
32
+ tagSession(sessionId, tags) {
33
+ const data = this.getOrCreate(sessionId);
34
+ for (const tag of tags) {
35
+ const normalized = tag.toLowerCase().trim();
36
+ if (normalized && !data.tags.includes(normalized)) {
37
+ data.tags.push(normalized);
38
+ }
39
+ }
40
+ logger.info(`Tagged session ${sessionId}`, { tags: data.tags });
41
+ return data.tags;
42
+ }
43
+ removeTag(sessionId, tag) {
44
+ const data = this.sessions.get(sessionId);
45
+ if (!data) {
46
+ return false;
47
+ }
48
+ const normalized = tag.toLowerCase().trim();
49
+ const index = data.tags.indexOf(normalized);
50
+ if (index === -1) {
51
+ return false;
52
+ }
53
+ data.tags.splice(index, 1);
54
+ return true;
55
+ }
56
+ getSessionTags(sessionId) {
57
+ const data = this.sessions.get(sessionId);
58
+ return data?.tags || [];
59
+ }
60
+ searchByTag(tag) {
61
+ const normalized = tag.toLowerCase().trim();
62
+ const results = [];
63
+ for (const [sessionId, data] of this.sessions) {
64
+ if (data.tags.includes(normalized)) {
65
+ results.push(sessionId);
66
+ }
67
+ }
68
+ return results;
69
+ }
70
+ generateSessionName(messages) {
71
+ if (!messages || messages.length === 0) {
72
+ return 'empty-session';
73
+ }
74
+ // Extract text content from messages
75
+ const words = [];
76
+ for (const msg of messages) {
77
+ const content = typeof msg === 'object' && msg !== null && 'content' in msg
78
+ ? String(msg.content)
79
+ : typeof msg === 'string' ? msg : '';
80
+ // Extract meaningful words (4+ chars, no common words)
81
+ const stopWords = new Set(['this', 'that', 'with', 'from', 'have', 'been', 'will', 'would', 'could', 'should', 'what', 'when', 'where', 'which', 'there', 'their', 'about', 'your', 'they', 'them', 'then', 'than', 'some', 'into', 'also', 'just', 'very', 'more', 'most', 'make', 'like', 'each', 'does']);
82
+ const extracted = content
83
+ .toLowerCase()
84
+ .replace(/[^a-z0-9\s]/g, ' ')
85
+ .split(/\s+/)
86
+ .filter(w => w.length >= 4 && !stopWords.has(w));
87
+ words.push(...extracted);
88
+ }
89
+ if (words.length === 0) {
90
+ return 'unnamed-session';
91
+ }
92
+ // Pick top keywords by frequency
93
+ const freq = new Map();
94
+ for (const w of words) {
95
+ freq.set(w, (freq.get(w) || 0) + 1);
96
+ }
97
+ const top = [...freq.entries()]
98
+ .sort((a, b) => b[1] - a[1])
99
+ .slice(0, 3)
100
+ .map(([w]) => w);
101
+ return top.join('-');
102
+ }
103
+ formatSessionInfo(sessionId) {
104
+ const data = this.sessions.get(sessionId);
105
+ if (!data) {
106
+ return `Session ${sessionId}: (no metadata)`;
107
+ }
108
+ const lines = [];
109
+ lines.push(`Session: ${sessionId}`);
110
+ if (data.name) {
111
+ lines.push(`Name: ${data.name}`);
112
+ }
113
+ if (data.tags.length > 0) {
114
+ lines.push(`Tags: ${data.tags.join(', ')}`);
115
+ }
116
+ return lines.join('\n');
117
+ }
118
+ }
119
+ //# sourceMappingURL=session-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-commands.js","sourceRoot":"","sources":["../../../src/commands/handlers/session-commands.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ const coreCommands = [
41
41
  },
42
42
  {
43
43
  name: 'init',
44
- description: 'Initialize .grok directory with templates',
44
+ description: 'Initialize .codebuddy directory with templates',
45
45
  prompt: '__INIT_GROK__',
46
46
  filePath: '',
47
47
  isBuiltin: true