@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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Multi-Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Links git worktrees to Code Buddy sessions for parallel branch work.
|
|
5
|
+
* Singleton pattern for global coordination.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// WorktreeSessionManager
|
|
13
|
+
// ============================================================================
|
|
14
|
+
export class WorktreeSessionManager {
|
|
15
|
+
static instance = null;
|
|
16
|
+
sessions = new Map();
|
|
17
|
+
constructor() {
|
|
18
|
+
logger.debug('WorktreeSessionManager initialized');
|
|
19
|
+
}
|
|
20
|
+
static getInstance() {
|
|
21
|
+
if (!WorktreeSessionManager.instance) {
|
|
22
|
+
WorktreeSessionManager.instance = new WorktreeSessionManager();
|
|
23
|
+
}
|
|
24
|
+
return WorktreeSessionManager.instance;
|
|
25
|
+
}
|
|
26
|
+
static resetInstance() {
|
|
27
|
+
WorktreeSessionManager.instance = null;
|
|
28
|
+
}
|
|
29
|
+
createWorktreeSession(branch, basePath) {
|
|
30
|
+
const worktreePath = path.join(basePath, '.worktrees', branch);
|
|
31
|
+
// Create the worktree directory
|
|
32
|
+
fs.mkdirSync(path.dirname(worktreePath), { recursive: true });
|
|
33
|
+
try {
|
|
34
|
+
execSync(`git worktree add "${worktreePath}" "${branch}"`, {
|
|
35
|
+
cwd: basePath,
|
|
36
|
+
stdio: 'pipe',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
// If worktree already exists or branch doesn't exist, create with -b
|
|
41
|
+
try {
|
|
42
|
+
execSync(`git worktree add -b "${branch}" "${worktreePath}"`, {
|
|
43
|
+
cwd: basePath,
|
|
44
|
+
stdio: 'pipe',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (innerErr) {
|
|
48
|
+
logger.warn(`Failed to create worktree for ${branch}`);
|
|
49
|
+
throw innerErr;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const session = {
|
|
53
|
+
branch,
|
|
54
|
+
worktreePath,
|
|
55
|
+
sessionId: `wt-${branch}-${Date.now()}`,
|
|
56
|
+
createdAt: Date.now(),
|
|
57
|
+
};
|
|
58
|
+
this.sessions.set(branch, session);
|
|
59
|
+
logger.info(`Worktree session created: ${branch} at ${worktreePath}`);
|
|
60
|
+
return session;
|
|
61
|
+
}
|
|
62
|
+
listWorktreeSessions() {
|
|
63
|
+
return Array.from(this.sessions.values());
|
|
64
|
+
}
|
|
65
|
+
getSessionForWorktree(worktreePath) {
|
|
66
|
+
for (const session of this.sessions.values()) {
|
|
67
|
+
if (session.worktreePath === worktreePath) {
|
|
68
|
+
return session;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
cleanupWorktree(branch) {
|
|
74
|
+
const session = this.sessions.get(branch);
|
|
75
|
+
if (!session)
|
|
76
|
+
return false;
|
|
77
|
+
try {
|
|
78
|
+
execSync(`git worktree remove "${session.worktreePath}" --force`, {
|
|
79
|
+
stdio: 'pipe',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
logger.warn(`Failed to remove worktree for ${branch}`);
|
|
84
|
+
}
|
|
85
|
+
this.sessions.delete(branch);
|
|
86
|
+
logger.info(`Worktree session cleaned up: ${branch}`);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
isWorktreeActive(branch) {
|
|
90
|
+
return this.sessions.has(branch);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=worktree-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-sessions.js","sourceRoot":"","sources":["../../src/git/worktree-sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,GAAkC,IAAI,CAAC;IACtD,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE3D;QACE,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,sBAAsB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzC,CAAC;IAED,qBAAqB,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAE/D,gCAAgC;QAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,QAAQ,CAAC,qBAAqB,YAAY,MAAM,MAAM,GAAG,EAAE;gBACzD,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qEAAqE;YACrE,IAAI,CAAC;gBACH,QAAQ,CAAC,wBAAwB,MAAM,MAAM,YAAY,GAAG,EAAE;oBAC5D,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;gBACvD,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAoB;YAC/B,MAAM;YACN,YAAY;YACZ,SAAS,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YACvC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,OAAO,YAAY,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oBAAoB;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,qBAAqB,CAAC,YAAoB;QACxC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,CAAC;YACH,QAAQ,CAAC,wBAAwB,OAAO,CAAC,YAAY,WAAW,EAAE;gBAChE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Hook System
|
|
3
|
+
*
|
|
4
|
+
* Extends the basic hook system with Claude Code-like capabilities:
|
|
5
|
+
* - Command hooks: run shell commands, parse JSON stdout for decisions
|
|
6
|
+
* - Prompt hooks: LLM-evaluated hooks (stub - returns allow with stored prompt)
|
|
7
|
+
* - Agent hooks: spawns subagent evaluation (stub - returns allow)
|
|
8
|
+
*
|
|
9
|
+
* Supports event matching with regex matchers, async fire-and-forget,
|
|
10
|
+
* one-shot hooks, and a registry for CRUD operations.
|
|
11
|
+
*/
|
|
12
|
+
export type AdvancedHookType = 'command' | 'prompt' | 'agent';
|
|
13
|
+
export declare enum HookEvent {
|
|
14
|
+
PreToolUse = "PreToolUse",
|
|
15
|
+
PostToolUse = "PostToolUse",
|
|
16
|
+
PreBash = "PreBash",
|
|
17
|
+
PostBash = "PostBash",
|
|
18
|
+
PreEdit = "PreEdit",
|
|
19
|
+
PostEdit = "PostEdit",
|
|
20
|
+
SessionStart = "SessionStart",
|
|
21
|
+
SessionEnd = "SessionEnd",
|
|
22
|
+
PreCompact = "PreCompact",
|
|
23
|
+
Notification = "Notification",
|
|
24
|
+
SubagentStart = "SubagentStart",
|
|
25
|
+
SubagentStop = "SubagentStop",
|
|
26
|
+
PermissionRequest = "PermissionRequest",
|
|
27
|
+
TaskCompleted = "TaskCompleted"
|
|
28
|
+
}
|
|
29
|
+
export interface AdvancedHook {
|
|
30
|
+
name: string;
|
|
31
|
+
event: HookEvent;
|
|
32
|
+
type: AdvancedHookType;
|
|
33
|
+
matcher?: RegExp;
|
|
34
|
+
command?: string;
|
|
35
|
+
prompt?: string;
|
|
36
|
+
async?: boolean;
|
|
37
|
+
once?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface HookDecision {
|
|
40
|
+
action: 'allow' | 'deny' | 'ask';
|
|
41
|
+
updatedInput?: Record<string, unknown>;
|
|
42
|
+
additionalContext?: string;
|
|
43
|
+
continue?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface HookContext {
|
|
46
|
+
event: HookEvent;
|
|
47
|
+
toolName?: string;
|
|
48
|
+
input?: Record<string, unknown>;
|
|
49
|
+
output?: unknown;
|
|
50
|
+
[key: string]: unknown;
|
|
51
|
+
}
|
|
52
|
+
export declare class AdvancedHookRunner {
|
|
53
|
+
private workingDirectory;
|
|
54
|
+
private timeout;
|
|
55
|
+
constructor(workingDirectory?: string, timeout?: number);
|
|
56
|
+
/**
|
|
57
|
+
* Run a hook and return a decision
|
|
58
|
+
*/
|
|
59
|
+
runHook(hook: AdvancedHook, context: HookContext): Promise<HookDecision>;
|
|
60
|
+
/**
|
|
61
|
+
* Fire-and-forget async hook execution
|
|
62
|
+
*/
|
|
63
|
+
runHookAsync(hook: AdvancedHook, context: HookContext): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a hook matches a given event and optional tool name
|
|
66
|
+
*/
|
|
67
|
+
matchesEvent(hook: AdvancedHook, event: HookEvent, toolName?: string): boolean;
|
|
68
|
+
private runCommandHook;
|
|
69
|
+
private runPromptHook;
|
|
70
|
+
private runAgentHook;
|
|
71
|
+
}
|
|
72
|
+
export declare class HookRegistry {
|
|
73
|
+
private hooks;
|
|
74
|
+
private firedOnceHooks;
|
|
75
|
+
/**
|
|
76
|
+
* Add a hook to the registry
|
|
77
|
+
*/
|
|
78
|
+
addHook(hook: AdvancedHook): void;
|
|
79
|
+
/**
|
|
80
|
+
* Remove a hook by name
|
|
81
|
+
*/
|
|
82
|
+
removeHook(name: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Get all hooks that match a given event, filtering out already-fired once hooks
|
|
85
|
+
*/
|
|
86
|
+
getHooksForEvent(event: HookEvent, toolName?: string): AdvancedHook[];
|
|
87
|
+
/**
|
|
88
|
+
* Mark a once hook as fired
|
|
89
|
+
*/
|
|
90
|
+
markFired(hookName: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* List all registered hooks
|
|
93
|
+
*/
|
|
94
|
+
listHooks(): AdvancedHook[];
|
|
95
|
+
/**
|
|
96
|
+
* Get a hook by name
|
|
97
|
+
*/
|
|
98
|
+
getHook(name: string): AdvancedHook | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Clear all hooks
|
|
101
|
+
*/
|
|
102
|
+
clear(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Get the number of registered hooks
|
|
105
|
+
*/
|
|
106
|
+
get size(): number;
|
|
107
|
+
}
|
|
108
|
+
export declare function getHookRegistry(): HookRegistry;
|
|
109
|
+
export declare function getAdvancedHookRunner(workingDirectory?: string): AdvancedHookRunner;
|
|
110
|
+
export declare function resetAdvancedHooks(): void;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Hook System
|
|
3
|
+
*
|
|
4
|
+
* Extends the basic hook system with Claude Code-like capabilities:
|
|
5
|
+
* - Command hooks: run shell commands, parse JSON stdout for decisions
|
|
6
|
+
* - Prompt hooks: LLM-evaluated hooks (stub - returns allow with stored prompt)
|
|
7
|
+
* - Agent hooks: spawns subagent evaluation (stub - returns allow)
|
|
8
|
+
*
|
|
9
|
+
* Supports event matching with regex matchers, async fire-and-forget,
|
|
10
|
+
* one-shot hooks, and a registry for CRUD operations.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'child_process';
|
|
13
|
+
import { logger } from '../utils/logger.js';
|
|
14
|
+
export var HookEvent;
|
|
15
|
+
(function (HookEvent) {
|
|
16
|
+
HookEvent["PreToolUse"] = "PreToolUse";
|
|
17
|
+
HookEvent["PostToolUse"] = "PostToolUse";
|
|
18
|
+
HookEvent["PreBash"] = "PreBash";
|
|
19
|
+
HookEvent["PostBash"] = "PostBash";
|
|
20
|
+
HookEvent["PreEdit"] = "PreEdit";
|
|
21
|
+
HookEvent["PostEdit"] = "PostEdit";
|
|
22
|
+
HookEvent["SessionStart"] = "SessionStart";
|
|
23
|
+
HookEvent["SessionEnd"] = "SessionEnd";
|
|
24
|
+
HookEvent["PreCompact"] = "PreCompact";
|
|
25
|
+
HookEvent["Notification"] = "Notification";
|
|
26
|
+
HookEvent["SubagentStart"] = "SubagentStart";
|
|
27
|
+
HookEvent["SubagentStop"] = "SubagentStop";
|
|
28
|
+
HookEvent["PermissionRequest"] = "PermissionRequest";
|
|
29
|
+
HookEvent["TaskCompleted"] = "TaskCompleted";
|
|
30
|
+
})(HookEvent || (HookEvent = {}));
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// AdvancedHookRunner
|
|
33
|
+
// ============================================================================
|
|
34
|
+
export class AdvancedHookRunner {
|
|
35
|
+
workingDirectory;
|
|
36
|
+
timeout;
|
|
37
|
+
constructor(workingDirectory = process.cwd(), timeout = 30000) {
|
|
38
|
+
this.workingDirectory = workingDirectory;
|
|
39
|
+
this.timeout = timeout;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run a hook and return a decision
|
|
43
|
+
*/
|
|
44
|
+
async runHook(hook, context) {
|
|
45
|
+
switch (hook.type) {
|
|
46
|
+
case 'command':
|
|
47
|
+
return this.runCommandHook(hook, context);
|
|
48
|
+
case 'prompt':
|
|
49
|
+
return this.runPromptHook(hook, context);
|
|
50
|
+
case 'agent':
|
|
51
|
+
return this.runAgentHook(hook, context);
|
|
52
|
+
default:
|
|
53
|
+
logger.warn(`Unknown hook type: ${hook.type}`, { source: 'AdvancedHookRunner' });
|
|
54
|
+
return { action: 'allow' };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Fire-and-forget async hook execution
|
|
59
|
+
*/
|
|
60
|
+
async runHookAsync(hook, context) {
|
|
61
|
+
this.runHook(hook, context).catch((error) => {
|
|
62
|
+
logger.warn(`Async hook "${hook.name}" failed: ${error}`, { source: 'AdvancedHookRunner' });
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if a hook matches a given event and optional tool name
|
|
67
|
+
*/
|
|
68
|
+
matchesEvent(hook, event, toolName) {
|
|
69
|
+
if (hook.event !== event) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (hook.matcher && toolName) {
|
|
73
|
+
return hook.matcher.test(toolName);
|
|
74
|
+
}
|
|
75
|
+
// If no matcher, match all tools for that event
|
|
76
|
+
if (!hook.matcher) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
// Has matcher but no toolName provided - no match
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
async runCommandHook(hook, context) {
|
|
83
|
+
if (!hook.command) {
|
|
84
|
+
logger.warn(`Command hook "${hook.name}" has no command`, { source: 'AdvancedHookRunner' });
|
|
85
|
+
return { action: 'allow' };
|
|
86
|
+
}
|
|
87
|
+
return new Promise((resolve) => {
|
|
88
|
+
let timedOut = false;
|
|
89
|
+
const child = spawn(hook.command, [], {
|
|
90
|
+
cwd: this.workingDirectory,
|
|
91
|
+
shell: true,
|
|
92
|
+
env: {
|
|
93
|
+
...process.env,
|
|
94
|
+
HOOK_EVENT: context.event,
|
|
95
|
+
HOOK_TOOL: context.toolName || '',
|
|
96
|
+
HOOK_INPUT: JSON.stringify(context.input || {}),
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
let stdout = '';
|
|
100
|
+
let stderr = '';
|
|
101
|
+
const timeoutId = setTimeout(() => {
|
|
102
|
+
timedOut = true;
|
|
103
|
+
child.kill('SIGTERM');
|
|
104
|
+
}, this.timeout);
|
|
105
|
+
child.stdout?.on('data', (data) => {
|
|
106
|
+
stdout += data.toString();
|
|
107
|
+
});
|
|
108
|
+
child.stderr?.on('data', (data) => {
|
|
109
|
+
stderr += data.toString();
|
|
110
|
+
});
|
|
111
|
+
child.on('close', (code) => {
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
if (timedOut) {
|
|
114
|
+
logger.warn(`Command hook "${hook.name}" timed out`, { source: 'AdvancedHookRunner' });
|
|
115
|
+
resolve({ action: 'allow' });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (code !== 0) {
|
|
119
|
+
logger.warn(`Command hook "${hook.name}" exited with code ${code}: ${stderr}`, { source: 'AdvancedHookRunner' });
|
|
120
|
+
resolve({ action: 'allow' });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const decision = JSON.parse(stdout.trim());
|
|
125
|
+
if (decision.action && ['allow', 'deny', 'ask'].includes(decision.action)) {
|
|
126
|
+
resolve(decision);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.warn(`Command hook "${hook.name}" returned invalid action`, { source: 'AdvancedHookRunner' });
|
|
130
|
+
resolve({ action: 'allow' });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Non-JSON output: if exit code 0, allow; non-zero handled above
|
|
135
|
+
resolve({ action: 'allow' });
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
child.on('error', (error) => {
|
|
139
|
+
clearTimeout(timeoutId);
|
|
140
|
+
logger.warn(`Command hook "${hook.name}" failed: ${error.message}`, { source: 'AdvancedHookRunner' });
|
|
141
|
+
resolve({ action: 'allow' });
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async runPromptHook(hook, _context) {
|
|
146
|
+
// Stub: returns allow with the prompt text stored as additional context
|
|
147
|
+
logger.debug(`Prompt hook "${hook.name}" evaluated (stub)`, { source: 'AdvancedHookRunner' });
|
|
148
|
+
return {
|
|
149
|
+
action: 'allow',
|
|
150
|
+
additionalContext: hook.prompt || undefined,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async runAgentHook(hook, _context) {
|
|
154
|
+
// Stub: returns allow
|
|
155
|
+
logger.debug(`Agent hook "${hook.name}" evaluated (stub)`, { source: 'AdvancedHookRunner' });
|
|
156
|
+
return { action: 'allow' };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// HookRegistry
|
|
161
|
+
// ============================================================================
|
|
162
|
+
export class HookRegistry {
|
|
163
|
+
hooks = new Map();
|
|
164
|
+
firedOnceHooks = new Set();
|
|
165
|
+
/**
|
|
166
|
+
* Add a hook to the registry
|
|
167
|
+
*/
|
|
168
|
+
addHook(hook) {
|
|
169
|
+
this.hooks.set(hook.name, hook);
|
|
170
|
+
logger.debug(`Hook "${hook.name}" registered for event ${hook.event}`, { source: 'HookRegistry' });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Remove a hook by name
|
|
174
|
+
*/
|
|
175
|
+
removeHook(name) {
|
|
176
|
+
const deleted = this.hooks.delete(name);
|
|
177
|
+
this.firedOnceHooks.delete(name);
|
|
178
|
+
if (deleted) {
|
|
179
|
+
logger.debug(`Hook "${name}" removed`, { source: 'HookRegistry' });
|
|
180
|
+
}
|
|
181
|
+
return deleted;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all hooks that match a given event, filtering out already-fired once hooks
|
|
185
|
+
*/
|
|
186
|
+
getHooksForEvent(event, toolName) {
|
|
187
|
+
const runner = new AdvancedHookRunner();
|
|
188
|
+
const matching = [];
|
|
189
|
+
for (const hook of this.hooks.values()) {
|
|
190
|
+
// Skip once hooks that already fired
|
|
191
|
+
if (hook.once && this.firedOnceHooks.has(hook.name)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (runner.matchesEvent(hook, event, toolName)) {
|
|
195
|
+
matching.push(hook);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return matching;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Mark a once hook as fired
|
|
202
|
+
*/
|
|
203
|
+
markFired(hookName) {
|
|
204
|
+
const hook = this.hooks.get(hookName);
|
|
205
|
+
if (hook?.once) {
|
|
206
|
+
this.firedOnceHooks.add(hookName);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* List all registered hooks
|
|
211
|
+
*/
|
|
212
|
+
listHooks() {
|
|
213
|
+
return Array.from(this.hooks.values());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get a hook by name
|
|
217
|
+
*/
|
|
218
|
+
getHook(name) {
|
|
219
|
+
return this.hooks.get(name);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Clear all hooks
|
|
223
|
+
*/
|
|
224
|
+
clear() {
|
|
225
|
+
this.hooks.clear();
|
|
226
|
+
this.firedOnceHooks.clear();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get the number of registered hooks
|
|
230
|
+
*/
|
|
231
|
+
get size() {
|
|
232
|
+
return this.hooks.size;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// Singleton
|
|
237
|
+
// ============================================================================
|
|
238
|
+
let registryInstance = null;
|
|
239
|
+
let runnerInstance = null;
|
|
240
|
+
export function getHookRegistry() {
|
|
241
|
+
if (!registryInstance) {
|
|
242
|
+
registryInstance = new HookRegistry();
|
|
243
|
+
}
|
|
244
|
+
return registryInstance;
|
|
245
|
+
}
|
|
246
|
+
export function getAdvancedHookRunner(workingDirectory) {
|
|
247
|
+
if (!runnerInstance || workingDirectory) {
|
|
248
|
+
runnerInstance = new AdvancedHookRunner(workingDirectory);
|
|
249
|
+
}
|
|
250
|
+
return runnerInstance;
|
|
251
|
+
}
|
|
252
|
+
export function resetAdvancedHooks() {
|
|
253
|
+
registryInstance = null;
|
|
254
|
+
runnerInstance = null;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=advanced-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-hooks.js","sourceRoot":"","sources":["../../src/hooks/advanced-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Hook Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages asynchronous hook execution with concurrency control,
|
|
5
|
+
* job tracking, and result collection. Completed hook results
|
|
6
|
+
* can be injected as system messages into the next conversation turn.
|
|
7
|
+
*/
|
|
8
|
+
import type { SmartHookConfig, SmartHookResult } from './smart-hooks.js';
|
|
9
|
+
export type AsyncHookStatus = 'running' | 'completed' | 'failed' | 'timeout' | 'cancelled';
|
|
10
|
+
export interface AsyncHookJob {
|
|
11
|
+
/** Unique job ID */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Hook configuration */
|
|
14
|
+
hookConfig: SmartHookConfig;
|
|
15
|
+
/** Input data */
|
|
16
|
+
input: Record<string, any>;
|
|
17
|
+
/** Start timestamp */
|
|
18
|
+
startTime: number;
|
|
19
|
+
/** Current status */
|
|
20
|
+
status: AsyncHookStatus;
|
|
21
|
+
/** Result (when completed) */
|
|
22
|
+
result?: SmartHookResult;
|
|
23
|
+
/** Error message (when failed) */
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class AsyncHookManager {
|
|
27
|
+
private jobs;
|
|
28
|
+
private maxConcurrent;
|
|
29
|
+
private runner;
|
|
30
|
+
private completedSinceLastCheck;
|
|
31
|
+
private cancelTokens;
|
|
32
|
+
constructor(maxConcurrent?: number);
|
|
33
|
+
/**
|
|
34
|
+
* Submit an async hook for execution
|
|
35
|
+
*/
|
|
36
|
+
submit(hook: SmartHookConfig, input: Record<string, any>): string;
|
|
37
|
+
/**
|
|
38
|
+
* Execute a job asynchronously
|
|
39
|
+
*/
|
|
40
|
+
private executeJob;
|
|
41
|
+
/**
|
|
42
|
+
* Get a job by ID
|
|
43
|
+
*/
|
|
44
|
+
getJob(jobId: string): AsyncHookJob | null;
|
|
45
|
+
/**
|
|
46
|
+
* Get all jobs completed since the last call to this method
|
|
47
|
+
*/
|
|
48
|
+
getCompletedJobs(): AsyncHookJob[];
|
|
49
|
+
/**
|
|
50
|
+
* Get results formatted as system messages for the next conversation turn
|
|
51
|
+
*/
|
|
52
|
+
getSystemMessages(): string[];
|
|
53
|
+
/**
|
|
54
|
+
* Clear all completed/failed jobs
|
|
55
|
+
*/
|
|
56
|
+
clearCompleted(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Cancel a running job
|
|
59
|
+
*/
|
|
60
|
+
cancel(jobId: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get the number of currently running jobs
|
|
63
|
+
*/
|
|
64
|
+
getRunningCount(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Get the total number of tracked jobs
|
|
67
|
+
*/
|
|
68
|
+
getTotalCount(): number;
|
|
69
|
+
/**
|
|
70
|
+
* Dispose of all jobs and clean up
|
|
71
|
+
*/
|
|
72
|
+
dispose(): void;
|
|
73
|
+
}
|