@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.
- package/dist/agent/background-tasks.d.ts +49 -0
- package/dist/agent/background-tasks.js +153 -0
- package/dist/agent/background-tasks.js.map +1 -0
- package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
- package/dist/agent/definitions/agent-definition-loader.js +161 -0
- package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
- package/dist/agent/definitions/index.d.ts +1 -0
- package/dist/agent/definitions/index.js +2 -0
- package/dist/agent/definitions/index.js.map +1 -0
- package/dist/agent/extended-thinking.d.ts +64 -0
- package/dist/agent/extended-thinking.js +103 -0
- package/dist/agent/extended-thinking.js.map +1 -0
- package/dist/agent/prompt-suggestions.d.ts +55 -0
- package/dist/agent/prompt-suggestions.js +125 -0
- package/dist/agent/prompt-suggestions.js.map +1 -0
- package/dist/agent/rewind-manager.d.ts +59 -0
- package/dist/agent/rewind-manager.js +124 -0
- package/dist/agent/rewind-manager.js.map +1 -0
- package/dist/agent/teams/agent-team.d.ts +54 -0
- package/dist/agent/teams/agent-team.js +114 -0
- package/dist/agent/teams/agent-team.js.map +1 -0
- package/dist/agent/teams/index.d.ts +1 -0
- package/dist/agent/teams/index.js +2 -0
- package/dist/agent/teams/index.js.map +1 -0
- package/dist/agent/teams/team-v2.d.ts +166 -0
- package/dist/agent/teams/team-v2.js +376 -0
- package/dist/agent/teams/team-v2.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +40 -0
- package/dist/channels/imessage/index.js +69 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +36 -0
- package/dist/channels/line/index.js +71 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +34 -0
- package/dist/channels/mattermost/index.js +56 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +37 -0
- package/dist/channels/nextcloud-talk/index.js +67 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/niche-channels.d.ts +61 -0
- package/dist/channels/niche-channels.js +131 -0
- package/dist/channels/niche-channels.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +30 -0
- package/dist/channels/nostr/index.js +68 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/twilio-voice/index.d.ts +37 -0
- package/dist/channels/twilio-voice/index.js +76 -0
- package/dist/channels/twilio-voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.js +0 -1
- package/dist/channels/whatsapp/index.js.map +1 -1
- package/dist/channels/zalo/index.d.ts +28 -0
- package/dist/channels/zalo/index.js +53 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cloud/cloud-sessions.d.ts +56 -0
- package/dist/cloud/cloud-sessions.js +187 -0
- package/dist/cloud/cloud-sessions.js.map +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/commands/handlers/auth-handler.d.ts +32 -0
- package/dist/commands/handlers/auth-handler.js +137 -0
- package/dist/commands/handlers/auth-handler.js.map +1 -0
- package/dist/commands/handlers/context-handler.d.ts +46 -0
- package/dist/commands/handlers/context-handler.js +102 -0
- package/dist/commands/handlers/context-handler.js.map +1 -0
- package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
- package/dist/commands/handlers/keybindings-handler.js +124 -0
- package/dist/commands/handlers/keybindings-handler.js.map +1 -0
- package/dist/commands/handlers/session-commands.d.ts +17 -0
- package/dist/commands/handlers/session-commands.js +119 -0
- package/dist/commands/handlers/session-commands.js.map +1 -0
- package/dist/commands/slash/builtin-commands.js +1 -1
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/admin-config.d.ts +54 -0
- package/dist/config/admin-config.js +144 -0
- package/dist/config/admin-config.js.map +1 -0
- package/dist/config/advanced-config.d.ts +118 -0
- package/dist/config/advanced-config.js +364 -0
- package/dist/config/advanced-config.js.map +1 -0
- package/dist/config/managed-policies.d.ts +50 -0
- package/dist/config/managed-policies.js +120 -0
- package/dist/config/managed-policies.js.map +1 -0
- package/dist/config/settings-hierarchy.d.ts +59 -0
- package/dist/config/settings-hierarchy.js +188 -0
- package/dist/config/settings-hierarchy.js.map +1 -0
- package/dist/config/tool-profiles.d.ts +37 -0
- package/dist/config/tool-profiles.js +150 -0
- package/dist/config/tool-profiles.js.map +1 -0
- package/dist/config/user-settings.d.ts +31 -0
- package/dist/config/user-settings.js +66 -0
- package/dist/config/user-settings.js.map +1 -0
- package/dist/context/context-files.d.ts +1 -1
- package/dist/context/context-files.js +2 -2
- package/dist/context/context-files.js.map +1 -1
- package/dist/context/partial-summarizer.d.ts +32 -0
- package/dist/context/partial-summarizer.js +144 -0
- package/dist/context/partial-summarizer.js.map +1 -0
- package/dist/desktop/desktop-app.d.ts +44 -0
- package/dist/desktop/desktop-app.js +136 -0
- package/dist/desktop/desktop-app.js.map +1 -0
- package/dist/git/worktree-sessions.d.ts +24 -0
- package/dist/git/worktree-sessions.js +93 -0
- package/dist/git/worktree-sessions.js.map +1 -0
- package/dist/hooks/advanced-hooks.d.ts +110 -0
- package/dist/hooks/advanced-hooks.js +256 -0
- package/dist/hooks/advanced-hooks.js.map +1 -0
- package/dist/hooks/async-hooks.d.ts +73 -0
- package/dist/hooks/async-hooks.js +213 -0
- package/dist/hooks/async-hooks.js.map +1 -0
- package/dist/hooks/env-persistence.d.ts +58 -0
- package/dist/hooks/env-persistence.js +195 -0
- package/dist/hooks/env-persistence.js.map +1 -0
- package/dist/hooks/hook-events.d.ts +36 -0
- package/dist/hooks/hook-events.js +55 -0
- package/dist/hooks/hook-events.js.map +1 -0
- package/dist/hooks/smart-hooks.d.ts +85 -0
- package/dist/hooks/smart-hooks.js +199 -0
- package/dist/hooks/smart-hooks.js.map +1 -0
- package/dist/ide/jetbrains-plugin.d.ts +55 -0
- package/dist/ide/jetbrains-plugin.js +156 -0
- package/dist/ide/jetbrains-plugin.js.map +1 -0
- package/dist/ide/vscode-extension.d.ts +94 -0
- package/dist/ide/vscode-extension.js +229 -0
- package/dist/ide/vscode-extension.js.map +1 -0
- package/dist/index.js +77 -3
- package/dist/index.js.map +1 -1
- package/dist/input/file-autocomplete.d.ts +42 -0
- package/dist/input/file-autocomplete.js +154 -0
- package/dist/input/file-autocomplete.js.map +1 -0
- package/dist/integrations/chrome-bridge.d.ts +90 -0
- package/dist/integrations/chrome-bridge.js +151 -0
- package/dist/integrations/chrome-bridge.js.map +1 -0
- package/dist/integrations/github-action-runner.d.ts +40 -0
- package/dist/integrations/github-action-runner.js +163 -0
- package/dist/integrations/github-action-runner.js.map +1 -0
- package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
- package/dist/integrations/gitlab-ci-runner.js +104 -0
- package/dist/integrations/gitlab-ci-runner.js.map +1 -0
- package/dist/integrations/pr-session-linker.d.ts +44 -0
- package/dist/integrations/pr-session-linker.js +103 -0
- package/dist/integrations/pr-session-linker.js.map +1 -0
- package/dist/integrations/tailscale.d.ts +36 -0
- package/dist/integrations/tailscale.js +101 -0
- package/dist/integrations/tailscale.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +68 -0
- package/dist/lsp/lsp-client.js +182 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/mcp/connectors.d.ts +28 -0
- package/dist/mcp/connectors.js +148 -0
- package/dist/mcp/connectors.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -4
- package/dist/mcp/index.js +7 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
- package/dist/mcp/mcp-auto-discovery.js +104 -0
- package/dist/mcp/mcp-auto-discovery.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +70 -0
- package/dist/mcp/mcp-server.js +374 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/memory/auto-memory.d.ts +53 -0
- package/dist/memory/auto-memory.js +250 -0
- package/dist/memory/auto-memory.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +51 -0
- package/dist/memory/hybrid-search.js +199 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/memory-flush.d.ts +51 -0
- package/dist/memory/memory-flush.js +102 -0
- package/dist/memory/memory-flush.js.map +1 -0
- package/dist/memory/subagent-memory.d.ts +73 -0
- package/dist/memory/subagent-memory.js +172 -0
- package/dist/memory/subagent-memory.js.map +1 -0
- package/dist/nodes/device-node.d.ts +40 -0
- package/dist/nodes/device-node.js +117 -0
- package/dist/nodes/device-node.js.map +1 -0
- package/dist/output/json-schema-output.d.ts +67 -0
- package/dist/output/json-schema-output.js +273 -0
- package/dist/output/json-schema-output.js.map +1 -0
- package/dist/persistence/session-picker.d.ts +22 -0
- package/dist/persistence/session-picker.js +47 -0
- package/dist/persistence/session-picker.js.map +1 -0
- package/dist/persistence/session-store.d.ts +11 -0
- package/dist/persistence/session-store.js +17 -0
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
- package/dist/plugins/git-pinned-marketplace.js +152 -0
- package/dist/plugins/git-pinned-marketplace.js.map +1 -0
- package/dist/plugins/plugin-manifest.d.ts +116 -0
- package/dist/plugins/plugin-manifest.js +283 -0
- package/dist/plugins/plugin-manifest.js.map +1 -0
- package/dist/sandbox/os-sandbox.d.ts +49 -1
- package/dist/sandbox/os-sandbox.js +347 -6
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/sdk/agent-sdk.d.ts +61 -0
- package/dist/sdk/agent-sdk.js +90 -0
- package/dist/sdk/agent-sdk.js.map +1 -0
- package/dist/security/permission-modes.d.ts +76 -0
- package/dist/security/permission-modes.js +195 -0
- package/dist/security/permission-modes.js.map +1 -0
- package/dist/security/permission-patterns.d.ts +61 -0
- package/dist/security/permission-patterns.js +171 -0
- package/dist/security/permission-patterns.js.map +1 -0
- package/dist/security/safe-binaries.d.ts +23 -0
- package/dist/security/safe-binaries.js +96 -0
- package/dist/security/safe-binaries.js.map +1 -0
- package/dist/security/sender-policies.d.ts +46 -0
- package/dist/security/sender-policies.js +90 -0
- package/dist/security/sender-policies.js.map +1 -0
- package/dist/server/dashboard.d.ts +53 -0
- package/dist/server/dashboard.js +93 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/services/system-prompt-override.d.ts +34 -0
- package/dist/services/system-prompt-override.js +64 -0
- package/dist/services/system-prompt-override.js.map +1 -0
- package/dist/skills/skill-enhancements.d.ts +37 -0
- package/dist/skills/skill-enhancements.js +69 -0
- package/dist/skills/skill-enhancements.js.map +1 -0
- package/dist/telemetry/otel-tracer.d.ts +98 -0
- package/dist/telemetry/otel-tracer.js +245 -0
- package/dist/telemetry/otel-tracer.js.map +1 -0
- package/dist/tools/browser-stub.d.ts +61 -0
- package/dist/tools/browser-stub.js +184 -0
- package/dist/tools/browser-stub.js.map +1 -0
- package/dist/tools/gateway-tool.d.ts +43 -0
- package/dist/tools/gateway-tool.js +92 -0
- package/dist/tools/gateway-tool.js.map +1 -0
- package/dist/tools/image-stub.d.ts +32 -0
- package/dist/tools/image-stub.js +97 -0
- package/dist/tools/image-stub.js.map +1 -0
- package/dist/tools/js-repl.d.ts +78 -0
- package/dist/tools/js-repl.js +280 -0
- package/dist/tools/js-repl.js.map +1 -0
- package/dist/tools/message-tool.d.ts +42 -0
- package/dist/tools/message-tool.js +113 -0
- package/dist/tools/message-tool.js.map +1 -0
- package/dist/ui/cli-enhancements.d.ts +178 -0
- package/dist/ui/cli-enhancements.js +430 -0
- package/dist/ui/cli-enhancements.js.map +1 -0
- package/dist/ui/status-line.d.ts +90 -0
- package/dist/ui/status-line.js +160 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/terminal-enhancements.d.ts +34 -0
- package/dist/ui/terminal-enhancements.js +97 -0
- package/dist/ui/terminal-enhancements.js.map +1 -0
- package/dist/ui/ui-enhancements.d.ts +38 -0
- package/dist/ui/ui-enhancements.js +116 -0
- package/dist/ui/ui-enhancements.js.map +1 -0
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/init-project.d.ts +1 -1
- package/dist/utils/init-project.js +20 -20
- package/dist/utils/init-project.js.map +1 -1
- package/dist/utils/output-schema-validator.d.ts +40 -0
- package/dist/utils/output-schema-validator.js +137 -0
- package/dist/utils/output-schema-validator.js.map +1 -0
- package/dist/utils/safety-misc.d.ts +24 -0
- package/dist/utils/safety-misc.js +91 -0
- package/dist/utils/safety-misc.js.map +1 -0
- package/dist/utils/session-enhancements.d.ts +40 -0
- package/dist/utils/session-enhancements.js +118 -0
- package/dist/utils/session-enhancements.js.map +1 -0
- package/dist/utils/shell-snapshot.d.ts +38 -0
- package/dist/utils/shell-snapshot.js +323 -0
- package/dist/utils/shell-snapshot.js.map +1 -0
- package/dist/utils/stream-json-formatter.d.ts +77 -0
- package/dist/utils/stream-json-formatter.js +61 -0
- package/dist/utils/stream-json-formatter.js.map +1 -0
- package/dist/workflows/lobster-engine.d.ts +43 -0
- package/dist/workflows/lobster-engine.js +167 -0
- package/dist/workflows/lobster-engine.js.map +1 -0
- 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 @@
|
|
|
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
|
+
}
|