@phuetz/code-buddy 0.1.18 → 0.1.20
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/analytics/dashboard.js +1 -1
- package/dist/analytics/dashboard.js.map +1 -1
- 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/delegate.js +2 -2
- package/dist/commands/delegate.js.map +1 -1
- package/dist/commands/features.d.ts +1 -1
- package/dist/commands/features.js +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/core-handlers.js +1 -1
- package/dist/commands/handlers/core-handlers.js.map +1 -1
- 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/missing-handlers.js +15 -14
- package/dist/commands/handlers/missing-handlers.js.map +1 -1
- 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/handlers/worktree-handlers.d.ts +1 -1
- package/dist/commands/handlers/worktree-handlers.js +2 -2
- package/dist/commands/slash/builtin-commands.js +2 -2
- 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/constants.d.ts +2 -2
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- 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/toml-config.js +1 -1
- package/dist/config/toml-config.js.map +1 -1
- 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 +3 -3
- 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/features/index.d.ts +1 -1
- package/dist/features/index.js +2 -2
- package/dist/features/index.js.map +1 -1
- 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/hook-system.js +1 -1
- package/dist/hooks/hook-system.js.map +1 -1
- 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/github-actions.js +1 -1
- package/dist/integrations/github-actions.js.map +1 -1
- 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/lsp/server.js +3 -3
- package/dist/lsp/server.js.map +1 -1
- 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/observability/dashboard.d.ts +1 -1
- package/dist/observability/dashboard.js +2 -2
- package/dist/observability/dashboard.js.map +1 -1
- package/dist/offline/offline-mode.d.ts +1 -1
- package/dist/offline/offline-mode.js +1 -1
- 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/marketplace.d.ts +1 -1
- package/dist/plugins/marketplace.js +1 -1
- 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/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +1 -1
- package/dist/providers/local-llm-provider.d.ts +1 -1
- package/dist/providers/local-llm-provider.js +1 -1
- 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/scripting/codebuddy-bindings.js +1 -1
- package/dist/scripting/codebuddy-bindings.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/index.d.ts +1 -1
- package/dist/security/index.js +1 -1
- 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/templates/export/html.template.js +2 -2
- package/dist/templates/export/markdown.template.js +1 -1
- package/dist/templates/export/markdown.template.js.map +1 -1
- package/dist/themes/default-themes.d.ts +1 -1
- package/dist/themes/default-themes.js +1 -1
- package/dist/themes/index.d.ts +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/theme-manager.d.ts +1 -1
- package/dist/themes/theme-manager.js +1 -1
- package/dist/themes/theme.d.ts +1 -1
- package/dist/themes/theme.js +1 -1
- 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/types/errors.d.ts +1 -1
- package/dist/types/errors.js +1 -1
- package/dist/ui/app.js +1 -1
- package/dist/ui/app.js.map +1 -1
- 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/components/HelpSystem.d.ts +1 -1
- package/dist/ui/components/HelpSystem.js +1 -1
- package/dist/ui/context/theme-context.d.ts +1 -1
- package/dist/ui/context/theme-context.js +1 -1
- package/dist/ui/dashboard/dashboard.js +1 -1
- package/dist/ui/dashboard/dashboard.js.map +1 -1
- 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/undo/checkpoint-manager.d.ts +1 -1
- package/dist/undo/checkpoint-manager.js +1 -1
- package/dist/utils/codebuddy-home.d.ts +1 -1
- package/dist/utils/codebuddy-home.js +1 -1
- package/dist/utils/conversation-export.js +3 -3
- package/dist/utils/conversation-export.js.map +1 -1
- package/dist/utils/custom-commands.js +1 -1
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/debug-logger.d.ts +1 -1
- package/dist/utils/debug-logger.js +1 -1
- package/dist/utils/errors.d.ts +2 -2
- package/dist/utils/errors.js +2 -2
- package/dist/utils/export-manager.js +3 -3
- package/dist/utils/export-manager.js.map +1 -1
- package/dist/utils/headless-output.js +1 -1
- package/dist/utils/headless-output.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/logger.d.ts +1 -1
- package/dist/utils/logger.js +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-completions.js +6 -6
- 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/utils/terminal-notifications.js +1 -1
- package/dist/utils/terminal-notifications.js.map +1 -1
- 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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Hook System
|
|
3
|
+
*
|
|
4
|
+
* Extends the hook system with prompt-based and agent-based hooks.
|
|
5
|
+
* Supports three hook types:
|
|
6
|
+
* - command: runs shell commands and parses output
|
|
7
|
+
* - prompt: evaluates LLM prompts with template rendering
|
|
8
|
+
* - agent: spawns sub-agent with restricted tool access
|
|
9
|
+
*
|
|
10
|
+
* Also supports async hook execution with result tracking.
|
|
11
|
+
*/
|
|
12
|
+
export type SmartHookType = 'command' | 'prompt' | 'agent';
|
|
13
|
+
export interface SmartHookConfig {
|
|
14
|
+
/** Hook type */
|
|
15
|
+
type: SmartHookType;
|
|
16
|
+
/** Event name this hook responds to */
|
|
17
|
+
event: string;
|
|
18
|
+
/** For type: 'command' - shell command to run */
|
|
19
|
+
command?: string;
|
|
20
|
+
/** For type: 'prompt' - LLM prompt template with {{input}} placeholders */
|
|
21
|
+
prompt?: string;
|
|
22
|
+
/** For type: 'prompt' - model to use for evaluation */
|
|
23
|
+
model?: string;
|
|
24
|
+
/** For type: 'agent' - agent system prompt */
|
|
25
|
+
agentPrompt?: string;
|
|
26
|
+
/** For type: 'agent' - tools available to the agent */
|
|
27
|
+
agentTools?: string[];
|
|
28
|
+
/** For type: 'agent' - maximum agent turns (default: 5) */
|
|
29
|
+
maxTurns?: number;
|
|
30
|
+
/** Run in background */
|
|
31
|
+
async?: boolean;
|
|
32
|
+
/** Timeout in ms (default: 30000) */
|
|
33
|
+
timeout?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface SmartHookResult {
|
|
36
|
+
/** Whether the hook succeeded */
|
|
37
|
+
ok: boolean;
|
|
38
|
+
/** Reason for failure */
|
|
39
|
+
reason?: string;
|
|
40
|
+
/** Hook output */
|
|
41
|
+
output?: string;
|
|
42
|
+
/** Execution duration in ms */
|
|
43
|
+
duration?: number;
|
|
44
|
+
}
|
|
45
|
+
export declare class SmartHookRunner {
|
|
46
|
+
private pendingResults;
|
|
47
|
+
private pendingCount;
|
|
48
|
+
constructor();
|
|
49
|
+
/**
|
|
50
|
+
* Run a hook synchronously and return result
|
|
51
|
+
*/
|
|
52
|
+
runHook(hook: SmartHookConfig, input: Record<string, any>): Promise<SmartHookResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Run a command-type hook
|
|
55
|
+
*/
|
|
56
|
+
private runCommandHook;
|
|
57
|
+
/**
|
|
58
|
+
* Run a prompt-type hook (evaluates an LLM prompt template)
|
|
59
|
+
*/
|
|
60
|
+
private runPromptHook;
|
|
61
|
+
/**
|
|
62
|
+
* Run an agent-type hook (spawns a sub-agent)
|
|
63
|
+
*/
|
|
64
|
+
private runAgentHook;
|
|
65
|
+
/**
|
|
66
|
+
* Render a template string by replacing {{key}} placeholders with input values
|
|
67
|
+
*/
|
|
68
|
+
renderTemplate(template: string, input: Record<string, any>): string;
|
|
69
|
+
/**
|
|
70
|
+
* Run a hook asynchronously in the background
|
|
71
|
+
*/
|
|
72
|
+
runAsync(hook: SmartHookConfig, input: Record<string, any>): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the result of an async hook by ID
|
|
75
|
+
*/
|
|
76
|
+
getAsyncResult(hookId: string): SmartHookResult | null;
|
|
77
|
+
/**
|
|
78
|
+
* Check if there are any pending async hooks
|
|
79
|
+
*/
|
|
80
|
+
hasPendingHooks(): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Get the number of pending async hooks
|
|
83
|
+
*/
|
|
84
|
+
getPendingCount(): number;
|
|
85
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Hook System
|
|
3
|
+
*
|
|
4
|
+
* Extends the hook system with prompt-based and agent-based hooks.
|
|
5
|
+
* Supports three hook types:
|
|
6
|
+
* - command: runs shell commands and parses output
|
|
7
|
+
* - prompt: evaluates LLM prompts with template rendering
|
|
8
|
+
* - agent: spawns sub-agent with restricted tool access
|
|
9
|
+
*
|
|
10
|
+
* Also supports async hook execution with result tracking.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'child_process';
|
|
13
|
+
import { randomUUID } from 'crypto';
|
|
14
|
+
import { logger } from '../utils/logger.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// SmartHookRunner
|
|
17
|
+
// ============================================================================
|
|
18
|
+
export class SmartHookRunner {
|
|
19
|
+
pendingResults = new Map();
|
|
20
|
+
pendingCount = 0;
|
|
21
|
+
constructor() {
|
|
22
|
+
logger.debug('SmartHookRunner initialized', { source: 'SmartHookRunner' });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run a hook synchronously and return result
|
|
26
|
+
*/
|
|
27
|
+
async runHook(hook, input) {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
try {
|
|
30
|
+
let result;
|
|
31
|
+
switch (hook.type) {
|
|
32
|
+
case 'command':
|
|
33
|
+
result = await this.runCommandHook(hook, input);
|
|
34
|
+
break;
|
|
35
|
+
case 'prompt':
|
|
36
|
+
result = await this.runPromptHook(hook, input);
|
|
37
|
+
break;
|
|
38
|
+
case 'agent':
|
|
39
|
+
result = await this.runAgentHook(hook, input);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
result = {
|
|
43
|
+
ok: false,
|
|
44
|
+
reason: `Unknown hook type: ${hook.type}`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
result.duration = Date.now() - startTime;
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
54
|
+
duration: Date.now() - startTime,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run a command-type hook
|
|
60
|
+
*/
|
|
61
|
+
async runCommandHook(hook, input) {
|
|
62
|
+
if (!hook.command) {
|
|
63
|
+
return { ok: false, reason: 'No command specified for command hook' };
|
|
64
|
+
}
|
|
65
|
+
const renderedCommand = this.renderTemplate(hook.command, input);
|
|
66
|
+
const timeout = hook.timeout ?? 30000;
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
let timedOut = false;
|
|
69
|
+
const child = spawn('/bin/sh', ['-c', renderedCommand], {
|
|
70
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
71
|
+
env: {
|
|
72
|
+
...process.env,
|
|
73
|
+
HOOK_EVENT: hook.event,
|
|
74
|
+
HOOK_INPUT: JSON.stringify(input),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
let stdout = '';
|
|
78
|
+
let stderr = '';
|
|
79
|
+
const timeoutId = setTimeout(() => {
|
|
80
|
+
timedOut = true;
|
|
81
|
+
child.kill('SIGTERM');
|
|
82
|
+
}, timeout);
|
|
83
|
+
child.stdout?.on('data', (data) => {
|
|
84
|
+
stdout += data.toString();
|
|
85
|
+
});
|
|
86
|
+
child.stderr?.on('data', (data) => {
|
|
87
|
+
stderr += data.toString();
|
|
88
|
+
});
|
|
89
|
+
child.on('close', (code) => {
|
|
90
|
+
clearTimeout(timeoutId);
|
|
91
|
+
if (timedOut) {
|
|
92
|
+
resolve({ ok: false, reason: 'Command hook timed out' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (code !== 0) {
|
|
96
|
+
resolve({
|
|
97
|
+
ok: false,
|
|
98
|
+
reason: `Command exited with code ${code}: ${stderr.trim()}`,
|
|
99
|
+
output: stdout.trim(),
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
resolve({
|
|
104
|
+
ok: true,
|
|
105
|
+
output: stdout.trim(),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
child.on('error', (error) => {
|
|
109
|
+
clearTimeout(timeoutId);
|
|
110
|
+
resolve({ ok: false, reason: error.message });
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Run a prompt-type hook (evaluates an LLM prompt template)
|
|
116
|
+
*/
|
|
117
|
+
async runPromptHook(hook, input) {
|
|
118
|
+
if (!hook.prompt) {
|
|
119
|
+
return { ok: false, reason: 'No prompt specified for prompt hook' };
|
|
120
|
+
}
|
|
121
|
+
const renderedPrompt = this.renderTemplate(hook.prompt, input);
|
|
122
|
+
// Stub implementation: in production this would call the LLM
|
|
123
|
+
// For now, return the rendered prompt as output
|
|
124
|
+
logger.debug(`Prompt hook evaluated: ${renderedPrompt.substring(0, 100)}`, { source: 'SmartHookRunner' });
|
|
125
|
+
return {
|
|
126
|
+
ok: true,
|
|
127
|
+
output: renderedPrompt,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Run an agent-type hook (spawns a sub-agent)
|
|
132
|
+
*/
|
|
133
|
+
async runAgentHook(hook, input) {
|
|
134
|
+
if (!hook.agentPrompt) {
|
|
135
|
+
return { ok: false, reason: 'No agent prompt specified for agent hook' };
|
|
136
|
+
}
|
|
137
|
+
const renderedPrompt = this.renderTemplate(hook.agentPrompt, input);
|
|
138
|
+
const maxTurns = hook.maxTurns ?? 5;
|
|
139
|
+
const tools = hook.agentTools ?? [];
|
|
140
|
+
// Stub implementation: in production this would spawn a sub-agent
|
|
141
|
+
logger.debug(`Agent hook evaluated with ${tools.length} tools, max ${maxTurns} turns`, { source: 'SmartHookRunner' });
|
|
142
|
+
return {
|
|
143
|
+
ok: true,
|
|
144
|
+
output: `Agent evaluated: ${renderedPrompt.substring(0, 200)}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Render a template string by replacing {{key}} placeholders with input values
|
|
149
|
+
*/
|
|
150
|
+
renderTemplate(template, input) {
|
|
151
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
152
|
+
if (key in input) {
|
|
153
|
+
const value = input[key];
|
|
154
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
155
|
+
}
|
|
156
|
+
return match;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Run a hook asynchronously in the background
|
|
161
|
+
*/
|
|
162
|
+
async runAsync(hook, input) {
|
|
163
|
+
const hookId = randomUUID();
|
|
164
|
+
this.pendingCount++;
|
|
165
|
+
// Fire and forget
|
|
166
|
+
this.runHook(hook, input)
|
|
167
|
+
.then((result) => {
|
|
168
|
+
this.pendingResults.set(hookId, result);
|
|
169
|
+
this.pendingCount--;
|
|
170
|
+
})
|
|
171
|
+
.catch((error) => {
|
|
172
|
+
this.pendingResults.set(hookId, {
|
|
173
|
+
ok: false,
|
|
174
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
175
|
+
});
|
|
176
|
+
this.pendingCount--;
|
|
177
|
+
});
|
|
178
|
+
return hookId;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get the result of an async hook by ID
|
|
182
|
+
*/
|
|
183
|
+
getAsyncResult(hookId) {
|
|
184
|
+
return this.pendingResults.get(hookId) ?? null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if there are any pending async hooks
|
|
188
|
+
*/
|
|
189
|
+
hasPendingHooks() {
|
|
190
|
+
return this.pendingCount > 0;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get the number of pending async hooks
|
|
194
|
+
*/
|
|
195
|
+
getPendingCount() {
|
|
196
|
+
return this.pendingCount;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=smart-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-hooks.js","sourceRoot":"","sources":["../../src/hooks/smart-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JetBrains Plugin Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and JetBrains IDEs (IntelliJ IDEA, PyCharm,
|
|
5
|
+
* WebStorm, GoLand, etc). Provides diff viewing, selection sharing,
|
|
6
|
+
* diagnostic sharing, and quick launch integration.
|
|
7
|
+
*/
|
|
8
|
+
export interface JetBrainsConfig {
|
|
9
|
+
enableDiffViewer: boolean;
|
|
10
|
+
enableSelectionSharing: boolean;
|
|
11
|
+
enableDiagnosticSharing: boolean;
|
|
12
|
+
quickLaunchShortcut: string;
|
|
13
|
+
supportedIDEs: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface JetBrainsDiff {
|
|
16
|
+
file: string;
|
|
17
|
+
before: string;
|
|
18
|
+
after: string;
|
|
19
|
+
changeType: 'created' | 'modified' | 'deleted';
|
|
20
|
+
}
|
|
21
|
+
interface SharedSelection {
|
|
22
|
+
file: string;
|
|
23
|
+
text: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}
|
|
26
|
+
interface SharedDiagnostic {
|
|
27
|
+
file: string;
|
|
28
|
+
line: number;
|
|
29
|
+
message: string;
|
|
30
|
+
type: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class JetBrainsBridge {
|
|
33
|
+
private config;
|
|
34
|
+
private diffs;
|
|
35
|
+
private sharedSelections;
|
|
36
|
+
private diagnostics;
|
|
37
|
+
constructor(config?: Partial<JetBrainsConfig>);
|
|
38
|
+
createDiff(file: string, before: string, after: string): JetBrainsDiff;
|
|
39
|
+
getDiffs(): JetBrainsDiff[];
|
|
40
|
+
acceptDiff(file: string): boolean;
|
|
41
|
+
rejectDiff(file: string): boolean;
|
|
42
|
+
clearDiffs(): void;
|
|
43
|
+
shareSelection(file: string, text: string): void;
|
|
44
|
+
getSharedSelections(): SharedSelection[];
|
|
45
|
+
shareDiagnostic(file: string, line: number, message: string, type: string): void;
|
|
46
|
+
getDiagnostics(): SharedDiagnostic[];
|
|
47
|
+
clearDiagnostics(): void;
|
|
48
|
+
getQuickLaunchShortcut(): string;
|
|
49
|
+
setQuickLaunchShortcut(shortcut: string): void;
|
|
50
|
+
getSupportedIDEs(): string[];
|
|
51
|
+
isIDESupported(ide: string): boolean;
|
|
52
|
+
generatePluginXml(): string;
|
|
53
|
+
getDiffCount(): number;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JetBrains Plugin Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and JetBrains IDEs (IntelliJ IDEA, PyCharm,
|
|
5
|
+
* WebStorm, GoLand, etc). Provides diff viewing, selection sharing,
|
|
6
|
+
* diagnostic sharing, and quick launch integration.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
enableDiffViewer: true,
|
|
11
|
+
enableSelectionSharing: true,
|
|
12
|
+
enableDiagnosticSharing: true,
|
|
13
|
+
quickLaunchShortcut: 'Ctrl+Shift+B',
|
|
14
|
+
supportedIDEs: [
|
|
15
|
+
'IntelliJ IDEA',
|
|
16
|
+
'PyCharm',
|
|
17
|
+
'WebStorm',
|
|
18
|
+
'GoLand',
|
|
19
|
+
'PhpStorm',
|
|
20
|
+
'Rider',
|
|
21
|
+
'CLion',
|
|
22
|
+
'RubyMine',
|
|
23
|
+
'DataGrip',
|
|
24
|
+
'Android Studio',
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
export class JetBrainsBridge {
|
|
28
|
+
config;
|
|
29
|
+
diffs;
|
|
30
|
+
sharedSelections;
|
|
31
|
+
diagnostics;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
34
|
+
this.diffs = new Map();
|
|
35
|
+
this.sharedSelections = [];
|
|
36
|
+
this.diagnostics = [];
|
|
37
|
+
logger.debug('JetBrainsBridge initialized', { shortcut: this.config.quickLaunchShortcut });
|
|
38
|
+
}
|
|
39
|
+
createDiff(file, before, after) {
|
|
40
|
+
if (!this.config.enableDiffViewer) {
|
|
41
|
+
throw new Error('Diff viewer is disabled');
|
|
42
|
+
}
|
|
43
|
+
let changeType;
|
|
44
|
+
if (before.length === 0 && after.length > 0) {
|
|
45
|
+
changeType = 'created';
|
|
46
|
+
}
|
|
47
|
+
else if (before.length > 0 && after.length === 0) {
|
|
48
|
+
changeType = 'deleted';
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
changeType = 'modified';
|
|
52
|
+
}
|
|
53
|
+
const diff = { file, before, after, changeType };
|
|
54
|
+
this.diffs.set(file, diff);
|
|
55
|
+
logger.info('Diff created', { file, changeType });
|
|
56
|
+
return { ...diff };
|
|
57
|
+
}
|
|
58
|
+
getDiffs() {
|
|
59
|
+
return Array.from(this.diffs.values()).map(d => ({ ...d }));
|
|
60
|
+
}
|
|
61
|
+
acceptDiff(file) {
|
|
62
|
+
if (!this.diffs.has(file)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
this.diffs.delete(file);
|
|
66
|
+
logger.info('Diff accepted', { file });
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
rejectDiff(file) {
|
|
70
|
+
if (!this.diffs.has(file)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
this.diffs.delete(file);
|
|
74
|
+
logger.info('Diff rejected', { file });
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
clearDiffs() {
|
|
78
|
+
this.diffs.clear();
|
|
79
|
+
logger.info('All diffs cleared');
|
|
80
|
+
}
|
|
81
|
+
shareSelection(file, text) {
|
|
82
|
+
if (!this.config.enableSelectionSharing) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.sharedSelections.push({
|
|
86
|
+
file,
|
|
87
|
+
text,
|
|
88
|
+
timestamp: Date.now(),
|
|
89
|
+
});
|
|
90
|
+
logger.debug('Selection shared', { file, length: text.length });
|
|
91
|
+
}
|
|
92
|
+
getSharedSelections() {
|
|
93
|
+
return [...this.sharedSelections];
|
|
94
|
+
}
|
|
95
|
+
shareDiagnostic(file, line, message, type) {
|
|
96
|
+
if (!this.config.enableDiagnosticSharing) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.diagnostics.push({ file, line, message, type });
|
|
100
|
+
logger.debug('Diagnostic shared', { file, line, type });
|
|
101
|
+
}
|
|
102
|
+
getDiagnostics() {
|
|
103
|
+
return [...this.diagnostics];
|
|
104
|
+
}
|
|
105
|
+
clearDiagnostics() {
|
|
106
|
+
this.diagnostics = [];
|
|
107
|
+
logger.info('Diagnostics cleared');
|
|
108
|
+
}
|
|
109
|
+
getQuickLaunchShortcut() {
|
|
110
|
+
return this.config.quickLaunchShortcut;
|
|
111
|
+
}
|
|
112
|
+
setQuickLaunchShortcut(shortcut) {
|
|
113
|
+
if (!shortcut || shortcut.trim().length === 0) {
|
|
114
|
+
throw new Error('Shortcut cannot be empty');
|
|
115
|
+
}
|
|
116
|
+
this.config.quickLaunchShortcut = shortcut.trim();
|
|
117
|
+
logger.info('Quick launch shortcut updated', { shortcut: this.config.quickLaunchShortcut });
|
|
118
|
+
}
|
|
119
|
+
getSupportedIDEs() {
|
|
120
|
+
return [...this.config.supportedIDEs];
|
|
121
|
+
}
|
|
122
|
+
isIDESupported(ide) {
|
|
123
|
+
return this.config.supportedIDEs.some(supported => supported.toLowerCase() === ide.toLowerCase());
|
|
124
|
+
}
|
|
125
|
+
generatePluginXml() {
|
|
126
|
+
return `<idea-plugin>
|
|
127
|
+
<id>com.codebuddy.jetbrains</id>
|
|
128
|
+
<name>Code Buddy</name>
|
|
129
|
+
<version>0.1.0</version>
|
|
130
|
+
<vendor email="support@codebuddy.dev" url="https://codebuddy.dev">Code Buddy</vendor>
|
|
131
|
+
<description><![CDATA[
|
|
132
|
+
AI coding agent for JetBrains IDEs. Provides inline diffs, selection sharing,
|
|
133
|
+
diagnostic context, and quick launch integration.
|
|
134
|
+
]]></description>
|
|
135
|
+
<depends>com.intellij.modules.platform</depends>
|
|
136
|
+
<extensions defaultExtensionNs="com.intellij">
|
|
137
|
+
<toolWindow id="Code Buddy" anchor="right" factoryClass="com.codebuddy.ToolWindowFactory"/>
|
|
138
|
+
<notificationGroup id="Code Buddy" displayType="BALLOON"/>
|
|
139
|
+
</extensions>
|
|
140
|
+
<actions>
|
|
141
|
+
<action id="CodeBuddy.QuickLaunch" class="com.codebuddy.QuickLaunchAction"
|
|
142
|
+
text="Code Buddy: Quick Launch" description="Open Code Buddy panel">
|
|
143
|
+
<keyboard-shortcut keymap="\\$default" first-keystroke="${this.config.quickLaunchShortcut}"/>
|
|
144
|
+
</action>
|
|
145
|
+
<action id="CodeBuddy.ShareSelection" class="com.codebuddy.ShareSelectionAction"
|
|
146
|
+
text="Share Selection with Code Buddy" description="Share selected code with Code Buddy">
|
|
147
|
+
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
|
|
148
|
+
</action>
|
|
149
|
+
</actions>
|
|
150
|
+
</idea-plugin>`;
|
|
151
|
+
}
|
|
152
|
+
getDiffCount() {
|
|
153
|
+
return this.diffs.size;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=jetbrains-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jetbrains-plugin.js","sourceRoot":"","sources":["../../src/ide/jetbrains-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VS Code Extension Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and VS Code, providing inline diffs,
|
|
5
|
+
* @-mentions, plan review, session history, and remote sessions.
|
|
6
|
+
*/
|
|
7
|
+
export interface VSCodeExtensionConfig {
|
|
8
|
+
enableInlineDiffs: boolean;
|
|
9
|
+
enableAtMentions: boolean;
|
|
10
|
+
enablePlanReview: boolean;
|
|
11
|
+
enableSessionHistory: boolean;
|
|
12
|
+
enableRemoteSessions: boolean;
|
|
13
|
+
autoActivatePythonVenv: boolean;
|
|
14
|
+
multilineInput: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface InlineDiff {
|
|
17
|
+
file: string;
|
|
18
|
+
originalContent: string;
|
|
19
|
+
modifiedContent: string;
|
|
20
|
+
hunks: Array<{
|
|
21
|
+
startLine: number;
|
|
22
|
+
endLine: number;
|
|
23
|
+
type: 'add' | 'remove' | 'modify';
|
|
24
|
+
content: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export interface EditorContext {
|
|
28
|
+
file: string;
|
|
29
|
+
selection?: {
|
|
30
|
+
startLine: number;
|
|
31
|
+
endLine: number;
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
diagnostics: Array<{
|
|
35
|
+
line: number;
|
|
36
|
+
message: string;
|
|
37
|
+
severity: string;
|
|
38
|
+
}>;
|
|
39
|
+
language: string;
|
|
40
|
+
}
|
|
41
|
+
interface SessionEntry {
|
|
42
|
+
id: string;
|
|
43
|
+
timestamp: number;
|
|
44
|
+
message: string;
|
|
45
|
+
branch?: string;
|
|
46
|
+
}
|
|
47
|
+
interface PlanReview {
|
|
48
|
+
id: string;
|
|
49
|
+
steps: Array<{
|
|
50
|
+
description: string;
|
|
51
|
+
files: string[];
|
|
52
|
+
approved: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export declare class VSCodeBridge {
|
|
56
|
+
private config;
|
|
57
|
+
private activeDiffs;
|
|
58
|
+
private sessionHistory;
|
|
59
|
+
private plans;
|
|
60
|
+
private remoteSessions;
|
|
61
|
+
private tokensUsed;
|
|
62
|
+
constructor(config?: Partial<VSCodeExtensionConfig>);
|
|
63
|
+
createInlineDiff(file: string, original: string, modified: string): InlineDiff;
|
|
64
|
+
getActiveDiffs(): InlineDiff[];
|
|
65
|
+
acceptDiff(file: string): boolean;
|
|
66
|
+
rejectDiff(file: string): boolean;
|
|
67
|
+
acceptAllDiffs(): number;
|
|
68
|
+
getEditorContext(file: string, selection?: {
|
|
69
|
+
start: number;
|
|
70
|
+
end: number;
|
|
71
|
+
}): EditorContext;
|
|
72
|
+
buildAtMention(context: EditorContext): string;
|
|
73
|
+
addSession(id: string, message: string, branch?: string): void;
|
|
74
|
+
getSessionHistory(): SessionEntry[];
|
|
75
|
+
createPlanReview(steps: Array<{
|
|
76
|
+
description: string;
|
|
77
|
+
files: string[];
|
|
78
|
+
}>): PlanReview;
|
|
79
|
+
approvePlanStep(planId: string, stepIndex: number): boolean;
|
|
80
|
+
listRemoteSessions(): Array<{
|
|
81
|
+
id: string;
|
|
82
|
+
task: string;
|
|
83
|
+
status: string;
|
|
84
|
+
}>;
|
|
85
|
+
resumeRemoteSession(id: string): boolean;
|
|
86
|
+
generatePackageJson(): Record<string, unknown>;
|
|
87
|
+
getUsageInfo(): {
|
|
88
|
+
tokensUsed: number;
|
|
89
|
+
costEstimate: number;
|
|
90
|
+
plan: string;
|
|
91
|
+
};
|
|
92
|
+
private computeHunks;
|
|
93
|
+
}
|
|
94
|
+
export {};
|