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.
Files changed (170) hide show
  1. package/HEARTBEAT.md +48 -32
  2. package/README.md +426 -157
  3. package/dist/package.json +5 -2
  4. package/dist/src/agent/bootstrap-loader.js +138 -0
  5. package/dist/src/agent/bootstrap-loader.js.map +1 -0
  6. package/dist/src/agent/context-pruning.js +279 -0
  7. package/dist/src/agent/context-pruning.js.map +1 -0
  8. package/dist/src/agent/dynamic-personality.js +211 -0
  9. package/dist/src/agent/dynamic-personality.js.map +1 -0
  10. package/dist/src/agent/embedded-runner.js +79 -0
  11. package/dist/src/agent/embedded-runner.js.map +1 -0
  12. package/dist/src/agent/index.js +16 -0
  13. package/dist/src/agent/index.js.map +1 -0
  14. package/dist/src/agent/system-prompt.js +84 -0
  15. package/dist/src/agent/system-prompt.js.map +1 -0
  16. package/dist/src/agent/task-router.js +194 -0
  17. package/dist/src/agent/task-router.js.map +1 -0
  18. package/dist/src/agent/tools/index.js +2 -0
  19. package/dist/src/agent/tools/index.js.map +1 -0
  20. package/dist/src/agent/tools/spawn-agent.js +200 -0
  21. package/dist/src/agent/tools/spawn-agent.js.map +1 -0
  22. package/dist/src/agent/types/definitions.js +317 -0
  23. package/dist/src/agent/types/definitions.js.map +1 -0
  24. package/dist/src/agent/types/index.js +2 -0
  25. package/dist/src/agent/types/index.js.map +1 -0
  26. package/dist/src/agent/user-profile.js +300 -0
  27. package/dist/src/agent/user-profile.js.map +1 -0
  28. package/dist/src/agents/task-router.js +194 -0
  29. package/dist/src/agents/task-router.js.map +1 -0
  30. package/dist/src/agents/tools/index.js +2 -0
  31. package/dist/src/agents/tools/index.js.map +1 -0
  32. package/dist/src/agents/tools/spawn-agent.js +200 -0
  33. package/dist/src/agents/tools/spawn-agent.js.map +1 -0
  34. package/dist/src/agents/types/definitions.js +317 -0
  35. package/dist/src/agents/types/definitions.js.map +1 -0
  36. package/dist/src/agents/types/index.js +2 -0
  37. package/dist/src/agents/types/index.js.map +1 -0
  38. package/dist/src/auth/device-auth.js +202 -0
  39. package/dist/src/auth/device-auth.js.map +1 -0
  40. package/dist/src/auth/index.js +3 -0
  41. package/dist/src/auth/index.js.map +1 -0
  42. package/dist/src/channels/index.js +8 -0
  43. package/dist/src/channels/index.js.map +1 -0
  44. package/dist/src/channels/slack/webhook.js +128 -0
  45. package/dist/src/channels/slack/webhook.js.map +1 -0
  46. package/dist/src/channels/telegram/bot.js +223 -0
  47. package/dist/src/channels/telegram/bot.js.map +1 -0
  48. package/dist/src/channels/whatsapp/integration.js +325 -0
  49. package/dist/src/channels/whatsapp/integration.js.map +1 -0
  50. package/dist/src/cli/commands/check.js +69 -0
  51. package/dist/src/cli/commands/check.js.map +1 -0
  52. package/dist/src/cli/commands/embedded.js +36 -0
  53. package/dist/src/cli/commands/embedded.js.map +1 -0
  54. package/dist/src/cli/commands/gateway.js +127 -166
  55. package/dist/src/cli/commands/gateway.js.map +1 -1
  56. package/dist/src/cli/commands/migrate.js +24 -0
  57. package/dist/src/cli/commands/migrate.js.map +1 -0
  58. package/dist/src/cli/commands/tailscale.js +81 -0
  59. package/dist/src/cli/commands/tailscale.js.map +1 -0
  60. package/dist/src/cli/commands/telegram.js +111 -0
  61. package/dist/src/cli/commands/telegram.js.map +1 -0
  62. package/dist/src/cli/commands/tui.js +40 -22
  63. package/dist/src/cli/commands/tui.js.map +1 -1
  64. package/dist/src/cli/commands/whatsapp.js +116 -0
  65. package/dist/src/cli/commands/whatsapp.js.map +1 -0
  66. package/dist/src/cli/program-fixed.js +1 -0
  67. package/dist/src/cli/program-fixed.js.map +1 -0
  68. package/dist/src/cli/program.js +30 -29
  69. package/dist/src/cli/program.js.map +1 -1
  70. package/dist/src/config/index.js +2 -9
  71. package/dist/src/config/index.js.map +1 -1
  72. package/dist/src/config/manager.js +222 -0
  73. package/dist/src/config/manager.js.map +1 -0
  74. package/dist/src/documents/index.js +3 -0
  75. package/dist/src/documents/index.js.map +1 -0
  76. package/dist/src/documents/pdf.js +168 -0
  77. package/dist/src/documents/pdf.js.map +1 -0
  78. package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
  79. package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
  80. package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
  81. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
  82. package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
  83. package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
  84. package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
  85. package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
  86. package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
  87. package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
  88. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
  89. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
  90. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
  91. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
  92. package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
  93. package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
  94. package/dist/src/extensions/core/mode-manager-extension.js +11 -0
  95. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
  96. package/dist/src/extensions/core/persona-loader-extension.js +61 -129
  97. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  98. package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
  99. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
  100. package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
  101. package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
  102. package/dist/src/gateway/client.js +318 -0
  103. package/dist/src/gateway/client.js.map +1 -0
  104. package/dist/src/gateway/discord-bot.js +185 -0
  105. package/dist/src/gateway/discord-bot.js.map +1 -0
  106. package/dist/src/gateway/index.js +10 -350
  107. package/dist/src/gateway/index.js.map +1 -1
  108. package/dist/src/gateway/server.js +325 -0
  109. package/dist/src/gateway/server.js.map +1 -0
  110. package/dist/src/gateway/websocket-server.js +142 -0
  111. package/dist/src/gateway/websocket-server.js.map +1 -0
  112. package/dist/src/heartbeat/checkin.js +185 -0
  113. package/dist/src/heartbeat/checkin.js.map +1 -0
  114. package/dist/src/heartbeat/index.js +5 -0
  115. package/dist/src/heartbeat/index.js.map +1 -0
  116. package/dist/src/heartbeat/notifications.js +216 -0
  117. package/dist/src/heartbeat/notifications.js.map +1 -0
  118. package/dist/src/heartbeat/scheduler.js +284 -0
  119. package/dist/src/heartbeat/scheduler.js.map +1 -0
  120. package/dist/src/index.js +21 -3
  121. package/dist/src/index.js.map +1 -1
  122. package/dist/src/infra/index.js +3 -0
  123. package/dist/src/infra/index.js.map +1 -0
  124. package/dist/src/infra/tailscale.js +163 -0
  125. package/dist/src/infra/tailscale.js.map +1 -0
  126. package/dist/src/media/audio.js +130 -0
  127. package/dist/src/media/audio.js.map +1 -0
  128. package/dist/src/media/index.js +4 -0
  129. package/dist/src/media/index.js.map +1 -0
  130. package/dist/src/media/vision.js +131 -0
  131. package/dist/src/media/vision.js.map +1 -0
  132. package/dist/src/migration/openclaw.js +498 -0
  133. package/dist/src/migration/openclaw.js.map +1 -0
  134. package/dist/src/mode/auto-detector.js +211 -0
  135. package/dist/src/mode/auto-detector.js.map +1 -0
  136. package/dist/src/mode/index.js +3 -0
  137. package/dist/src/mode/index.js.map +1 -0
  138. package/dist/src/mode/natural-switcher.js +123 -0
  139. package/dist/src/mode/natural-switcher.js.map +1 -0
  140. package/dist/src/sandbox/docker-runner.js +228 -0
  141. package/dist/src/sandbox/docker-runner.js.map +1 -0
  142. package/dist/src/sandbox/index.js +3 -0
  143. package/dist/src/sandbox/index.js.map +1 -0
  144. package/dist/src/skills/builtin/api-worker.js +88 -0
  145. package/dist/src/skills/builtin/api-worker.js.map +1 -0
  146. package/dist/src/skills/builtin/duplicate-detector.js +469 -0
  147. package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
  148. package/dist/src/skills/builtin/nextjs-worker.js +55 -0
  149. package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
  150. package/dist/src/skills/builtin/real-workers.js +166 -0
  151. package/dist/src/skills/builtin/real-workers.js.map +1 -0
  152. package/dist/src/skills/builtin/sql-worker.js +61 -0
  153. package/dist/src/skills/builtin/sql-worker.js.map +1 -0
  154. package/dist/src/skills/builtin/test-worker.js +79 -0
  155. package/dist/src/skills/builtin/test-worker.js.map +1 -0
  156. package/dist/src/skills/builtin/web-research.js +77 -0
  157. package/dist/src/skills/builtin/web-research.js.map +1 -0
  158. package/dist/src/skills/framework.js +250 -0
  159. package/dist/src/skills/framework.js.map +1 -0
  160. package/dist/src/skills/index.js +12 -10
  161. package/dist/src/skills/index.js.map +1 -1
  162. package/dist/src/streaming/block-streamer.js +172 -0
  163. package/dist/src/streaming/block-streamer.js.map +1 -0
  164. package/dist/src/streaming/index.js +2 -0
  165. package/dist/src/streaming/index.js.map +1 -0
  166. package/dist/src/workspace/index.js +2 -0
  167. package/dist/src/workspace/index.js.map +1 -0
  168. package/dist/src/workspace/manager.js +181 -0
  169. package/dist/src/workspace/manager.js.map +1 -0
  170. 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,3 @@
1
+ // Sandbox Module - v0.3.0
2
+ export { DockerRunner, getDockerRunner, resetDockerRunner, DEFAULT_CONFIG, } from "./docker-runner.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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"}