@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,125 @@
|
|
|
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
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* Engine for generating follow-up prompt suggestions based on
|
|
13
|
+
* conversation context and the last assistant response.
|
|
14
|
+
*/
|
|
15
|
+
export class PromptSuggestionEngine {
|
|
16
|
+
enabled;
|
|
17
|
+
cachedSuggestions;
|
|
18
|
+
constructor(enabled = true) {
|
|
19
|
+
this.enabled = enabled;
|
|
20
|
+
this.cachedSuggestions = [];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if suggestions are enabled
|
|
24
|
+
*/
|
|
25
|
+
isEnabled() {
|
|
26
|
+
return this.enabled;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Enable or disable suggestion generation
|
|
30
|
+
*/
|
|
31
|
+
setEnabled(value) {
|
|
32
|
+
this.enabled = value;
|
|
33
|
+
if (!value) {
|
|
34
|
+
this.cachedSuggestions = [];
|
|
35
|
+
}
|
|
36
|
+
logger.info(`Prompt suggestions ${value ? 'enabled' : 'disabled'}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate 2-3 follow-up suggestions based on context and last response.
|
|
40
|
+
*
|
|
41
|
+
* Currently returns the formatted prompt string that would be sent to an LLM.
|
|
42
|
+
* The actual LLM call is stubbed for now - integrate with CodeBuddyClient
|
|
43
|
+
* when ready.
|
|
44
|
+
*
|
|
45
|
+
* @param context - The conversation context or user's last message
|
|
46
|
+
* @param lastResponse - The assistant's last response
|
|
47
|
+
* @returns Array of suggestion strings
|
|
48
|
+
*/
|
|
49
|
+
async generateSuggestions(context, lastResponse) {
|
|
50
|
+
if (!this.enabled) {
|
|
51
|
+
this.cachedSuggestions = [];
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
if (!context && !lastResponse) {
|
|
55
|
+
this.cachedSuggestions = [];
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
// Build the prompt that would be sent to the LLM
|
|
59
|
+
const prompt = this.buildSuggestionPrompt(context, lastResponse);
|
|
60
|
+
// Stub: parse suggestions from the prompt structure
|
|
61
|
+
// In production, this would call the LLM and parse the response
|
|
62
|
+
const suggestions = this.parseStubSuggestions(context, lastResponse);
|
|
63
|
+
this.cachedSuggestions = suggestions;
|
|
64
|
+
logger.debug(`Generated ${suggestions.length} prompt suggestions`);
|
|
65
|
+
return suggestions;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the cached suggestions from the last generateSuggestions call
|
|
69
|
+
*/
|
|
70
|
+
getSuggestions() {
|
|
71
|
+
return [...this.cachedSuggestions];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Clear cached suggestions
|
|
75
|
+
*/
|
|
76
|
+
clearSuggestions() {
|
|
77
|
+
this.cachedSuggestions = [];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build the prompt for suggestion generation
|
|
81
|
+
*/
|
|
82
|
+
buildSuggestionPrompt(context, lastResponse) {
|
|
83
|
+
return [
|
|
84
|
+
'Based on the following conversation, suggest 2-3 short follow-up questions or actions the user might want to take next.',
|
|
85
|
+
'',
|
|
86
|
+
'User context:',
|
|
87
|
+
context,
|
|
88
|
+
'',
|
|
89
|
+
'Assistant response:',
|
|
90
|
+
lastResponse,
|
|
91
|
+
'',
|
|
92
|
+
'Provide 2-3 brief, actionable follow-up suggestions (one per line, no numbering):',
|
|
93
|
+
].join('\n');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Stub implementation that generates suggestions based on keywords.
|
|
97
|
+
* Replace with actual LLM call in production.
|
|
98
|
+
*/
|
|
99
|
+
parseStubSuggestions(context, lastResponse) {
|
|
100
|
+
const combined = `${context} ${lastResponse}`.toLowerCase();
|
|
101
|
+
const suggestions = [];
|
|
102
|
+
if (combined.includes('test')) {
|
|
103
|
+
suggestions.push('Run the test suite to verify changes');
|
|
104
|
+
}
|
|
105
|
+
if (combined.includes('error') || combined.includes('bug') || combined.includes('fix')) {
|
|
106
|
+
suggestions.push('Show me the full error stack trace');
|
|
107
|
+
}
|
|
108
|
+
if (combined.includes('file') || combined.includes('code')) {
|
|
109
|
+
suggestions.push('Review the related files for potential issues');
|
|
110
|
+
}
|
|
111
|
+
if (combined.includes('refactor')) {
|
|
112
|
+
suggestions.push('Extract this into a separate function');
|
|
113
|
+
}
|
|
114
|
+
if (combined.includes('deploy') || combined.includes('build')) {
|
|
115
|
+
suggestions.push('Check the build output for warnings');
|
|
116
|
+
}
|
|
117
|
+
// Always return at least 2 suggestions
|
|
118
|
+
if (suggestions.length < 2) {
|
|
119
|
+
suggestions.push('Tell me more about this');
|
|
120
|
+
suggestions.push('What are the next steps?');
|
|
121
|
+
}
|
|
122
|
+
return suggestions.slice(0, 3);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=prompt-suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-suggestions.js","sourceRoot":"","sources":["../../src/agent/prompt-suggestions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-mode Rewind Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides rewind points that capture both conversation and file state,
|
|
5
|
+
* with multiple rewind modes: conversation-only, code-only, full, and fork.
|
|
6
|
+
*/
|
|
7
|
+
export type RewindMode = 'conversation' | 'code' | 'full' | 'fork';
|
|
8
|
+
export interface ConversationSnapshot {
|
|
9
|
+
messages: unknown[];
|
|
10
|
+
turnIndex: number;
|
|
11
|
+
}
|
|
12
|
+
export interface FileSnapshot {
|
|
13
|
+
checkpointId: string;
|
|
14
|
+
files: Map<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface RewindPoint {
|
|
17
|
+
id: string;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
description: string;
|
|
20
|
+
conversation: ConversationSnapshot;
|
|
21
|
+
files: FileSnapshot;
|
|
22
|
+
}
|
|
23
|
+
export interface RewindResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
mode: RewindMode;
|
|
26
|
+
restoredTurn?: number;
|
|
27
|
+
restoredFiles?: string[];
|
|
28
|
+
branchId?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* RewindManager manages rewind points and supports multiple rewind modes.
|
|
32
|
+
*/
|
|
33
|
+
export declare class RewindManager {
|
|
34
|
+
private points;
|
|
35
|
+
private counter;
|
|
36
|
+
private branches;
|
|
37
|
+
/**
|
|
38
|
+
* Create a rewind point capturing conversation and file state.
|
|
39
|
+
*/
|
|
40
|
+
createRewindPoint(conversationState: ConversationSnapshot, fileState: FileSnapshot, description?: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Rewind to a specific point using the given mode.
|
|
43
|
+
*/
|
|
44
|
+
rewind(pointId: string, mode: RewindMode): RewindResult;
|
|
45
|
+
/**
|
|
46
|
+
* Get all rewind points.
|
|
47
|
+
*/
|
|
48
|
+
getRewindPoints(): RewindPoint[];
|
|
49
|
+
/**
|
|
50
|
+
* Get the latest rewind point.
|
|
51
|
+
*/
|
|
52
|
+
getLatestPoint(): RewindPoint | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Clear all rewind history.
|
|
55
|
+
*/
|
|
56
|
+
clearHistory(): void;
|
|
57
|
+
}
|
|
58
|
+
export declare function getRewindManager(): RewindManager;
|
|
59
|
+
export declare function resetRewindManager(): void;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-mode Rewind Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides rewind points that capture both conversation and file state,
|
|
5
|
+
* with multiple rewind modes: conversation-only, code-only, full, and fork.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* RewindManager manages rewind points and supports multiple rewind modes.
|
|
10
|
+
*/
|
|
11
|
+
export class RewindManager {
|
|
12
|
+
points = [];
|
|
13
|
+
counter = 0;
|
|
14
|
+
branches = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Create a rewind point capturing conversation and file state.
|
|
17
|
+
*/
|
|
18
|
+
createRewindPoint(conversationState, fileState, description) {
|
|
19
|
+
this.counter++;
|
|
20
|
+
const id = `rw-${this.counter}`;
|
|
21
|
+
const point = {
|
|
22
|
+
id,
|
|
23
|
+
timestamp: Date.now(),
|
|
24
|
+
description: description ?? `Rewind point ${this.counter}`,
|
|
25
|
+
conversation: {
|
|
26
|
+
messages: JSON.parse(JSON.stringify(conversationState.messages)),
|
|
27
|
+
turnIndex: conversationState.turnIndex,
|
|
28
|
+
},
|
|
29
|
+
files: {
|
|
30
|
+
checkpointId: fileState.checkpointId,
|
|
31
|
+
files: new Map(fileState.files),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
this.points.push(point);
|
|
35
|
+
logger.debug(`[RewindManager] Created rewind point ${id}`);
|
|
36
|
+
return id;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Rewind to a specific point using the given mode.
|
|
40
|
+
*/
|
|
41
|
+
rewind(pointId, mode) {
|
|
42
|
+
const point = this.points.find((p) => p.id === pointId);
|
|
43
|
+
if (!point) {
|
|
44
|
+
logger.warn(`[RewindManager] Rewind point ${pointId} not found`);
|
|
45
|
+
return { success: false, mode };
|
|
46
|
+
}
|
|
47
|
+
switch (mode) {
|
|
48
|
+
case 'conversation':
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
mode,
|
|
52
|
+
restoredTurn: point.conversation.turnIndex,
|
|
53
|
+
};
|
|
54
|
+
case 'code':
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
mode,
|
|
58
|
+
restoredFiles: Array.from(point.files.files.keys()),
|
|
59
|
+
};
|
|
60
|
+
case 'full':
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
mode,
|
|
64
|
+
restoredTurn: point.conversation.turnIndex,
|
|
65
|
+
restoredFiles: Array.from(point.files.files.keys()),
|
|
66
|
+
};
|
|
67
|
+
case 'fork': {
|
|
68
|
+
const branchId = `fork-${pointId}-${Date.now()}`;
|
|
69
|
+
this.branches.set(branchId, {
|
|
70
|
+
...point,
|
|
71
|
+
conversation: {
|
|
72
|
+
messages: JSON.parse(JSON.stringify(point.conversation.messages)),
|
|
73
|
+
turnIndex: point.conversation.turnIndex,
|
|
74
|
+
},
|
|
75
|
+
files: {
|
|
76
|
+
checkpointId: point.files.checkpointId,
|
|
77
|
+
files: new Map(point.files.files),
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
logger.debug(`[RewindManager] Forked from ${pointId} as ${branchId}`);
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
mode,
|
|
84
|
+
restoredTurn: point.conversation.turnIndex,
|
|
85
|
+
branchId,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
return { success: false, mode };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all rewind points.
|
|
94
|
+
*/
|
|
95
|
+
getRewindPoints() {
|
|
96
|
+
return [...this.points];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the latest rewind point.
|
|
100
|
+
*/
|
|
101
|
+
getLatestPoint() {
|
|
102
|
+
return this.points.length > 0 ? this.points[this.points.length - 1] : undefined;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clear all rewind history.
|
|
106
|
+
*/
|
|
107
|
+
clearHistory() {
|
|
108
|
+
this.points = [];
|
|
109
|
+
this.branches.clear();
|
|
110
|
+
logger.debug('[RewindManager] History cleared');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Singleton
|
|
114
|
+
let instance = null;
|
|
115
|
+
export function getRewindManager() {
|
|
116
|
+
if (!instance) {
|
|
117
|
+
instance = new RewindManager();
|
|
118
|
+
}
|
|
119
|
+
return instance;
|
|
120
|
+
}
|
|
121
|
+
export function resetRewindManager() {
|
|
122
|
+
instance = null;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=rewind-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewind-manager.js","sourceRoot":"","sources":["../../src/agent/rewind-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Teams
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multiple agent instances working together on tasks.
|
|
5
|
+
* Supports auto, in-process, and tmux teammate modes.
|
|
6
|
+
*/
|
|
7
|
+
export type TeammateMode = 'auto' | 'in-process' | 'tmux';
|
|
8
|
+
export interface TeamConfig {
|
|
9
|
+
mode: TeammateMode;
|
|
10
|
+
maxTeammates: number;
|
|
11
|
+
sharedTaskList: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type TeammateStatus = 'idle' | 'busy' | 'offline';
|
|
14
|
+
export interface TeammateConfig {
|
|
15
|
+
mode?: TeammateMode;
|
|
16
|
+
capabilities?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface TeammateInfo {
|
|
19
|
+
name: string;
|
|
20
|
+
config: TeammateConfig;
|
|
21
|
+
status: TeammateStatus;
|
|
22
|
+
assignedTasks: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface TeamMessage {
|
|
25
|
+
from: string;
|
|
26
|
+
to: string | 'all';
|
|
27
|
+
content: string;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
}
|
|
30
|
+
export interface SharedContext {
|
|
31
|
+
tasks: Map<string, {
|
|
32
|
+
assignedTo: string;
|
|
33
|
+
status: string;
|
|
34
|
+
}>;
|
|
35
|
+
teammates: string[];
|
|
36
|
+
messages: TeamMessage[];
|
|
37
|
+
}
|
|
38
|
+
export declare class AgentTeam {
|
|
39
|
+
private teammates;
|
|
40
|
+
private messageQueue;
|
|
41
|
+
private config;
|
|
42
|
+
constructor(config?: Partial<TeamConfig>);
|
|
43
|
+
addTeammate(name: string, config?: TeammateConfig): boolean;
|
|
44
|
+
removeTeammate(name: string): boolean;
|
|
45
|
+
getTeammates(): TeammateInfo[];
|
|
46
|
+
delegateTask(taskId: string, teammateName: string): boolean;
|
|
47
|
+
broadcastMessage(message: string, from?: string): void;
|
|
48
|
+
sendMessage(from: string, to: string, content: string): void;
|
|
49
|
+
getMessages(forTeammate: string): TeamMessage[];
|
|
50
|
+
getSharedContext(): SharedContext;
|
|
51
|
+
getConfig(): TeamConfig;
|
|
52
|
+
}
|
|
53
|
+
export declare function getAgentTeam(config?: Partial<TeamConfig>): AgentTeam;
|
|
54
|
+
export declare function resetAgentTeam(): void;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Teams
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multiple agent instances working together on tasks.
|
|
5
|
+
* Supports auto, in-process, and tmux teammate modes.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
const DEFAULT_TEAM_CONFIG = {
|
|
9
|
+
mode: 'auto',
|
|
10
|
+
maxTeammates: 5,
|
|
11
|
+
sharedTaskList: true,
|
|
12
|
+
};
|
|
13
|
+
export class AgentTeam {
|
|
14
|
+
teammates = new Map();
|
|
15
|
+
messageQueue = [];
|
|
16
|
+
config;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = { ...DEFAULT_TEAM_CONFIG, ...config };
|
|
19
|
+
}
|
|
20
|
+
addTeammate(name, config = {}) {
|
|
21
|
+
if (this.teammates.has(name)) {
|
|
22
|
+
logger.warn(`Teammate "${name}" already exists`);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (this.teammates.size >= this.config.maxTeammates) {
|
|
26
|
+
logger.warn(`Max teammates (${this.config.maxTeammates}) reached`);
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
this.teammates.set(name, {
|
|
30
|
+
name,
|
|
31
|
+
config,
|
|
32
|
+
status: 'idle',
|
|
33
|
+
assignedTasks: [],
|
|
34
|
+
});
|
|
35
|
+
logger.info(`Teammate "${name}" added to team`);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
removeTeammate(name) {
|
|
39
|
+
if (!this.teammates.has(name)) {
|
|
40
|
+
logger.warn(`Teammate "${name}" not found`);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
this.teammates.delete(name);
|
|
44
|
+
logger.info(`Teammate "${name}" removed from team`);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
getTeammates() {
|
|
48
|
+
return Array.from(this.teammates.values());
|
|
49
|
+
}
|
|
50
|
+
delegateTask(taskId, teammateName) {
|
|
51
|
+
const teammate = this.teammates.get(teammateName);
|
|
52
|
+
if (!teammate) {
|
|
53
|
+
logger.warn(`Teammate "${teammateName}" not found for task delegation`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
teammate.assignedTasks.push(taskId);
|
|
57
|
+
teammate.status = 'busy';
|
|
58
|
+
logger.info(`Task "${taskId}" delegated to "${teammateName}"`);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
broadcastMessage(message, from = 'system') {
|
|
62
|
+
const teamMessage = {
|
|
63
|
+
from,
|
|
64
|
+
to: 'all',
|
|
65
|
+
content: message,
|
|
66
|
+
timestamp: Date.now(),
|
|
67
|
+
};
|
|
68
|
+
this.messageQueue.push(teamMessage);
|
|
69
|
+
logger.info(`Broadcast message from "${from}" to all teammates`);
|
|
70
|
+
}
|
|
71
|
+
sendMessage(from, to, content) {
|
|
72
|
+
const teamMessage = {
|
|
73
|
+
from,
|
|
74
|
+
to,
|
|
75
|
+
content,
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
};
|
|
78
|
+
this.messageQueue.push(teamMessage);
|
|
79
|
+
logger.debug(`Message from "${from}" to "${to}"`);
|
|
80
|
+
}
|
|
81
|
+
getMessages(forTeammate) {
|
|
82
|
+
return this.messageQueue.filter((msg) => msg.to === forTeammate || msg.to === 'all');
|
|
83
|
+
}
|
|
84
|
+
getSharedContext() {
|
|
85
|
+
const tasks = new Map();
|
|
86
|
+
for (const teammate of this.teammates.values()) {
|
|
87
|
+
for (const taskId of teammate.assignedTasks) {
|
|
88
|
+
tasks.set(taskId, {
|
|
89
|
+
assignedTo: teammate.name,
|
|
90
|
+
status: teammate.status,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
tasks,
|
|
96
|
+
teammates: Array.from(this.teammates.keys()),
|
|
97
|
+
messages: [...this.messageQueue],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
getConfig() {
|
|
101
|
+
return { ...this.config };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let agentTeamInstance = null;
|
|
105
|
+
export function getAgentTeam(config) {
|
|
106
|
+
if (!agentTeamInstance) {
|
|
107
|
+
agentTeamInstance = new AgentTeam(config);
|
|
108
|
+
}
|
|
109
|
+
return agentTeamInstance;
|
|
110
|
+
}
|
|
111
|
+
export function resetAgentTeam() {
|
|
112
|
+
agentTeamInstance = null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=agent-team.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-team.js","sourceRoot":"","sources":["../../../src/agent/teams/agent-team.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AgentTeam, getAgentTeam, resetAgentTeam, type TeammateMode, type TeamConfig, type TeammateStatus, type TeammateConfig, type TeammateInfo, type TeamMessage, type SharedContext, } from './agent-team.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,GAQf,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Teams v2
|
|
3
|
+
*
|
|
4
|
+
* Enhanced agent teams with shared task list, mailbox, tmux support,
|
|
5
|
+
* delegate mode, and plan approval.
|
|
6
|
+
*/
|
|
7
|
+
export interface TeamTask {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
status: 'pending' | 'claimed' | 'in_progress' | 'completed' | 'failed';
|
|
12
|
+
assignee?: string;
|
|
13
|
+
dependencies: string[];
|
|
14
|
+
lockedFiles: string[];
|
|
15
|
+
createdAt: number;
|
|
16
|
+
completedAt?: number;
|
|
17
|
+
failReason?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface MailboxMessage {
|
|
20
|
+
id: string;
|
|
21
|
+
from: string;
|
|
22
|
+
to: string | 'broadcast';
|
|
23
|
+
content: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
read: boolean;
|
|
26
|
+
}
|
|
27
|
+
export type TeammateMode = 'auto' | 'in-process' | 'tmux';
|
|
28
|
+
export interface TeamConfig {
|
|
29
|
+
name: string;
|
|
30
|
+
leadAgent: string;
|
|
31
|
+
teammates: string[];
|
|
32
|
+
mode: TeammateMode;
|
|
33
|
+
delegateMode: boolean;
|
|
34
|
+
planApproval: boolean;
|
|
35
|
+
configPath: string;
|
|
36
|
+
}
|
|
37
|
+
export declare class TeamTaskList {
|
|
38
|
+
private tasks;
|
|
39
|
+
constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Add a new task
|
|
42
|
+
*/
|
|
43
|
+
addTask(title: string, description: string, dependencies?: string[]): TeamTask;
|
|
44
|
+
/**
|
|
45
|
+
* Claim a task for an agent
|
|
46
|
+
*/
|
|
47
|
+
claimTask(taskId: string, agentName: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Complete a task
|
|
50
|
+
*/
|
|
51
|
+
completeTask(taskId: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Fail a task
|
|
54
|
+
*/
|
|
55
|
+
failTask(taskId: string, reason: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Get tasks available for an agent (pending with satisfied deps)
|
|
58
|
+
*/
|
|
59
|
+
getAvailableTasks(_agentName: string): TeamTask[];
|
|
60
|
+
/**
|
|
61
|
+
* Get tasks assigned to an agent
|
|
62
|
+
*/
|
|
63
|
+
getTasksByAgent(agentName: string): TeamTask[];
|
|
64
|
+
/**
|
|
65
|
+
* Lock a file for a task
|
|
66
|
+
*/
|
|
67
|
+
lockFile(taskId: string, file: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if a file is locked
|
|
70
|
+
*/
|
|
71
|
+
isFileLocked(file: string): {
|
|
72
|
+
locked: boolean;
|
|
73
|
+
byTask?: string;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Unlock a file for a task
|
|
77
|
+
*/
|
|
78
|
+
unlockFile(taskId: string, file: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Get all tasks
|
|
81
|
+
*/
|
|
82
|
+
getAllTasks(): TeamTask[];
|
|
83
|
+
/**
|
|
84
|
+
* Get pending task count
|
|
85
|
+
*/
|
|
86
|
+
getPendingCount(): number;
|
|
87
|
+
/**
|
|
88
|
+
* Get completed task count
|
|
89
|
+
*/
|
|
90
|
+
getCompletedCount(): number;
|
|
91
|
+
}
|
|
92
|
+
export declare class TeamMailbox {
|
|
93
|
+
private messages;
|
|
94
|
+
constructor();
|
|
95
|
+
/**
|
|
96
|
+
* Send a message to a specific agent
|
|
97
|
+
*/
|
|
98
|
+
send(from: string, to: string, content: string): MailboxMessage;
|
|
99
|
+
/**
|
|
100
|
+
* Broadcast a message to all agents
|
|
101
|
+
*/
|
|
102
|
+
broadcast(from: string, content: string): MailboxMessage;
|
|
103
|
+
/**
|
|
104
|
+
* Get messages for an agent (direct + broadcasts, excluding own)
|
|
105
|
+
*/
|
|
106
|
+
getMessages(agentName: string): MailboxMessage[];
|
|
107
|
+
/**
|
|
108
|
+
* Get unread messages for an agent
|
|
109
|
+
*/
|
|
110
|
+
getUnread(agentName: string): MailboxMessage[];
|
|
111
|
+
/**
|
|
112
|
+
* Mark a message as read
|
|
113
|
+
*/
|
|
114
|
+
markRead(messageId: string): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Mark all messages for an agent as read
|
|
117
|
+
*/
|
|
118
|
+
markAllRead(agentName: string): number;
|
|
119
|
+
/**
|
|
120
|
+
* Get total message count
|
|
121
|
+
*/
|
|
122
|
+
getMessageCount(): number;
|
|
123
|
+
}
|
|
124
|
+
export declare class TeamManagerV2 {
|
|
125
|
+
private config;
|
|
126
|
+
private taskList;
|
|
127
|
+
private mailbox;
|
|
128
|
+
constructor(config: TeamConfig);
|
|
129
|
+
getTaskList(): TeamTaskList;
|
|
130
|
+
getMailbox(): TeamMailbox;
|
|
131
|
+
getConfig(): TeamConfig;
|
|
132
|
+
/**
|
|
133
|
+
* Set teammate mode
|
|
134
|
+
*/
|
|
135
|
+
setMode(mode: TeammateMode): void;
|
|
136
|
+
getMode(): TeammateMode;
|
|
137
|
+
/**
|
|
138
|
+
* Set delegate mode (lead restricted to coordination only)
|
|
139
|
+
*/
|
|
140
|
+
setDelegateMode(enabled: boolean): void;
|
|
141
|
+
isDelegateMode(): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Add a teammate
|
|
144
|
+
*/
|
|
145
|
+
addTeammate(name: string): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Remove a teammate
|
|
148
|
+
*/
|
|
149
|
+
removeTeammate(name: string): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Get all teammates
|
|
152
|
+
*/
|
|
153
|
+
getTeammates(): string[];
|
|
154
|
+
/**
|
|
155
|
+
* Generate a tmux layout string (stub)
|
|
156
|
+
*/
|
|
157
|
+
generateTmuxLayout(): string;
|
|
158
|
+
/**
|
|
159
|
+
* Serialize config to JSON
|
|
160
|
+
*/
|
|
161
|
+
serializeConfig(): string;
|
|
162
|
+
/**
|
|
163
|
+
* Deserialize config from JSON
|
|
164
|
+
*/
|
|
165
|
+
static deserializeConfig(json: string): TeamConfig;
|
|
166
|
+
}
|