0xkobold 0.1.0 → 0.3.0
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/HEARTBEAT.md +48 -32
- package/README.md +426 -157
- package/dist/package.json +5 -2
- package/dist/src/agent/bootstrap-loader.js +138 -0
- package/dist/src/agent/bootstrap-loader.js.map +1 -0
- package/dist/src/agent/context-pruning.js +279 -0
- package/dist/src/agent/context-pruning.js.map +1 -0
- package/dist/src/agent/dynamic-personality.js +211 -0
- package/dist/src/agent/dynamic-personality.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +79 -0
- package/dist/src/agent/embedded-runner.js.map +1 -0
- package/dist/src/agent/index.js +16 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/system-prompt.js +84 -0
- package/dist/src/agent/system-prompt.js.map +1 -0
- package/dist/src/agent/task-router.js +194 -0
- package/dist/src/agent/task-router.js.map +1 -0
- package/dist/src/agent/tools/index.js +2 -0
- package/dist/src/agent/tools/index.js.map +1 -0
- package/dist/src/agent/tools/spawn-agent.js +200 -0
- package/dist/src/agent/tools/spawn-agent.js.map +1 -0
- package/dist/src/agent/types/definitions.js +317 -0
- package/dist/src/agent/types/definitions.js.map +1 -0
- package/dist/src/agent/types/index.js +2 -0
- package/dist/src/agent/types/index.js.map +1 -0
- package/dist/src/agent/user-profile.js +300 -0
- package/dist/src/agent/user-profile.js.map +1 -0
- package/dist/src/agents/task-router.js +194 -0
- package/dist/src/agents/task-router.js.map +1 -0
- package/dist/src/agents/tools/index.js +2 -0
- package/dist/src/agents/tools/index.js.map +1 -0
- package/dist/src/agents/tools/spawn-agent.js +200 -0
- package/dist/src/agents/tools/spawn-agent.js.map +1 -0
- package/dist/src/agents/types/definitions.js +317 -0
- package/dist/src/agents/types/definitions.js.map +1 -0
- package/dist/src/agents/types/index.js +2 -0
- package/dist/src/agents/types/index.js.map +1 -0
- package/dist/src/auth/device-auth.js +202 -0
- package/dist/src/auth/device-auth.js.map +1 -0
- package/dist/src/auth/index.js +3 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/channels/index.js +8 -0
- package/dist/src/channels/index.js.map +1 -0
- package/dist/src/channels/slack/webhook.js +128 -0
- package/dist/src/channels/slack/webhook.js.map +1 -0
- package/dist/src/channels/telegram/bot.js +223 -0
- package/dist/src/channels/telegram/bot.js.map +1 -0
- package/dist/src/channels/whatsapp/integration.js +325 -0
- package/dist/src/channels/whatsapp/integration.js.map +1 -0
- package/dist/src/cli/commands/check.js +69 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/embedded.js +36 -0
- package/dist/src/cli/commands/embedded.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +127 -166
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/migrate.js +24 -0
- package/dist/src/cli/commands/migrate.js.map +1 -0
- package/dist/src/cli/commands/tailscale.js +81 -0
- package/dist/src/cli/commands/tailscale.js.map +1 -0
- package/dist/src/cli/commands/telegram.js +111 -0
- package/dist/src/cli/commands/telegram.js.map +1 -0
- package/dist/src/cli/commands/tui.js +40 -22
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/commands/whatsapp.js +116 -0
- package/dist/src/cli/commands/whatsapp.js.map +1 -0
- package/dist/src/cli/program-fixed.js +1 -0
- package/dist/src/cli/program-fixed.js.map +1 -0
- package/dist/src/cli/program.js +30 -29
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/index.js +2 -9
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/manager.js +222 -0
- package/dist/src/config/manager.js.map +1 -0
- package/dist/src/documents/index.js +3 -0
- package/dist/src/documents/index.js.map +1 -0
- package/dist/src/documents/pdf.js +168 -0
- package/dist/src/documents/pdf.js.map +1 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
- package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +11 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +61 -129
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
- package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
- package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
- package/dist/src/gateway/client.js +318 -0
- package/dist/src/gateway/client.js.map +1 -0
- package/dist/src/gateway/discord-bot.js +185 -0
- package/dist/src/gateway/discord-bot.js.map +1 -0
- package/dist/src/gateway/index.js +10 -350
- package/dist/src/gateway/index.js.map +1 -1
- package/dist/src/gateway/server.js +325 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/websocket-server.js +142 -0
- package/dist/src/gateway/websocket-server.js.map +1 -0
- package/dist/src/heartbeat/checkin.js +185 -0
- package/dist/src/heartbeat/checkin.js.map +1 -0
- package/dist/src/heartbeat/index.js +5 -0
- package/dist/src/heartbeat/index.js.map +1 -0
- package/dist/src/heartbeat/notifications.js +216 -0
- package/dist/src/heartbeat/notifications.js.map +1 -0
- package/dist/src/heartbeat/scheduler.js +284 -0
- package/dist/src/heartbeat/scheduler.js.map +1 -0
- package/dist/src/index.js +21 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/infra/index.js +3 -0
- package/dist/src/infra/index.js.map +1 -0
- package/dist/src/infra/tailscale.js +163 -0
- package/dist/src/infra/tailscale.js.map +1 -0
- package/dist/src/media/audio.js +130 -0
- package/dist/src/media/audio.js.map +1 -0
- package/dist/src/media/index.js +4 -0
- package/dist/src/media/index.js.map +1 -0
- package/dist/src/media/vision.js +131 -0
- package/dist/src/media/vision.js.map +1 -0
- package/dist/src/migration/openclaw.js +498 -0
- package/dist/src/migration/openclaw.js.map +1 -0
- package/dist/src/mode/auto-detector.js +211 -0
- package/dist/src/mode/auto-detector.js.map +1 -0
- package/dist/src/mode/index.js +3 -0
- package/dist/src/mode/index.js.map +1 -0
- package/dist/src/mode/natural-switcher.js +123 -0
- package/dist/src/mode/natural-switcher.js.map +1 -0
- package/dist/src/sandbox/docker-runner.js +228 -0
- package/dist/src/sandbox/docker-runner.js.map +1 -0
- package/dist/src/sandbox/index.js +3 -0
- package/dist/src/sandbox/index.js.map +1 -0
- package/dist/src/skills/builtin/api-worker.js +88 -0
- package/dist/src/skills/builtin/api-worker.js.map +1 -0
- package/dist/src/skills/builtin/duplicate-detector.js +469 -0
- package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
- package/dist/src/skills/builtin/nextjs-worker.js +55 -0
- package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
- package/dist/src/skills/builtin/real-workers.js +166 -0
- package/dist/src/skills/builtin/real-workers.js.map +1 -0
- package/dist/src/skills/builtin/sql-worker.js +61 -0
- package/dist/src/skills/builtin/sql-worker.js.map +1 -0
- package/dist/src/skills/builtin/test-worker.js +79 -0
- package/dist/src/skills/builtin/test-worker.js.map +1 -0
- package/dist/src/skills/builtin/web-research.js +77 -0
- package/dist/src/skills/builtin/web-research.js.map +1 -0
- package/dist/src/skills/framework.js +250 -0
- package/dist/src/skills/framework.js.map +1 -0
- package/dist/src/skills/index.js +12 -10
- package/dist/src/skills/index.js.map +1 -1
- package/dist/src/streaming/block-streamer.js +172 -0
- package/dist/src/streaming/block-streamer.js.map +1 -0
- package/dist/src/streaming/index.js +2 -0
- package/dist/src/streaming/index.js.map +1 -0
- package/dist/src/workspace/index.js +2 -0
- package/dist/src/workspace/index.js.map +1 -0
- package/dist/src/workspace/manager.js +181 -0
- package/dist/src/workspace/manager.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Auto-Detector - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* Detect when mode switching is needed based on context.
|
|
5
|
+
* Part of Phase 2.3: Mode System Enhancement
|
|
6
|
+
*/
|
|
7
|
+
// Plan mode indicators (keywords that suggest planning)
|
|
8
|
+
const PLAN_INDICATORS = [
|
|
9
|
+
/\b(how should|how to|how do|what's the best way|what would be best)\b/i,
|
|
10
|
+
/\b(design|architecture|plan|approach|strategy|structure)\b/i,
|
|
11
|
+
/\b(should we|would it be better|could we|consider)\b/i,
|
|
12
|
+
/\b(thinking about|considering|evaluating|assessing)\b/i,
|
|
13
|
+
/\b(pros and cons|tradeoffs|options|alternatives)\b/i,
|
|
14
|
+
/\b(documentation|docs|explain how|understand)\b/i,
|
|
15
|
+
/\b(investigate|explore|research|learn about)\b/i,
|
|
16
|
+
/\b(before we start|first|initially)\b/i,
|
|
17
|
+
];
|
|
18
|
+
// Build mode indicators (keywords that suggest building)
|
|
19
|
+
const BUILD_INDICATORS = [
|
|
20
|
+
/\b(implement|create|build|make|add|write)\b/i,
|
|
21
|
+
/\b(fix|bug|issue|error|problem|broken)\b/i,
|
|
22
|
+
/\b(update|change|modify|edit|refactor)\b/i,
|
|
23
|
+
/\b(generate|produce|output|deploy|publish)\b/i,
|
|
24
|
+
/\b(quick|fast|now|immediately|asap|urgent)\b/i,
|
|
25
|
+
/\b(code|function|class|component|module)\b/i,
|
|
26
|
+
/\b(test|unit test|spec|expect)\b/i,
|
|
27
|
+
/\b(commit|push|pr|merge|deploy)\b/i,
|
|
28
|
+
];
|
|
29
|
+
// Complexity indicators
|
|
30
|
+
const COMPLEXITY_INDICATORS = [
|
|
31
|
+
/\b(complex|complicated|difficult|challenging|large|big|many|multiple)\b/i,
|
|
32
|
+
/\b(system|platform|framework|library|api)\b/i,
|
|
33
|
+
/\b(migration|refactor|rewrite|redesign|restructure)\b/i,
|
|
34
|
+
/\b(integrate|connect|interface with)\b/i,
|
|
35
|
+
/\b(scale|performance|optimization|architecture)\b/i,
|
|
36
|
+
];
|
|
37
|
+
// Urgency indicators
|
|
38
|
+
const URGENCY_INDICATORS = [
|
|
39
|
+
/\b(urgent|asap|now|quickly|fast|immediately|blocking)\b/i,
|
|
40
|
+
/\b(broken|failing|crash|error|bug|issue)\b/i,
|
|
41
|
+
/\b(hotfix|fix asap|critical|emergency)\b/i,
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Analyze context features from prompt
|
|
45
|
+
*/
|
|
46
|
+
export function analyzeContext(prompt) {
|
|
47
|
+
const text = prompt.toLowerCase();
|
|
48
|
+
return {
|
|
49
|
+
appearsComplex: COMPLEXITY_INDICATORS.some((r) => r.test(text)),
|
|
50
|
+
mentionsArchitecture: /\b(architecture|design pattern|structur)/i.test(text),
|
|
51
|
+
mentionsDesign: /\b(design|layout|ui|ux|interface)/i.test(text),
|
|
52
|
+
asksQuestions: text.includes('?') ||
|
|
53
|
+
/\b(how|what|why|when|where|should|could|would)\b/i.test(text),
|
|
54
|
+
seemsUrgent: URGENCY_INDICATORS.some((r) => r.test(text)),
|
|
55
|
+
needsResearch: /\b(research|investigate|explore|find out|look up|search)/i.test(text),
|
|
56
|
+
mentionsImplementation: /\b(implement|build|create|write|code|develop)/i.test(text),
|
|
57
|
+
mentionsBugFix: /\b(fix|bug|issue|error|broken|crash|debug)/i.test(text),
|
|
58
|
+
mentionsFiles: /\b(file|path|directory|folder|\.\w+$)/i.test(text) ||
|
|
59
|
+
/\b(\w+\.\w{2,4})\b/.test(text),
|
|
60
|
+
asksForCode: /\b(write|create|implement|code|function|class)\b/i.test(text),
|
|
61
|
+
mentionsRefactor: /\b(refactor|rewrite|restructure|redesign|clean up)/i.test(text),
|
|
62
|
+
mentionsOptimize: /\b(optimize|improve|performance|fast|speed|efficient)/i.test(text),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Detect recommended mode from prompt
|
|
67
|
+
*/
|
|
68
|
+
export function detectModeFromPrompt(prompt, currentMode = 'plan') {
|
|
69
|
+
const text = prompt.toLowerCase();
|
|
70
|
+
const features = analyzeContext(prompt);
|
|
71
|
+
// Calculate scores
|
|
72
|
+
let planScore = 0;
|
|
73
|
+
let buildScore = 0;
|
|
74
|
+
// Check indicators
|
|
75
|
+
for (const pattern of PLAN_INDICATORS) {
|
|
76
|
+
if (pattern.test(text))
|
|
77
|
+
planScore += 1;
|
|
78
|
+
}
|
|
79
|
+
for (const pattern of BUILD_INDICATORS) {
|
|
80
|
+
if (pattern.test(text))
|
|
81
|
+
buildScore += 1;
|
|
82
|
+
}
|
|
83
|
+
// Feature adjustments
|
|
84
|
+
if (features.appearsComplex)
|
|
85
|
+
planScore += 0.5;
|
|
86
|
+
if (features.mentionsArchitecture)
|
|
87
|
+
planScore += 2;
|
|
88
|
+
if (features.mentionsDesign)
|
|
89
|
+
planScore += 1.5;
|
|
90
|
+
if (features.asksQuestions)
|
|
91
|
+
planScore += 1;
|
|
92
|
+
if (features.needsResearch)
|
|
93
|
+
planScore += 2;
|
|
94
|
+
if (features.mentionsBugFix)
|
|
95
|
+
buildScore += 3;
|
|
96
|
+
if (features.mentionsImplementation)
|
|
97
|
+
buildScore += 2;
|
|
98
|
+
if (features.asksForCode)
|
|
99
|
+
buildScore += 2;
|
|
100
|
+
if (features.mentionsRefactor)
|
|
101
|
+
buildScore += 1.5;
|
|
102
|
+
if (features.mentionsOptimize)
|
|
103
|
+
buildScore += 1;
|
|
104
|
+
if (features.seemsUrgent)
|
|
105
|
+
buildScore += 2;
|
|
106
|
+
if (features.mentionsFiles)
|
|
107
|
+
buildScore += 1;
|
|
108
|
+
// Determine recommendation
|
|
109
|
+
let recommendedMode;
|
|
110
|
+
let confidence;
|
|
111
|
+
let reasoning;
|
|
112
|
+
const totalScore = planScore + buildScore;
|
|
113
|
+
if (totalScore === 0) {
|
|
114
|
+
// No strong indicators, stay in current mode
|
|
115
|
+
recommendedMode = currentMode;
|
|
116
|
+
confidence = 30;
|
|
117
|
+
reasoning = 'No clear mode indicators detected. Staying in current mode.';
|
|
118
|
+
}
|
|
119
|
+
else if (planScore > buildScore * 1.5) {
|
|
120
|
+
recommendedMode = 'plan';
|
|
121
|
+
confidence = Math.min(95, 50 + planScore * 15);
|
|
122
|
+
reasoning = `Planning indicators detected (${planScore.toFixed(1)} vs ${buildScore.toFixed(1)}): questions, design consideration, or research needed`;
|
|
123
|
+
}
|
|
124
|
+
else if (buildScore > planScore * 1.5) {
|
|
125
|
+
recommendedMode = 'build';
|
|
126
|
+
confidence = Math.min(95, 50 + buildScore * 15);
|
|
127
|
+
reasoning = `Build indicators detected (${buildScore.toFixed(1)} vs ${planScore.toFixed(1)}): implementation, fixes, or urgent action needed`;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Mixed signals
|
|
131
|
+
recommendedMode = currentMode;
|
|
132
|
+
confidence = 50;
|
|
133
|
+
reasoning = `Mixed signals. Plan score: ${planScore.toFixed(1)}, Build score: ${buildScore.toFixed(1)}. Staying in current mode.`;
|
|
134
|
+
}
|
|
135
|
+
// Override for complex tasks
|
|
136
|
+
if (features.appearsComplex && recommendedMode === 'build' && confidence < 80) {
|
|
137
|
+
reasoning += ' However, this appears complex - consider planning first.';
|
|
138
|
+
}
|
|
139
|
+
// Generate suggestions
|
|
140
|
+
const suggestions = generateSuggestions(features, recommendedMode);
|
|
141
|
+
return {
|
|
142
|
+
recommendedMode,
|
|
143
|
+
confidence,
|
|
144
|
+
reasoning,
|
|
145
|
+
features,
|
|
146
|
+
suggestions,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate suggestions based on features
|
|
151
|
+
*/
|
|
152
|
+
function generateSuggestions(features, mode) {
|
|
153
|
+
const suggestions = [];
|
|
154
|
+
if (mode === 'build') {
|
|
155
|
+
if (features.appearsComplex) {
|
|
156
|
+
suggestions.push('This appears complex. Consider planning before building.');
|
|
157
|
+
}
|
|
158
|
+
if (features.needsResearch) {
|
|
159
|
+
suggestions.push('Some research may help before implementation.');
|
|
160
|
+
}
|
|
161
|
+
if (!features.mentionsFiles) {
|
|
162
|
+
suggestions.push('Consider which files need to be modified.');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
if (features.seemsUrgent) {
|
|
167
|
+
suggestions.push('Note: This seems urgent but is in plan mode.');
|
|
168
|
+
}
|
|
169
|
+
if (features.mentionsBugFix) {
|
|
170
|
+
suggestions.push('Consider if this needs immediate fixing (build mode).');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (features.mentionsRefactor) {
|
|
174
|
+
suggestions.push('Refactoring often benefits from careful planning.');
|
|
175
|
+
}
|
|
176
|
+
return suggestions;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Quick mode detection
|
|
180
|
+
*/
|
|
181
|
+
export function quickDetectMode(prompt) {
|
|
182
|
+
const result = detectModeFromPrompt(prompt);
|
|
183
|
+
return result.recommendedMode;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Should suggest mode switch (medium confidence)
|
|
187
|
+
*/
|
|
188
|
+
export function shouldSuggestSwitch(result) {
|
|
189
|
+
return result.confidence >= 50 && result.confidence < 80;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Should auto-switch mode (high confidence)
|
|
193
|
+
*/
|
|
194
|
+
export function shouldAutoSwitch(result) {
|
|
195
|
+
return result.confidence >= 80;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get mode recommendation text
|
|
199
|
+
*/
|
|
200
|
+
export function getModeRecommendationText(result) {
|
|
201
|
+
if (result.confidence >= 80) {
|
|
202
|
+
return `Auto-switching to ${result.recommendedMode.toUpperCase()} mode: ${result.reasoning}`;
|
|
203
|
+
}
|
|
204
|
+
else if (result.confidence >= 50) {
|
|
205
|
+
return `Suggestion: Switch to ${result.recommendedMode.toUpperCase()} mode? ${result.reasoning}`;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
return `Staying in current mode. ${result.reasoning}`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=auto-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-detector.js","sourceRoot":"","sources":["../../../src/mode/auto-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { detectModeFromPrompt, analyzeContext, quickDetectMode, shouldSuggestSwitch, shouldAutoSwitch, getModeRecommendationText } from './auto-detector.js';
|
|
2
|
+
export { getModeSwitcher, switchMode, setAutonomousMode, getCurrentModeInfo } from './natural-switcher.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,yBAAyB,EAAiE,MAAM,oBAAoB,CAAC;AAC5N,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAA6C,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Natural Switcher - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* Seamless automatic mode switching without explicit commands.
|
|
5
|
+
* Part of Phase 2.3: Mode System Enhancement
|
|
6
|
+
*/
|
|
7
|
+
import { detectModeFromPrompt, shouldAutoSwitch, shouldSuggestSwitch, getModeRecommendationText, } from './auto-detector.js';
|
|
8
|
+
class NaturalModeSwitcherImpl {
|
|
9
|
+
_currentMode = 'plan';
|
|
10
|
+
_autonomous = false;
|
|
11
|
+
_pendingSuggestion = null;
|
|
12
|
+
_lastDetection = null;
|
|
13
|
+
get currentMode() {
|
|
14
|
+
return this._currentMode;
|
|
15
|
+
}
|
|
16
|
+
get autonomous() {
|
|
17
|
+
return this._autonomous;
|
|
18
|
+
}
|
|
19
|
+
getCurrentMode() {
|
|
20
|
+
return this._currentMode;
|
|
21
|
+
}
|
|
22
|
+
setMode(mode, reason) {
|
|
23
|
+
if (mode === this._currentMode)
|
|
24
|
+
return;
|
|
25
|
+
const oldMode = this._currentMode;
|
|
26
|
+
this._currentMode = mode;
|
|
27
|
+
this._pendingSuggestion = null; // Clear any pending suggestion
|
|
28
|
+
console.log(`[Mode] Switched from ${oldMode.toUpperCase()} to ${mode.toUpperCase()}: ${reason || 'Manual switch'}`);
|
|
29
|
+
}
|
|
30
|
+
setAutonomous(enabled) {
|
|
31
|
+
this._autonomous = enabled;
|
|
32
|
+
console.log(`[Mode] Autonomous mode ${enabled ? 'enabled' : 'disabled'}`);
|
|
33
|
+
}
|
|
34
|
+
processPrompt(prompt) {
|
|
35
|
+
this._lastDetection = detectModeFromPrompt(prompt, this._currentMode);
|
|
36
|
+
// Same mode - no switch needed
|
|
37
|
+
if (this._lastDetection.recommendedMode === this._currentMode) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Check if we should auto-switch (high confidence + autonomous)
|
|
41
|
+
if (this._autonomous && shouldAutoSwitch(this._lastDetection)) {
|
|
42
|
+
const switch_ = {
|
|
43
|
+
from: this._currentMode,
|
|
44
|
+
to: this._lastDetection.recommendedMode,
|
|
45
|
+
reason: this._lastDetection.reasoning,
|
|
46
|
+
auto: true,
|
|
47
|
+
};
|
|
48
|
+
this.setMode(switch_.to, switch_.reason);
|
|
49
|
+
return switch_;
|
|
50
|
+
}
|
|
51
|
+
// Check if we should suggest (medium confidence)
|
|
52
|
+
if (shouldSuggestSwitch(this._lastDetection)) {
|
|
53
|
+
const switch_ = {
|
|
54
|
+
from: this._currentMode,
|
|
55
|
+
to: this._lastDetection.recommendedMode,
|
|
56
|
+
reason: this._lastDetection.reasoning,
|
|
57
|
+
auto: false,
|
|
58
|
+
};
|
|
59
|
+
this._pendingSuggestion = switch_;
|
|
60
|
+
console.log(`[Mode] Suggestion: ${getModeRecommendationText(this._lastDetection)}`);
|
|
61
|
+
return switch_;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
acceptSuggestion() {
|
|
66
|
+
if (this._pendingSuggestion) {
|
|
67
|
+
this.setMode(this._pendingSuggestion.to, this._pendingSuggestion.reason);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
rejectSuggestion() {
|
|
71
|
+
if (this._pendingSuggestion) {
|
|
72
|
+
console.log(`[Mode] Suggestion rejected. Staying in ${this._currentMode.toUpperCase()} mode.`);
|
|
73
|
+
this._pendingSuggestion = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getPendingSuggestion() {
|
|
77
|
+
return this._pendingSuggestion;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Singleton instance
|
|
81
|
+
let switcherInstance = null;
|
|
82
|
+
/**
|
|
83
|
+
* Get or create mode switcher
|
|
84
|
+
*/
|
|
85
|
+
export function getModeSwitcher() {
|
|
86
|
+
if (!switcherInstance) {
|
|
87
|
+
switcherInstance = new NaturalModeSwitcherImpl();
|
|
88
|
+
}
|
|
89
|
+
return switcherInstance;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Reset mode switcher
|
|
93
|
+
*/
|
|
94
|
+
export function resetModeSwitcher() {
|
|
95
|
+
switcherInstance = null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Quick mode switch
|
|
99
|
+
*/
|
|
100
|
+
export function switchMode(mode, reason) {
|
|
101
|
+
const switcher = getModeSwitcher();
|
|
102
|
+
switcher.setMode(mode, reason);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Enable/disable autonomous mode
|
|
106
|
+
*/
|
|
107
|
+
export function setAutonomousMode(enabled) {
|
|
108
|
+
const switcher = getModeSwitcher();
|
|
109
|
+
switcher.setAutonomous(enabled);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get current mode info
|
|
113
|
+
*/
|
|
114
|
+
export function getCurrentModeInfo() {
|
|
115
|
+
const switcher = getModeSwitcher();
|
|
116
|
+
return {
|
|
117
|
+
mode: switcher.currentMode,
|
|
118
|
+
autonomous: switcher.autonomous,
|
|
119
|
+
pendingSuggestion: switcher.getPendingSuggestion(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export default getModeSwitcher;
|
|
123
|
+
//# sourceMappingURL=natural-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"natural-switcher.js","sourceRoot":"","sources":["../../../src/mode/natural-switcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Sandbox Runner - v0.3.0
|
|
3
|
+
*
|
|
4
|
+
* Containerized execution for security isolation.
|
|
5
|
+
* Docker sandboxing for tools and agent execution.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
image: "node:20-slim",
|
|
10
|
+
memoryLimit: "512m",
|
|
11
|
+
cpuLimit: "1.0",
|
|
12
|
+
timeout: 30000,
|
|
13
|
+
volumes: [],
|
|
14
|
+
network: "none",
|
|
15
|
+
user: "node",
|
|
16
|
+
workingDir: "/workspace",
|
|
17
|
+
};
|
|
18
|
+
class DockerRunner {
|
|
19
|
+
config;
|
|
20
|
+
available = null;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if Docker is available
|
|
26
|
+
*/
|
|
27
|
+
async isAvailable() {
|
|
28
|
+
if (this.available !== null)
|
|
29
|
+
return this.available;
|
|
30
|
+
try {
|
|
31
|
+
const result = await this.execCommand("docker", ["version"]);
|
|
32
|
+
this.available = result.success;
|
|
33
|
+
return this.available;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
this.available = false;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run command in Docker container
|
|
42
|
+
*/
|
|
43
|
+
async run(options) {
|
|
44
|
+
if (!(await this.isAvailable())) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
stdout: "",
|
|
48
|
+
stderr: "Docker not available. Install Docker or check permissions.",
|
|
49
|
+
exitCode: -1,
|
|
50
|
+
duration: 0,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
const timeout = options.timeout || this.config.timeout;
|
|
55
|
+
// Build docker run arguments
|
|
56
|
+
const args = [
|
|
57
|
+
"run",
|
|
58
|
+
"--rm",
|
|
59
|
+
"--memory", this.config.memoryLimit,
|
|
60
|
+
"--cpus", this.config.cpuLimit,
|
|
61
|
+
"--network", this.config.network,
|
|
62
|
+
"--user", this.config.user,
|
|
63
|
+
"--workdir", this.config.workingDir,
|
|
64
|
+
"-i", // Interactive for stdin
|
|
65
|
+
];
|
|
66
|
+
// Add timeout
|
|
67
|
+
if (timeout > 0) {
|
|
68
|
+
args.push("--stop-timeout", String(Math.floor(timeout / 1000)));
|
|
69
|
+
}
|
|
70
|
+
// Add volumes
|
|
71
|
+
for (const vol of this.config.volumes) {
|
|
72
|
+
const ro = vol.readonly ? ":ro" : "";
|
|
73
|
+
args.push("-v", `${vol.host}:${vol.container}${ro}`);
|
|
74
|
+
}
|
|
75
|
+
// Add environment variables
|
|
76
|
+
if (options.env) {
|
|
77
|
+
for (const [key, value] of Object.entries(options.env)) {
|
|
78
|
+
args.push("-e", `${key}=${value}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Add image
|
|
82
|
+
args.push(this.config.image);
|
|
83
|
+
// Add command
|
|
84
|
+
args.push(options.command);
|
|
85
|
+
if (options.args) {
|
|
86
|
+
args.push(...options.args);
|
|
87
|
+
}
|
|
88
|
+
return new Promise((resolve) => {
|
|
89
|
+
const child = spawn("docker", args, {
|
|
90
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
91
|
+
});
|
|
92
|
+
let stdout = "";
|
|
93
|
+
let stderr = "";
|
|
94
|
+
let killed = false;
|
|
95
|
+
// Collect stdout
|
|
96
|
+
child.stdout?.on("data", (data) => {
|
|
97
|
+
stdout += data.toString();
|
|
98
|
+
});
|
|
99
|
+
// Collect stderr
|
|
100
|
+
child.stderr?.on("data", (data) => {
|
|
101
|
+
stderr += data.toString();
|
|
102
|
+
});
|
|
103
|
+
// Send stdin if provided
|
|
104
|
+
if (options.stdin) {
|
|
105
|
+
child.stdin?.write(options.stdin);
|
|
106
|
+
child.stdin?.end();
|
|
107
|
+
}
|
|
108
|
+
// Timeout handling
|
|
109
|
+
const timeoutId = setTimeout(() => {
|
|
110
|
+
killed = true;
|
|
111
|
+
child.kill("SIGKILL");
|
|
112
|
+
}, timeout);
|
|
113
|
+
// Process completion
|
|
114
|
+
child.on("exit", (code) => {
|
|
115
|
+
clearTimeout(timeoutId);
|
|
116
|
+
const duration = Date.now() - startTime;
|
|
117
|
+
resolve({
|
|
118
|
+
success: code === 0 && !killed,
|
|
119
|
+
stdout,
|
|
120
|
+
stderr,
|
|
121
|
+
exitCode: code ?? -1,
|
|
122
|
+
duration,
|
|
123
|
+
killed,
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
child.on("error", (err) => {
|
|
127
|
+
clearTimeout(timeoutId);
|
|
128
|
+
resolve({
|
|
129
|
+
success: false,
|
|
130
|
+
stdout,
|
|
131
|
+
stderr: err.message,
|
|
132
|
+
exitCode: -1,
|
|
133
|
+
duration: Date.now() - startTime,
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Create workspace volume
|
|
140
|
+
*/
|
|
141
|
+
async createWorkspace(workspacePath) {
|
|
142
|
+
const containerPath = `/workspace-${Date.now()}`;
|
|
143
|
+
this.config.volumes.push({
|
|
144
|
+
host: workspacePath,
|
|
145
|
+
container: containerPath,
|
|
146
|
+
readonly: false,
|
|
147
|
+
});
|
|
148
|
+
return containerPath;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Pull image if not present
|
|
152
|
+
*/
|
|
153
|
+
async pullImage() {
|
|
154
|
+
try {
|
|
155
|
+
const result = await this.execCommand("docker", [
|
|
156
|
+
"pull",
|
|
157
|
+
this.config.image,
|
|
158
|
+
]);
|
|
159
|
+
return result.success;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get container logs
|
|
167
|
+
*/
|
|
168
|
+
async getLogs(containerId) {
|
|
169
|
+
const result = await this.execCommand("docker", ["logs", containerId]);
|
|
170
|
+
return result.success ? result.stdout : "";
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* List running containers
|
|
174
|
+
*/
|
|
175
|
+
async listContainers() {
|
|
176
|
+
const result = await this.execCommand("docker", [
|
|
177
|
+
"ps",
|
|
178
|
+
"--format",
|
|
179
|
+
"{{.ID}}",
|
|
180
|
+
]);
|
|
181
|
+
return result.success ? result.stdout.trim().split("\n").filter(Boolean) : [];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Stop container
|
|
185
|
+
*/
|
|
186
|
+
async stopContainer(containerId) {
|
|
187
|
+
const result = await this.execCommand("docker", ["stop", containerId]);
|
|
188
|
+
return result.success;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Execute command helper
|
|
192
|
+
*/
|
|
193
|
+
execCommand(cmd, args) {
|
|
194
|
+
return new Promise((resolve) => {
|
|
195
|
+
const child = spawn(cmd, args, {
|
|
196
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
197
|
+
});
|
|
198
|
+
let stdout = "";
|
|
199
|
+
let stderr = "";
|
|
200
|
+
child.stdout?.on("data", (data) => {
|
|
201
|
+
stdout += data.toString();
|
|
202
|
+
});
|
|
203
|
+
child.stderr?.on("data", (data) => {
|
|
204
|
+
stderr += data.toString();
|
|
205
|
+
});
|
|
206
|
+
child.on("exit", (code) => {
|
|
207
|
+
resolve({ success: code === 0, stdout, stderr });
|
|
208
|
+
});
|
|
209
|
+
child.on("error", () => {
|
|
210
|
+
resolve({ success: false, stdout, stderr });
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Singleton
|
|
216
|
+
let runner = null;
|
|
217
|
+
export function getDockerRunner(config) {
|
|
218
|
+
if (!runner) {
|
|
219
|
+
runner = new DockerRunner(config);
|
|
220
|
+
}
|
|
221
|
+
return runner;
|
|
222
|
+
}
|
|
223
|
+
export function resetDockerRunner() {
|
|
224
|
+
runner = null;
|
|
225
|
+
}
|
|
226
|
+
export { DockerRunner, DEFAULT_CONFIG };
|
|
227
|
+
export default DockerRunner;
|
|
228
|
+
//# sourceMappingURL=docker-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-runner.js","sourceRoot":"","sources":["../../../src/sandbox/docker-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,GAIf,MAAM,oBAAoB,CAAC"}
|