@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,49 @@
1
+ /**
2
+ * Background Task Manager
3
+ *
4
+ * Launches and manages background shell commands, capturing output
5
+ * and providing status tracking.
6
+ */
7
+ export interface BackgroundTask {
8
+ id: string;
9
+ command: string;
10
+ startTime: number;
11
+ status: 'running' | 'completed' | 'failed';
12
+ output: string;
13
+ exitCode?: number;
14
+ }
15
+ /**
16
+ * BackgroundTaskManager spawns and tracks background shell commands.
17
+ */
18
+ export declare class BackgroundTaskManager {
19
+ private tasks;
20
+ private processes;
21
+ private counter;
22
+ /**
23
+ * Launch a command in the background.
24
+ * Returns the task ID.
25
+ */
26
+ launchTask(command: string): string;
27
+ /**
28
+ * Get the output for a task, optionally filtered by regex.
29
+ */
30
+ getTaskOutput(taskId: string, filter?: RegExp): string;
31
+ /**
32
+ * Get a task by ID.
33
+ */
34
+ getTask(taskId: string): BackgroundTask | undefined;
35
+ /**
36
+ * List all tasks.
37
+ */
38
+ listTasks(): BackgroundTask[];
39
+ /**
40
+ * Kill a running task.
41
+ */
42
+ killTask(taskId: string): boolean;
43
+ /**
44
+ * Kill all running tasks (for process exit cleanup).
45
+ */
46
+ cleanup(): void;
47
+ }
48
+ export declare function getBackgroundTaskManager(): BackgroundTaskManager;
49
+ export declare function resetBackgroundTaskManager(): void;
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Background Task Manager
3
+ *
4
+ * Launches and manages background shell commands, capturing output
5
+ * and providing status tracking.
6
+ */
7
+ import { spawn } from 'child_process';
8
+ import { logger } from '../utils/logger.js';
9
+ const MAX_OUTPUT_BYTES = 1024 * 1024; // 1MB
10
+ /**
11
+ * BackgroundTaskManager spawns and tracks background shell commands.
12
+ */
13
+ export class BackgroundTaskManager {
14
+ tasks = new Map();
15
+ processes = new Map();
16
+ counter = 0;
17
+ /**
18
+ * Launch a command in the background.
19
+ * Returns the task ID.
20
+ */
21
+ launchTask(command) {
22
+ this.counter++;
23
+ const id = `bg-${this.counter}`;
24
+ const task = {
25
+ id,
26
+ command,
27
+ startTime: Date.now(),
28
+ status: 'running',
29
+ output: '',
30
+ };
31
+ this.tasks.set(id, task);
32
+ const child = spawn('sh', ['-c', command], {
33
+ detached: true,
34
+ stdio: ['ignore', 'pipe', 'pipe'],
35
+ });
36
+ this.processes.set(id, child);
37
+ const appendOutput = (data) => {
38
+ const t = this.tasks.get(id);
39
+ if (t && t.output.length < MAX_OUTPUT_BYTES) {
40
+ const remaining = MAX_OUTPUT_BYTES - t.output.length;
41
+ t.output += data.toString('utf-8').slice(0, remaining);
42
+ }
43
+ };
44
+ if (child.stdout) {
45
+ child.stdout.on('data', appendOutput);
46
+ }
47
+ if (child.stderr) {
48
+ child.stderr.on('data', appendOutput);
49
+ }
50
+ child.on('close', (code) => {
51
+ const t = this.tasks.get(id);
52
+ if (t) {
53
+ t.exitCode = code ?? 1;
54
+ t.status = code === 0 ? 'completed' : 'failed';
55
+ }
56
+ this.processes.delete(id);
57
+ logger.debug(`[BackgroundTaskManager] Task ${id} finished with code ${code}`);
58
+ });
59
+ child.on('error', (err) => {
60
+ const t = this.tasks.get(id);
61
+ if (t) {
62
+ t.status = 'failed';
63
+ t.output += `\nError: ${err.message}`;
64
+ }
65
+ this.processes.delete(id);
66
+ logger.debug(`[BackgroundTaskManager] Task ${id} error: ${err.message}`);
67
+ });
68
+ logger.debug(`[BackgroundTaskManager] Launched task ${id}: ${command}`);
69
+ return id;
70
+ }
71
+ /**
72
+ * Get the output for a task, optionally filtered by regex.
73
+ */
74
+ getTaskOutput(taskId, filter) {
75
+ const task = this.tasks.get(taskId);
76
+ if (!task) {
77
+ return '';
78
+ }
79
+ if (!filter) {
80
+ return task.output;
81
+ }
82
+ return task.output
83
+ .split('\n')
84
+ .filter((line) => filter.test(line))
85
+ .join('\n');
86
+ }
87
+ /**
88
+ * Get a task by ID.
89
+ */
90
+ getTask(taskId) {
91
+ const task = this.tasks.get(taskId);
92
+ if (!task)
93
+ return undefined;
94
+ return { ...task };
95
+ }
96
+ /**
97
+ * List all tasks.
98
+ */
99
+ listTasks() {
100
+ return Array.from(this.tasks.values()).map((t) => ({ ...t }));
101
+ }
102
+ /**
103
+ * Kill a running task.
104
+ */
105
+ killTask(taskId) {
106
+ const child = this.processes.get(taskId);
107
+ if (!child) {
108
+ return false;
109
+ }
110
+ try {
111
+ if (child.pid) {
112
+ process.kill(-child.pid, 'SIGTERM');
113
+ }
114
+ else {
115
+ child.kill('SIGTERM');
116
+ }
117
+ }
118
+ catch {
119
+ child.kill('SIGTERM');
120
+ }
121
+ const task = this.tasks.get(taskId);
122
+ if (task) {
123
+ task.status = 'failed';
124
+ task.exitCode = 137;
125
+ }
126
+ this.processes.delete(taskId);
127
+ return true;
128
+ }
129
+ /**
130
+ * Kill all running tasks (for process exit cleanup).
131
+ */
132
+ cleanup() {
133
+ for (const [id] of this.processes) {
134
+ this.killTask(id);
135
+ }
136
+ logger.debug('[BackgroundTaskManager] All tasks cleaned up');
137
+ }
138
+ }
139
+ // Singleton
140
+ let instance = null;
141
+ export function getBackgroundTaskManager() {
142
+ if (!instance) {
143
+ instance = new BackgroundTaskManager();
144
+ }
145
+ return instance;
146
+ }
147
+ export function resetBackgroundTaskManager() {
148
+ if (instance) {
149
+ instance.cleanup();
150
+ }
151
+ instance = null;
152
+ }
153
+ //# sourceMappingURL=background-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-tasks.js","sourceRoot":"","sources":["../../src/agent/background-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Agent Definition Loader
3
+ *
4
+ * Loads custom agent definitions from `.codebuddy/agents/*.md` (project)
5
+ * and `~/.codebuddy/agents/*.md` (user) directories.
6
+ * Uses YAML frontmatter for configuration and markdown body for system prompt.
7
+ */
8
+ export interface AgentDefinition {
9
+ name: string;
10
+ description: string;
11
+ model?: 'sonnet' | 'opus' | 'haiku' | 'inherit';
12
+ tools?: string[];
13
+ disallowedTools?: string[];
14
+ maxTurns?: number;
15
+ preloadedSkills?: string[];
16
+ systemPrompt?: string;
17
+ }
18
+ export declare function parseAgentFile(filePath: string): AgentDefinition;
19
+ export declare function loadAgentDefinitions(baseDir?: string): Promise<AgentDefinition[]>;
20
+ export declare function getAgentDefinition(name: string): AgentDefinition | undefined;
21
+ export declare function resetDefinitionCache(): void;
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Agent Definition Loader
3
+ *
4
+ * Loads custom agent definitions from `.codebuddy/agents/*.md` (project)
5
+ * and `~/.codebuddy/agents/*.md` (user) directories.
6
+ * Uses YAML frontmatter for configuration and markdown body for system prompt.
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import { logger } from '../../utils/logger.js';
12
+ /**
13
+ * Parse YAML frontmatter from a markdown file.
14
+ * Reuses the same pattern as SkillRegistry.parseFrontmatter.
15
+ */
16
+ function parseFrontmatter(content) {
17
+ const meta = {};
18
+ let body = content;
19
+ const trimmed = content.trimStart();
20
+ if (!trimmed.startsWith('---')) {
21
+ return { meta, body };
22
+ }
23
+ const endIdx = trimmed.indexOf('---', 3);
24
+ if (endIdx === -1) {
25
+ return { meta, body };
26
+ }
27
+ const block = trimmed.slice(3, endIdx).trim();
28
+ body = trimmed.slice(endIdx + 3).trim();
29
+ const lines = block.split('\n');
30
+ let currentArrayKey = null;
31
+ let currentArray = [];
32
+ const flushArray = () => {
33
+ if (currentArrayKey && currentArray.length > 0) {
34
+ meta[currentArrayKey] = currentArray;
35
+ }
36
+ currentArrayKey = null;
37
+ currentArray = [];
38
+ };
39
+ for (const line of lines) {
40
+ // Check for array item (indented with -)
41
+ if (currentArrayKey && /^\s+-\s+/.test(line)) {
42
+ const val = line.replace(/^\s+-\s+/, '').trim();
43
+ if (val) {
44
+ currentArray.push(val);
45
+ }
46
+ continue;
47
+ }
48
+ // Flush any pending array
49
+ flushArray();
50
+ const colonIdx = line.indexOf(':');
51
+ if (colonIdx === -1)
52
+ continue;
53
+ const key = line.slice(0, colonIdx).trim();
54
+ const val = line.slice(colonIdx + 1).trim();
55
+ if (!val) {
56
+ // Possibly an array header
57
+ currentArrayKey = key;
58
+ currentArray = [];
59
+ continue;
60
+ }
61
+ // Try to parse as number
62
+ const num = Number(val);
63
+ if (!isNaN(num) && val !== '') {
64
+ meta[key] = num;
65
+ }
66
+ else {
67
+ meta[key] = val;
68
+ }
69
+ }
70
+ flushArray();
71
+ return { meta, body };
72
+ }
73
+ export function parseAgentFile(filePath) {
74
+ const content = fs.readFileSync(filePath, 'utf-8');
75
+ const { meta, body } = parseFrontmatter(content);
76
+ const name = meta.name || path.basename(filePath, '.md');
77
+ const description = meta.description || '';
78
+ const definition = {
79
+ name,
80
+ description,
81
+ };
82
+ if (meta.model && typeof meta.model === 'string') {
83
+ const validModels = ['sonnet', 'opus', 'haiku', 'inherit'];
84
+ if (validModels.includes(meta.model)) {
85
+ definition.model = meta.model;
86
+ }
87
+ }
88
+ if (Array.isArray(meta.tools)) {
89
+ definition.tools = meta.tools;
90
+ }
91
+ if (Array.isArray(meta.disallowedTools)) {
92
+ definition.disallowedTools = meta.disallowedTools;
93
+ }
94
+ if (typeof meta.maxTurns === 'number') {
95
+ definition.maxTurns = meta.maxTurns;
96
+ }
97
+ if (Array.isArray(meta.preloadedSkills)) {
98
+ definition.preloadedSkills = meta.preloadedSkills;
99
+ }
100
+ if (body) {
101
+ definition.systemPrompt = body;
102
+ }
103
+ return definition;
104
+ }
105
+ function scanDirectory(dirPath) {
106
+ const definitions = [];
107
+ if (!fs.existsSync(dirPath)) {
108
+ return definitions;
109
+ }
110
+ let entries;
111
+ try {
112
+ entries = fs.readdirSync(dirPath);
113
+ }
114
+ catch {
115
+ logger.warn(`Failed to read agent definitions directory: ${dirPath}`);
116
+ return definitions;
117
+ }
118
+ for (const entry of entries) {
119
+ if (!entry.endsWith('.md'))
120
+ continue;
121
+ const filePath = path.join(dirPath, entry);
122
+ try {
123
+ const stat = fs.statSync(filePath);
124
+ if (!stat.isFile())
125
+ continue;
126
+ const def = parseAgentFile(filePath);
127
+ definitions.push(def);
128
+ }
129
+ catch (err) {
130
+ logger.warn(`Failed to parse agent definition: ${filePath}: ${err}`);
131
+ }
132
+ }
133
+ return definitions;
134
+ }
135
+ let cachedDefinitions = null;
136
+ export async function loadAgentDefinitions(baseDir) {
137
+ const projectDir = path.join(baseDir || process.cwd(), '.codebuddy', 'agents');
138
+ const userDir = path.join(os.homedir(), '.codebuddy', 'agents');
139
+ const userDefs = scanDirectory(userDir);
140
+ const projectDefs = scanDirectory(projectDir);
141
+ // Project definitions override user definitions with the same name
142
+ const byName = new Map();
143
+ for (const def of userDefs) {
144
+ byName.set(def.name, def);
145
+ }
146
+ for (const def of projectDefs) {
147
+ byName.set(def.name, def);
148
+ }
149
+ cachedDefinitions = Array.from(byName.values());
150
+ logger.info(`Loaded ${cachedDefinitions.length} agent definitions`);
151
+ return cachedDefinitions;
152
+ }
153
+ export function getAgentDefinition(name) {
154
+ if (!cachedDefinitions)
155
+ return undefined;
156
+ return cachedDefinitions.find((d) => d.name === name);
157
+ }
158
+ export function resetDefinitionCache() {
159
+ cachedDefinitions = null;
160
+ }
161
+ //# sourceMappingURL=agent-definition-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-definition-loader.js","sourceRoot":"","sources":["../../../src/agent/definitions/agent-definition-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { parseAgentFile, loadAgentDefinitions, getAgentDefinition, resetDefinitionCache, type AgentDefinition, } from './agent-definition-loader.js';
@@ -0,0 +1,2 @@
1
+ export { parseAgentFile, loadAgentDefinitions, getAgentDefinition, resetDefinitionCache, } from './agent-definition-loader.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Extended Thinking Mode
3
+ *
4
+ * Manages extended thinking configuration for LLM requests.
5
+ * When enabled, the API request includes a thinking budget that allows
6
+ * the model to reason through complex problems before responding.
7
+ *
8
+ * @module agent/extended-thinking
9
+ */
10
+ /**
11
+ * Configuration returned by getThinkingConfig() when thinking is enabled
12
+ */
13
+ export interface ThinkingConfig {
14
+ thinking?: {
15
+ type: 'enabled';
16
+ budget_tokens: number;
17
+ };
18
+ }
19
+ /**
20
+ * Manages extended thinking mode for LLM API requests.
21
+ *
22
+ * When enabled, getThinkingConfig() returns a config object that should
23
+ * be merged into the API request parameters.
24
+ */
25
+ export declare class ExtendedThinkingManager {
26
+ private enabled;
27
+ private maxThinkingTokens;
28
+ private alwaysEnabled;
29
+ constructor();
30
+ /**
31
+ * Toggle extended thinking on/off
32
+ * @returns The new enabled state
33
+ */
34
+ toggle(): boolean;
35
+ /**
36
+ * Check if extended thinking is currently enabled
37
+ */
38
+ isEnabled(): boolean;
39
+ /**
40
+ * Get the current token budget
41
+ */
42
+ getTokenBudget(): number;
43
+ /**
44
+ * Set the token budget for extended thinking
45
+ */
46
+ setTokenBudget(n: number): void;
47
+ /**
48
+ * Set whether extended thinking is always enabled
49
+ */
50
+ setAlwaysEnabled(value: boolean): void;
51
+ /**
52
+ * Get the thinking configuration to merge into API request parameters.
53
+ * Returns an object with a `thinking` key when enabled, or an empty object when disabled.
54
+ */
55
+ getThinkingConfig(): ThinkingConfig;
56
+ }
57
+ /**
58
+ * Get the singleton ExtendedThinkingManager instance
59
+ */
60
+ export declare function getExtendedThinking(): ExtendedThinkingManager;
61
+ /**
62
+ * Reset the singleton (useful for testing)
63
+ */
64
+ export declare function resetExtendedThinking(): void;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Extended Thinking Mode
3
+ *
4
+ * Manages extended thinking configuration for LLM requests.
5
+ * When enabled, the API request includes a thinking budget that allows
6
+ * the model to reason through complex problems before responding.
7
+ *
8
+ * @module agent/extended-thinking
9
+ */
10
+ import { logger } from '../utils/logger.js';
11
+ /**
12
+ * Default maximum thinking tokens
13
+ */
14
+ const DEFAULT_MAX_THINKING_TOKENS = 31999;
15
+ /**
16
+ * Manages extended thinking mode for LLM API requests.
17
+ *
18
+ * When enabled, getThinkingConfig() returns a config object that should
19
+ * be merged into the API request parameters.
20
+ */
21
+ export class ExtendedThinkingManager {
22
+ enabled;
23
+ maxThinkingTokens;
24
+ alwaysEnabled;
25
+ constructor() {
26
+ const envTokens = process.env.MAX_THINKING_TOKENS;
27
+ this.maxThinkingTokens = envTokens
28
+ ? parseInt(envTokens, 10) || DEFAULT_MAX_THINKING_TOKENS
29
+ : DEFAULT_MAX_THINKING_TOKENS;
30
+ this.alwaysEnabled = false;
31
+ this.enabled = false;
32
+ }
33
+ /**
34
+ * Toggle extended thinking on/off
35
+ * @returns The new enabled state
36
+ */
37
+ toggle() {
38
+ this.enabled = !this.enabled;
39
+ logger.info(`Extended thinking ${this.enabled ? 'enabled' : 'disabled'} (budget: ${this.maxThinkingTokens} tokens)`);
40
+ return this.enabled;
41
+ }
42
+ /**
43
+ * Check if extended thinking is currently enabled
44
+ */
45
+ isEnabled() {
46
+ return this.enabled || this.alwaysEnabled;
47
+ }
48
+ /**
49
+ * Get the current token budget
50
+ */
51
+ getTokenBudget() {
52
+ return this.maxThinkingTokens;
53
+ }
54
+ /**
55
+ * Set the token budget for extended thinking
56
+ */
57
+ setTokenBudget(n) {
58
+ if (n > 0) {
59
+ this.maxThinkingTokens = n;
60
+ logger.info(`Extended thinking budget set to ${n} tokens`);
61
+ }
62
+ }
63
+ /**
64
+ * Set whether extended thinking is always enabled
65
+ */
66
+ setAlwaysEnabled(value) {
67
+ this.alwaysEnabled = value;
68
+ logger.info(`Extended thinking always-enabled: ${value}`);
69
+ }
70
+ /**
71
+ * Get the thinking configuration to merge into API request parameters.
72
+ * Returns an object with a `thinking` key when enabled, or an empty object when disabled.
73
+ */
74
+ getThinkingConfig() {
75
+ if (this.isEnabled()) {
76
+ return {
77
+ thinking: {
78
+ type: 'enabled',
79
+ budget_tokens: this.maxThinkingTokens,
80
+ },
81
+ };
82
+ }
83
+ return {};
84
+ }
85
+ }
86
+ // Singleton instance
87
+ let instance = null;
88
+ /**
89
+ * Get the singleton ExtendedThinkingManager instance
90
+ */
91
+ export function getExtendedThinking() {
92
+ if (!instance) {
93
+ instance = new ExtendedThinkingManager();
94
+ }
95
+ return instance;
96
+ }
97
+ /**
98
+ * Reset the singleton (useful for testing)
99
+ */
100
+ export function resetExtendedThinking() {
101
+ instance = null;
102
+ }
103
+ //# sourceMappingURL=extended-thinking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extended-thinking.js","sourceRoot":"","sources":["../../src/agent/extended-thinking.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAY5C;;GAEG;AACH,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,CAAU;IACjB,iBAAiB,CAAS;IAC1B,aAAa,CAAU;IAE/B;QACE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,SAAS;YAChC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,2BAA2B;YACxD,CAAC,CAAC,2BAA2B,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,aAAa,IAAI,CAAC,iBAAiB,UAAU,CAAC,CAAC;QACrH,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,CAAS;QACtB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAc;QAC7B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,OAAO;gBACL,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,aAAa,EAAE,IAAI,CAAC,iBAAiB;iBACtC;aACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,QAAQ,GAAmC,IAAI,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Prompt Suggestion Engine
3
+ *
4
+ * Generates follow-up prompt suggestions based on conversation context.
5
+ * Suggestions help users continue productive conversations by offering
6
+ * relevant next steps.
7
+ *
8
+ * @module agent/prompt-suggestions
9
+ */
10
+ /**
11
+ * Engine for generating follow-up prompt suggestions based on
12
+ * conversation context and the last assistant response.
13
+ */
14
+ export declare class PromptSuggestionEngine {
15
+ private enabled;
16
+ private cachedSuggestions;
17
+ constructor(enabled?: boolean);
18
+ /**
19
+ * Check if suggestions are enabled
20
+ */
21
+ isEnabled(): boolean;
22
+ /**
23
+ * Enable or disable suggestion generation
24
+ */
25
+ setEnabled(value: boolean): void;
26
+ /**
27
+ * Generate 2-3 follow-up suggestions based on context and last response.
28
+ *
29
+ * Currently returns the formatted prompt string that would be sent to an LLM.
30
+ * The actual LLM call is stubbed for now - integrate with CodeBuddyClient
31
+ * when ready.
32
+ *
33
+ * @param context - The conversation context or user's last message
34
+ * @param lastResponse - The assistant's last response
35
+ * @returns Array of suggestion strings
36
+ */
37
+ generateSuggestions(context: string, lastResponse: string): Promise<string[]>;
38
+ /**
39
+ * Get the cached suggestions from the last generateSuggestions call
40
+ */
41
+ getSuggestions(): string[];
42
+ /**
43
+ * Clear cached suggestions
44
+ */
45
+ clearSuggestions(): void;
46
+ /**
47
+ * Build the prompt for suggestion generation
48
+ */
49
+ private buildSuggestionPrompt;
50
+ /**
51
+ * Stub implementation that generates suggestions based on keywords.
52
+ * Replace with actual LLM call in production.
53
+ */
54
+ private parseStubSuggestions;
55
+ }