0xkobold 0.0.1

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 (258) hide show
  1. package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
  2. package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
  3. package/HEARTBEAT.md +45 -0
  4. package/README.md +197 -0
  5. package/USAGE.md +191 -0
  6. package/dist/package.json +77 -0
  7. package/dist/src/agent/pi-adapter.js +307 -0
  8. package/dist/src/agent/pi-adapter.js.map +1 -0
  9. package/dist/src/agent/tool-adapter.js +86 -0
  10. package/dist/src/agent/tool-adapter.js.map +1 -0
  11. package/dist/src/approval/queue.js +114 -0
  12. package/dist/src/approval/queue.js.map +1 -0
  13. package/dist/src/ascii-kobold.js +76 -0
  14. package/dist/src/ascii-kobold.js.map +1 -0
  15. package/dist/src/cli/client.js +217 -0
  16. package/dist/src/cli/client.js.map +1 -0
  17. package/dist/src/cli/commands/agent.js +272 -0
  18. package/dist/src/cli/commands/agent.js.map +1 -0
  19. package/dist/src/cli/commands/chat.js +234 -0
  20. package/dist/src/cli/commands/chat.js.map +1 -0
  21. package/dist/src/cli/commands/config.js +202 -0
  22. package/dist/src/cli/commands/config.js.map +1 -0
  23. package/dist/src/cli/commands/daemon.js +203 -0
  24. package/dist/src/cli/commands/daemon.js.map +1 -0
  25. package/dist/src/cli/commands/gateway.js +184 -0
  26. package/dist/src/cli/commands/gateway.js.map +1 -0
  27. package/dist/src/cli/commands/init.js +175 -0
  28. package/dist/src/cli/commands/init.js.map +1 -0
  29. package/dist/src/cli/commands/kobold.js +21 -0
  30. package/dist/src/cli/commands/kobold.js.map +1 -0
  31. package/dist/src/cli/commands/logs.js +27 -0
  32. package/dist/src/cli/commands/logs.js.map +1 -0
  33. package/dist/src/cli/commands/mode.js +121 -0
  34. package/dist/src/cli/commands/mode.js.map +1 -0
  35. package/dist/src/cli/commands/persona.js +261 -0
  36. package/dist/src/cli/commands/persona.js.map +1 -0
  37. package/dist/src/cli/commands/start.js +66 -0
  38. package/dist/src/cli/commands/start.js.map +1 -0
  39. package/dist/src/cli/commands/status.js +117 -0
  40. package/dist/src/cli/commands/status.js.map +1 -0
  41. package/dist/src/cli/commands/stop.js +27 -0
  42. package/dist/src/cli/commands/stop.js.map +1 -0
  43. package/dist/src/cli/commands/system.js +128 -0
  44. package/dist/src/cli/commands/system.js.map +1 -0
  45. package/dist/src/cli/commands/tui.js +103 -0
  46. package/dist/src/cli/commands/tui.js.map +1 -0
  47. package/dist/src/cli/commands/update.js +133 -0
  48. package/dist/src/cli/commands/update.js.map +1 -0
  49. package/dist/src/cli/extensions/discord.js +113 -0
  50. package/dist/src/cli/extensions/discord.js.map +1 -0
  51. package/dist/src/cli/extensions/env.js +91 -0
  52. package/dist/src/cli/extensions/env.js.map +1 -0
  53. package/dist/src/cli/extensions/heartbeat.js +78 -0
  54. package/dist/src/cli/extensions/heartbeat.js.map +1 -0
  55. package/dist/src/cli/index.js +24 -0
  56. package/dist/src/cli/index.js.map +1 -0
  57. package/dist/src/cli/program.js +70 -0
  58. package/dist/src/cli/program.js.map +1 -0
  59. package/dist/src/cli/repl.js +184 -0
  60. package/dist/src/cli/repl.js.map +1 -0
  61. package/dist/src/cli/shared/discord-service.js +102 -0
  62. package/dist/src/cli/shared/discord-service.js.map +1 -0
  63. package/dist/src/config/index.js +10 -0
  64. package/dist/src/config/index.js.map +1 -0
  65. package/dist/src/config/loader.js +401 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/paths.js +84 -0
  68. package/dist/src/config/paths.js.map +1 -0
  69. package/dist/src/config/types.js +8 -0
  70. package/dist/src/config/types.js.map +1 -0
  71. package/dist/src/context-detector.js +60 -0
  72. package/dist/src/context-detector.js.map +1 -0
  73. package/dist/src/discord/index.js +376 -0
  74. package/dist/src/discord/index.js.map +1 -0
  75. package/dist/src/event-bus/index.js +97 -0
  76. package/dist/src/event-bus/index.js.map +1 -0
  77. package/dist/src/extensions/command-args.js +68 -0
  78. package/dist/src/extensions/command-args.js.map +1 -0
  79. package/dist/src/extensions/core/agent-registry-extension.js +541 -0
  80. package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
  81. package/dist/src/extensions/core/agent-worker.js +148 -0
  82. package/dist/src/extensions/core/agent-worker.js.map +1 -0
  83. package/dist/src/extensions/core/compaction-safeguard.js +154 -0
  84. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
  85. package/dist/src/extensions/core/confirm-destructive.js +43 -0
  86. package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
  87. package/dist/src/extensions/core/context-aware-extension.js +124 -0
  88. package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
  89. package/dist/src/extensions/core/context-pruning/extension.js +124 -0
  90. package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
  91. package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
  92. package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
  93. package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
  94. package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
  95. package/dist/src/extensions/core/context-pruning/settings.js +105 -0
  96. package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
  97. package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
  98. package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
  99. package/dist/src/extensions/core/discord-channel-extension.js +205 -0
  100. package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
  101. package/dist/src/extensions/core/discord-extension.js +142 -0
  102. package/dist/src/extensions/core/discord-extension.js.map +1 -0
  103. package/dist/src/extensions/core/env-loader-extension.js +157 -0
  104. package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
  105. package/dist/src/extensions/core/fileops-extension.js +699 -0
  106. package/dist/src/extensions/core/fileops-extension.js.map +1 -0
  107. package/dist/src/extensions/core/gateway-extension.js +730 -0
  108. package/dist/src/extensions/core/gateway-extension.js.map +1 -0
  109. package/dist/src/extensions/core/git-checkpoint.js +46 -0
  110. package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
  111. package/dist/src/extensions/core/handoff-extension.js +206 -0
  112. package/dist/src/extensions/core/handoff-extension.js.map +1 -0
  113. package/dist/src/extensions/core/heartbeat-extension.js +373 -0
  114. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
  115. package/dist/src/extensions/core/mcp-extension.js +413 -0
  116. package/dist/src/extensions/core/mcp-extension.js.map +1 -0
  117. package/dist/src/extensions/core/mode-manager-extension.js +562 -0
  118. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
  119. package/dist/src/extensions/core/multi-channel-extension.js +435 -0
  120. package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
  121. package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
  122. package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
  123. package/dist/src/extensions/core/onboarding-extension.js +122 -0
  124. package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
  125. package/dist/src/extensions/core/persona-loader-extension.js +139 -0
  126. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
  127. package/dist/src/extensions/core/pi-notify-extension.js +70 -0
  128. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
  129. package/dist/src/extensions/core/protected-paths.js +24 -0
  130. package/dist/src/extensions/core/protected-paths.js.map +1 -0
  131. package/dist/src/extensions/core/questionnaire-extension.js +242 -0
  132. package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
  133. package/dist/src/extensions/core/self-update-extension.js +181 -0
  134. package/dist/src/extensions/core/self-update-extension.js.map +1 -0
  135. package/dist/src/extensions/core/session-bridge-extension.js +78 -0
  136. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
  137. package/dist/src/extensions/core/session-manager-extension.js +319 -0
  138. package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
  139. package/dist/src/extensions/core/session-name-extension.js +88 -0
  140. package/dist/src/extensions/core/session-name-extension.js.map +1 -0
  141. package/dist/src/extensions/core/session-pruning-extension.js +480 -0
  142. package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
  143. package/dist/src/extensions/core/task-manager-extension.js +661 -0
  144. package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
  145. package/dist/src/extensions/core/update-extension.js +438 -0
  146. package/dist/src/extensions/core/update-extension.js.map +1 -0
  147. package/dist/src/extensions/core/websearch-extension.js +463 -0
  148. package/dist/src/extensions/core/websearch-extension.js.map +1 -0
  149. package/dist/src/extensions/index.js +5 -0
  150. package/dist/src/extensions/index.js.map +1 -0
  151. package/dist/src/extensions/loader.js +80 -0
  152. package/dist/src/extensions/loader.js.map +1 -0
  153. package/dist/src/gateway/index.js +353 -0
  154. package/dist/src/gateway/index.js.map +1 -0
  155. package/dist/src/index.js +150 -0
  156. package/dist/src/index.js.map +1 -0
  157. package/dist/src/llm/anthropic.js +86 -0
  158. package/dist/src/llm/anthropic.js.map +1 -0
  159. package/dist/src/llm/index.js +9 -0
  160. package/dist/src/llm/index.js.map +1 -0
  161. package/dist/src/llm/ollama.js +113 -0
  162. package/dist/src/llm/ollama.js.map +1 -0
  163. package/dist/src/llm/router.js +145 -0
  164. package/dist/src/llm/router.js.map +1 -0
  165. package/dist/src/llm/types.js +7 -0
  166. package/dist/src/llm/types.js.map +1 -0
  167. package/dist/src/memory/index.js +5 -0
  168. package/dist/src/memory/index.js.map +1 -0
  169. package/dist/src/memory/store.js +91 -0
  170. package/dist/src/memory/store.js.map +1 -0
  171. package/dist/src/pi-config.js +80 -0
  172. package/dist/src/pi-config.js.map +1 -0
  173. package/dist/src/skills/builtin/file.js +184 -0
  174. package/dist/src/skills/builtin/file.js.map +1 -0
  175. package/dist/src/skills/builtin/shell.js +100 -0
  176. package/dist/src/skills/builtin/shell.js.map +1 -0
  177. package/dist/src/skills/builtin/subagent.js +62 -0
  178. package/dist/src/skills/builtin/subagent.js.map +1 -0
  179. package/dist/src/skills/hello.js +42 -0
  180. package/dist/src/skills/hello.js.map +1 -0
  181. package/dist/src/skills/index.js +11 -0
  182. package/dist/src/skills/index.js.map +1 -0
  183. package/dist/src/skills/loader.js +382 -0
  184. package/dist/src/skills/loader.js.map +1 -0
  185. package/dist/src/skills/types.js +8 -0
  186. package/dist/src/skills/types.js.map +1 -0
  187. package/dist/src/utils/working-dir.js +71 -0
  188. package/dist/src/utils/working-dir.js.map +1 -0
  189. package/package.json +77 -0
  190. package/skills/1password/SKILL.md +70 -0
  191. package/skills/1password/references/cli-examples.md +29 -0
  192. package/skills/1password/references/get-started.md +17 -0
  193. package/skills/apple-notes/SKILL.md +77 -0
  194. package/skills/apple-reminders/SKILL.md +118 -0
  195. package/skills/bear-notes/SKILL.md +107 -0
  196. package/skills/blogwatcher/SKILL.md +69 -0
  197. package/skills/blucli/SKILL.md +47 -0
  198. package/skills/bluebubbles/SKILL.md +131 -0
  199. package/skills/camsnap/SKILL.md +45 -0
  200. package/skills/canvas/SKILL.md +198 -0
  201. package/skills/clawhub/SKILL.md +77 -0
  202. package/skills/coding-agent/SKILL.md +284 -0
  203. package/skills/discord/SKILL.md +197 -0
  204. package/skills/eightctl/SKILL.md +50 -0
  205. package/skills/food-order/SKILL.md +48 -0
  206. package/skills/gemini/SKILL.md +43 -0
  207. package/skills/gh-issues/SKILL.md +865 -0
  208. package/skills/gifgrep/SKILL.md +79 -0
  209. package/skills/github/SKILL.md +163 -0
  210. package/skills/gog/SKILL.md +116 -0
  211. package/skills/goplaces/SKILL.md +52 -0
  212. package/skills/healthcheck/SKILL.md +245 -0
  213. package/skills/himalaya/SKILL.md +257 -0
  214. package/skills/himalaya/references/configuration.md +184 -0
  215. package/skills/himalaya/references/message-composition.md +199 -0
  216. package/skills/imsg/SKILL.md +122 -0
  217. package/skills/mcporter/SKILL.md +61 -0
  218. package/skills/model-usage/SKILL.md +69 -0
  219. package/skills/model-usage/references/codexbar-cli.md +33 -0
  220. package/skills/model-usage/scripts/model_usage.py +310 -0
  221. package/skills/nano-banana-pro/SKILL.md +58 -0
  222. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  223. package/skills/nano-pdf/SKILL.md +38 -0
  224. package/skills/notion/SKILL.md +172 -0
  225. package/skills/obsidian/SKILL.md +81 -0
  226. package/skills/openai-image-gen/SKILL.md +89 -0
  227. package/skills/openai-image-gen/scripts/gen.py +240 -0
  228. package/skills/openai-whisper/SKILL.md +38 -0
  229. package/skills/openai-whisper-api/SKILL.md +52 -0
  230. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  231. package/skills/openhue/SKILL.md +112 -0
  232. package/skills/oracle/SKILL.md +125 -0
  233. package/skills/ordercli/SKILL.md +78 -0
  234. package/skills/peekaboo/SKILL.md +190 -0
  235. package/skills/sag/SKILL.md +87 -0
  236. package/skills/session-logs/SKILL.md +115 -0
  237. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  238. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  239. package/skills/skill-creator/SKILL.md +370 -0
  240. package/skills/skill-creator/license.txt +202 -0
  241. package/skills/skill-creator/scripts/init_skill.py +378 -0
  242. package/skills/skill-creator/scripts/package_skill.py +111 -0
  243. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  244. package/skills/slack/SKILL.md +144 -0
  245. package/skills/songsee/SKILL.md +49 -0
  246. package/skills/sonoscli/SKILL.md +46 -0
  247. package/skills/spotify-player/SKILL.md +64 -0
  248. package/skills/summarize/SKILL.md +87 -0
  249. package/skills/things-mac/SKILL.md +86 -0
  250. package/skills/tmux/SKILL.md +153 -0
  251. package/skills/tmux/scripts/find-sessions.sh +112 -0
  252. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  253. package/skills/trello/SKILL.md +95 -0
  254. package/skills/video-frames/SKILL.md +46 -0
  255. package/skills/video-frames/scripts/frame.sh +81 -0
  256. package/skills/voice-call/SKILL.md +45 -0
  257. package/skills/wacli/SKILL.md +72 -0
  258. package/skills/weather/SKILL.md +112 -0
@@ -0,0 +1,562 @@
1
+ /**
2
+ * Mode Manager Extension for 0xKobold
3
+ *
4
+ * Provides Plan/Build mode switching with different system prompts
5
+ * and tool restrictions. Supports extensible modes for custom workflows.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
8
+ import { join } from "path";
9
+ import { homedir } from "os";
10
+ // Global guard to prevent double initialization (hot-reload protection)
11
+ const MODE_MANAGER_STATE = {
12
+ initialized: false,
13
+ currentModeId: "build",
14
+ };
15
+ // Plan mode: Read-only bash commands allowed
16
+ const READONLY_BASH_COMMANDS = [
17
+ // File inspection
18
+ "cat", "head", "tail", "less", "more",
19
+ // Search
20
+ "grep", "find", "rg", "fd",
21
+ // Directory
22
+ "ls", "pwd", "tree",
23
+ // Git read-only
24
+ "git status", "git log", "git diff", "git branch", "git show",
25
+ // Package info
26
+ "npm list", "npm outdated", "yarn info",
27
+ // System info
28
+ "uname", "whoami", "date", "uptime",
29
+ // Process info
30
+ "ps", "top", "htop",
31
+ // Network info
32
+ "curl", "wget", "ping", "netstat", "ss",
33
+ ];
34
+ // Plan mode: Bash commands that are always blocked
35
+ const BLOCKED_BASH_COMMANDS = [
36
+ // File modification
37
+ "rm", "mv", "cp", "mkdir", "touch", "rmdir",
38
+ // Git write
39
+ "git add", "git commit", "git push", "git pull", "git merge", "git rebase",
40
+ // Package install
41
+ "npm install", "npm i", "yarn add", "yarn install", "pip install",
42
+ // System dangerous
43
+ "sudo", "kill", "reboot", "shutdown", "poweroff",
44
+ // Editors
45
+ "vim", "vi", "nano", "code", "emacs",
46
+ ];
47
+ // Default modes
48
+ const DEFAULT_MODES = {
49
+ plan: {
50
+ id: "plan",
51
+ name: "Plan",
52
+ description: "Investigation and planning mode - read-only tools",
53
+ icon: "🔍",
54
+ systemPrompt: `You are in PLAN MODE. Focus on investigation, analysis, and planning.
55
+
56
+ Your role:
57
+ - Investigate the codebase thoroughly before making changes
58
+ - Ask clarifying questions before proposing solutions
59
+ - Research files, dependencies, and architecture
60
+ - Create detailed plans with clear steps
61
+ - Consider edge cases and alternatives
62
+ - Spawn agents for parallel research tasks
63
+
64
+ You have access to READ-ONLY tools:
65
+ - File reading and searching (read, find, grep, ls)
66
+ - Web search for documentation
67
+ - Code analysis and exploration
68
+ - Spawn agents for multi-agent collaboration
69
+ - Ask questions using 'question' or 'questionnaire' tools
70
+ - Request mode change to 'build' when ready to implement (requires user approval)
71
+ - No file modifications or shell execution
72
+
73
+ Before writing code, explain:
74
+ 1. What you discovered
75
+ 2. Your approach and rationale
76
+ 3. Alternative solutions considered
77
+ 4. Potential risks`,
78
+ allowedTools: [
79
+ "read",
80
+ "grep",
81
+ "find",
82
+ "ls",
83
+ "bash",
84
+ "web_search",
85
+ "web_fetch",
86
+ "web_qa",
87
+ "agent_spawn",
88
+ "agent_list",
89
+ "agent_delegate",
90
+ "question",
91
+ "questionnaire",
92
+ "request_mode_change",
93
+ "set_session_name",
94
+ "get_session_name",
95
+ "generate_handoff_prompt",
96
+ "send_discord_message",
97
+ ],
98
+ color: "blue",
99
+ },
100
+ build: {
101
+ id: "build",
102
+ name: "Build",
103
+ description: "Implementation mode - full tool access",
104
+ icon: "🔨",
105
+ systemPrompt: `You are in BUILD MODE. Focus on implementation and execution.
106
+
107
+ Your role:
108
+ - Implement the requested changes efficiently
109
+ - Write clean, well-documented code
110
+ - Test your changes when possible
111
+ - Handle errors gracefully
112
+ - Follow existing code patterns
113
+
114
+ You have access to ALL tools including:
115
+ - File read/write/modification (read, edit, write)
116
+ - Search tools (find, grep, ls)
117
+ - Shell commands (bash)
118
+ - Ask questions using 'question' or 'questionnaire' tools
119
+ - Agent spawning, delegation, and task breakdown
120
+ - Valid agent types: coordinator, specialist, worker, reviewer, researcher, planner, executor
121
+ - Code generation and refactoring
122
+ - Request mode change to 'plan' for investigation (requires user approval)
123
+
124
+ Be concise and focused on delivering working code.`,
125
+ allowedTools: [
126
+ "read",
127
+ "edit",
128
+ "write",
129
+ "grep",
130
+ "find",
131
+ "ls",
132
+ "bash",
133
+ "web_search",
134
+ "web_fetch",
135
+ "web_qa",
136
+ "fetch_webpage",
137
+ "question",
138
+ "questionnaire",
139
+ "request_mode_change",
140
+ "set_session_name",
141
+ "get_session_name",
142
+ "generate_handoff_prompt",
143
+ "send_discord_message",
144
+ "task_breakdown",
145
+ "agent_spawn",
146
+ "agent_delegate",
147
+ "agent_list",
148
+ ],
149
+ color: "green",
150
+ },
151
+ };
152
+ function getModeConfigPath() {
153
+ const homeDir = process.env.HOME || homedir();
154
+ return join(homeDir, ".0xkobold", "modes.json");
155
+ }
156
+ /**
157
+ * Load mode configuration from disk
158
+ */
159
+ function loadModeConfig() {
160
+ try {
161
+ const configPath = getModeConfigPath();
162
+ if (existsSync(configPath)) {
163
+ const content = readFileSync(configPath, "utf-8");
164
+ return JSON.parse(content);
165
+ }
166
+ }
167
+ catch (error) {
168
+ console.warn("Failed to load mode config:", error);
169
+ }
170
+ return { currentMode: "build", customModes: [] };
171
+ }
172
+ /**
173
+ * Save mode configuration to disk
174
+ */
175
+ function saveModeConfig(config) {
176
+ try {
177
+ const configPath = getModeConfigPath();
178
+ const dir = join(configPath, "..");
179
+ if (!existsSync(dir)) {
180
+ mkdirSync(dir, { recursive: true });
181
+ }
182
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
183
+ }
184
+ catch (error) {
185
+ console.error("Failed to save mode config:", error);
186
+ }
187
+ }
188
+ /**
189
+ * Get all available modes (default + custom)
190
+ */
191
+ function getAllModes(config) {
192
+ const modes = { ...DEFAULT_MODES };
193
+ for (const customMode of config.customModes) {
194
+ modes[customMode.id] = customMode;
195
+ }
196
+ return modes;
197
+ }
198
+ /**
199
+ * Mode Manager Extension
200
+ */
201
+ export default function modeManagerExtension(pi) {
202
+ // Prevent double initialization (hot-reload protection)
203
+ if (MODE_MANAGER_STATE.initialized) {
204
+ console.log("[ModeManager] Already initialized, skipping re-registration");
205
+ return;
206
+ }
207
+ MODE_MANAGER_STATE.initialized = true;
208
+ let config = loadModeConfig();
209
+ // Initialize from saved config or shared state
210
+ const modes = getAllModes(config);
211
+ let currentMode = modes[config.currentMode] || DEFAULT_MODES.build;
212
+ MODE_MANAGER_STATE.currentModeId = currentMode.id;
213
+ /**
214
+ * Set the current mode
215
+ */
216
+ function setMode(modeId) {
217
+ const modes = getAllModes(config);
218
+ const mode = modes[modeId];
219
+ if (!mode) {
220
+ return false;
221
+ }
222
+ currentMode = mode;
223
+ MODE_MANAGER_STATE.currentModeId = modeId;
224
+ config.currentMode = modeId;
225
+ saveModeConfig(config);
226
+ console.log(`[ModeManager] Mode switched to: ${modeId}`);
227
+ return true;
228
+ }
229
+ /**
230
+ * Update status bar with current mode
231
+ */
232
+ function updateModeStatus(ctx) {
233
+ const statusText = `${currentMode.icon} ${currentMode.name}`;
234
+ // Use ctx.ui.setStatus if available
235
+ if (ctx.ui?.setStatus) {
236
+ try {
237
+ ctx.ui.setStatus("mode", statusText);
238
+ }
239
+ catch (err) {
240
+ console.log("[ModeManager] Failed to set status:", err);
241
+ }
242
+ }
243
+ }
244
+ // Register mode switch commands
245
+ pi.registerCommand("plan", {
246
+ description: "Switch to PLAN mode (read-only investigation)",
247
+ handler: async (_args, ctx) => {
248
+ if (setMode("plan")) {
249
+ // Update session system prompt for the active session, if available
250
+ // @ts-ignore sessionManager in mocks may expose setSystemPrompt
251
+ ctx.sessionManager?.setSystemPrompt?.(currentMode.systemPrompt);
252
+ ctx.ui.notify(currentMode.systemPrompt, "info");
253
+ }
254
+ },
255
+ });
256
+ pi.registerCommand("build", {
257
+ description: "Switch to BUILD mode (full tool access)",
258
+ handler: async (_args, ctx) => {
259
+ if (setMode("build")) {
260
+ // Update session system prompt for the active session, if available
261
+ // @ts-ignore sessionManager in mocks may expose setSystemPrompt
262
+ ctx.sessionManager?.setSystemPrompt?.(currentMode.systemPrompt);
263
+ ctx.ui.notify(currentMode.systemPrompt, "info");
264
+ }
265
+ },
266
+ });
267
+ pi.registerCommand("mode", {
268
+ description: "Show current mode or switch modes",
269
+ handler: async (args, ctx) => {
270
+ // Defensive: args might not be a string in some contexts
271
+ const argsString = typeof args === "string" ? args : "";
272
+ const argsArray = argsString.trim() ? argsString.split(/\s+/) : [];
273
+ if (argsArray.length === 0) {
274
+ // Show current mode
275
+ ctx.ui.notify(`Current mode: ${currentMode.icon} ${currentMode.name} (${currentMode.id})`, "info");
276
+ ctx.ui.notify(currentMode.description, "info");
277
+ ctx.ui.notify(`System prompt:\n${currentMode.systemPrompt}`, "info");
278
+ }
279
+ else {
280
+ // Switch to specified mode
281
+ const modeId = argsArray[0];
282
+ if (setMode(modeId)) {
283
+ ctx.ui.notify(`Switched to ${currentMode.icon} ${currentMode.name} mode`, "info");
284
+ }
285
+ else {
286
+ const available = Object.keys(getAllModes(config)).join(", ");
287
+ ctx.ui.notify(`Unknown mode: ${modeId}. Available: ${available}`, "error");
288
+ }
289
+ }
290
+ },
291
+ });
292
+ pi.registerCommand("modes", {
293
+ description: "List all available modes",
294
+ handler: async (_args, ctx) => {
295
+ const modes = getAllModes(config);
296
+ const modeList = Object.values(modes)
297
+ .map((m) => `${m.icon} ${m.name} (${m.id})`)
298
+ .join("\n");
299
+ ctx.ui.notify(`Available modes:\n${modeList}`, "info");
300
+ },
301
+ });
302
+ // Custom mode registration
303
+ pi.registerCommand("mode-add", {
304
+ description: "Register a custom mode",
305
+ handler: async (_args, ctx) => {
306
+ // This would parse a JSON mode definition
307
+ // For now, just show how to use it
308
+ ctx.ui.notify("Custom mode registration:\n" +
309
+ "Edit ~/.0xkobold/modes.json and add your mode to customModes array", "info");
310
+ },
311
+ });
312
+ // Debounce guards for shortcuts (separate to avoid conflicts)
313
+ let ctrlShiftMDebounce = false;
314
+ let f2Debounce = false;
315
+ // Track pending mode change requests from the agent
316
+ let pendingModeRequest = null;
317
+ // Register keyboard shortcut for quick mode toggle (ctrl+shift+m - avoiding ctrl+m which conflicts with Enter)
318
+ // Only register if the API supports it (not in test mocks)
319
+ if (typeof pi.registerShortcut === "function") {
320
+ pi.registerShortcut("ctrl+shift+m", {
321
+ description: "Toggle between plan/build modes",
322
+ handler: async (ctx) => {
323
+ // Debounce protection - skip if already processing
324
+ if (ctrlShiftMDebounce) {
325
+ console.log("[ModeManager] Ctrl+Shift+M debounced, skipping");
326
+ return;
327
+ }
328
+ ctrlShiftMDebounce = true;
329
+ try {
330
+ const currentModeId = MODE_MANAGER_STATE.currentModeId;
331
+ console.log(`[ModeManager] Ctrl+Shift+M triggered: switching from ${currentModeId}`);
332
+ const newMode = currentModeId === "plan" ? "build" : "plan";
333
+ if (setMode(newMode)) {
334
+ const modes = getAllModes(config);
335
+ const mode = modes[newMode];
336
+ ctx.ui.notify(`Switched to ${mode.icon} ${mode.name} mode`, "info");
337
+ }
338
+ }
339
+ finally {
340
+ // Release debounce after a short delay
341
+ setTimeout(() => {
342
+ ctrlShiftMDebounce = false;
343
+ }, 300);
344
+ }
345
+ },
346
+ });
347
+ // Register F2 key for quick mode toggle
348
+ pi.registerShortcut("f2", {
349
+ description: "Toggle between plan/build modes (F2)",
350
+ handler: async (ctx) => {
351
+ if (f2Debounce) {
352
+ console.log("[ModeManager] F2 debounced, skipping");
353
+ return;
354
+ }
355
+ f2Debounce = true;
356
+ try {
357
+ const currentModeId = MODE_MANAGER_STATE.currentModeId;
358
+ console.log(`[ModeManager] F2 pressed: switching from ${currentModeId}`);
359
+ const newMode = currentModeId === "plan" ? "build" : "plan";
360
+ if (setMode(newMode)) {
361
+ const modes = getAllModes(config);
362
+ const mode = modes[newMode];
363
+ ctx.ui.notify(`Switched to ${mode.icon} ${mode.name} mode`, "info");
364
+ }
365
+ }
366
+ finally {
367
+ setTimeout(() => {
368
+ f2Debounce = false;
369
+ }, 300);
370
+ }
371
+ },
372
+ });
373
+ }
374
+ // ═══════════════════════════════════════════════════════════════
375
+ // AGENT MODE REQUESTS - LLM can request mode changes, user approves
376
+ // ═══════════════════════════════════════════════════════════════
377
+ // Register tool for agent to request mode changes
378
+ pi.registerTool({
379
+ name: "request_mode_change",
380
+ label: "request_mode_change",
381
+ description: "Request to switch to a different mode (plan or build). Requires user approval. Use when you need to investigate (plan) or when you're ready to implement (build).",
382
+ // @ts-ignore TSchema mismatch
383
+ parameters: {
384
+ type: "object",
385
+ properties: {
386
+ target_mode: {
387
+ type: "string",
388
+ enum: ["plan", "build"],
389
+ description: "The mode to request switching to",
390
+ },
391
+ reason: {
392
+ type: "string",
393
+ description: "Why you want to switch modes. Be specific about what you need to do.",
394
+ },
395
+ },
396
+ required: ["target_mode", "reason"],
397
+ },
398
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
399
+ const { target_mode, reason } = params;
400
+ console.log(`[ModeManager] Agent requested mode change: ${target_mode} - ${reason}`);
401
+ // Check if already in that mode
402
+ if (currentMode.id === target_mode) {
403
+ return {
404
+ content: [{ type: "text", text: `Already in ${target_mode} mode.` }],
405
+ details: { success: true, alreadyInMode: true },
406
+ };
407
+ }
408
+ // Store the pending request
409
+ pendingModeRequest = {
410
+ requestedMode: target_mode,
411
+ reason,
412
+ timestamp: Date.now(),
413
+ };
414
+ // Notify user about the request
415
+ if (ctx.ui?.notify) {
416
+ ctx.ui.notify(`🔄 Mode Change Requested\nAgent wants to switch to: ${target_mode.toUpperCase()} mode\nReason: ${reason}\n\nType "/approve" to allow or "/deny" to reject.`, "info");
417
+ }
418
+ return {
419
+ content: [{
420
+ type: "text",
421
+ text: `Requested switch to ${target_mode} mode.\nReason: ${reason}\n\nWaiting for user approval...`
422
+ }],
423
+ details: {
424
+ success: true,
425
+ requested: target_mode,
426
+ reason,
427
+ requiresApproval: true
428
+ },
429
+ };
430
+ },
431
+ });
432
+ // Command for user to approve a pending mode change
433
+ pi.registerCommand("approve", {
434
+ description: "Approve a pending mode change request from the agent",
435
+ handler: async (_args, ctx) => {
436
+ if (!pendingModeRequest) {
437
+ ctx.ui.notify("No pending mode change request to approve.", "warning");
438
+ return;
439
+ }
440
+ const { requestedMode, reason, timestamp } = pendingModeRequest;
441
+ const age = Math.round((Date.now() - timestamp) / 1000);
442
+ console.log(`[ModeManager] User approved mode change to ${requestedMode} (requested ${age}s ago)`);
443
+ if (setMode(requestedMode)) {
444
+ const modes = getAllModes(config);
445
+ const mode = modes[requestedMode];
446
+ ctx.ui.notify(`✅ Approved! Switched to ${mode.icon} ${mode.name} mode\nReason: ${reason}`, "info");
447
+ pendingModeRequest = null;
448
+ }
449
+ },
450
+ });
451
+ // Command for user to deny a pending mode change
452
+ pi.registerCommand("deny", {
453
+ description: "Deny a pending mode change request from the agent",
454
+ handler: async (_args, ctx) => {
455
+ if (!pendingModeRequest) {
456
+ ctx.ui.notify("No pending mode change request to deny.", "warning");
457
+ return;
458
+ }
459
+ const { requestedMode, reason } = pendingModeRequest;
460
+ console.log(`[ModeManager] User denied mode change to ${requestedMode}`);
461
+ ctx.ui.notify(`❌ Denied mode change to ${requestedMode}\nReason given: ${reason}\n\nCurrent mode: ${currentMode.icon} ${currentMode.name}`, "info");
462
+ pendingModeRequest = null;
463
+ },
464
+ });
465
+ // Command to check if there's a pending request
466
+ pi.registerCommand("pending", {
467
+ description: "Check if there's a pending mode change request",
468
+ handler: async (_args, ctx) => {
469
+ if (!pendingModeRequest) {
470
+ ctx.ui.notify(`No pending mode change requests.\nCurrent mode: ${currentMode.icon} ${currentMode.name}`, "info");
471
+ return;
472
+ }
473
+ const { requestedMode, reason, timestamp } = pendingModeRequest;
474
+ const age = Math.round((Date.now() - timestamp) / 1000);
475
+ ctx.ui.notify(`⏳ Pending Mode Change Request:\n` +
476
+ ` Mode: ${requestedMode.toUpperCase()}\n` +
477
+ ` Reason: ${reason}\n` +
478
+ ` Age: ${age}s ago\n\n` +
479
+ `Type "/approve" or "/deny"`, "info");
480
+ },
481
+ });
482
+ // Log initialization for debugging
483
+ console.log(`[ModeManager] Extension initialized. Mode: ${currentMode.id}, Shortcut: ctrl+shift+m`);
484
+ // Hook into session start to set up UI
485
+ pi.on("session_start", async (_event, ctx) => {
486
+ // Set initial status - but only if UI is fully ready
487
+ if (ctx.ui?.setStatus && ctx.hasUI) {
488
+ try {
489
+ ctx.ui.setStatus("mode", `${currentMode.icon} ${currentMode.name}`);
490
+ }
491
+ catch (err) {
492
+ console.log("[ModeManager] Status setup deferred:", err);
493
+ }
494
+ }
495
+ });
496
+ // Hook into before agent start to apply mode-specific system prompt
497
+ pi.on("before_agent_start", async (_event) => {
498
+ // Return mode-specific system prompt modification
499
+ return {
500
+ systemPrompt: currentMode.systemPrompt + "\n\nCurrent mode: " + currentMode.name + " " + currentMode.icon
501
+ };
502
+ });
503
+ // Filter tools based on mode
504
+ pi.on("tool_call", async (event, ctx) => {
505
+ const toolName = event.toolName || "";
506
+ const allowedToolsList = currentMode.allowedTools.join(", ");
507
+ console.log(`[ModeManager] Tool call: "${toolName}" | Mode: ${currentMode.id} | Allowed: ${allowedToolsList}`);
508
+ // Use exact case-insensitive matching (not substring matching)
509
+ const isAllowed = currentMode.allowedTools.some((allowed) => toolName.toLowerCase() === allowed.toLowerCase());
510
+ if (!isAllowed) {
511
+ const msg = `Tool "${toolName}" not available in ${currentMode.name} mode. Allowed: ${allowedToolsList}`;
512
+ console.log(`[ModeManager] BLOCKED: ${msg}`);
513
+ ctx.ui.notify(msg + `\nSwitch to build mode with: /build`, "error");
514
+ // Block the tool call
515
+ return { block: true, reason: msg };
516
+ }
517
+ console.log(`[ModeManager] ALLOWED: "${toolName}"`);
518
+ });
519
+ // Filter bash commands in plan mode
520
+ // @ts-ignore - UserBash handler signature
521
+ pi.on("user_bash", async (event, _ctx) => {
522
+ if (currentMode.id !== "plan") {
523
+ return; // Allow all bash in build mode
524
+ }
525
+ const command = event.command.trim();
526
+ const baseCommand = command.split(/\s+/)[0].toLowerCase();
527
+ console.log(`[ModeManager] Bash command: "${command}" | Mode: ${currentMode.id}`);
528
+ // Check if explicitly blocked
529
+ const isBlocked = BLOCKED_BASH_COMMANDS.some(blocked => command.toLowerCase().startsWith(blocked.toLowerCase()) || baseCommand === blocked.toLowerCase());
530
+ if (isBlocked) {
531
+ const msg = `Command "${command}" is not allowed in Plan mode.`;
532
+ console.log(`[ModeManager] BLOCKED bash: ${msg}`);
533
+ return {
534
+ result: {
535
+ stdout: "",
536
+ stderr: msg + "\nAllowed commands: " + READONLY_BASH_COMMANDS.join(", ") + "\nSwitch to build mode with: /build",
537
+ exitCode: 1,
538
+ }
539
+ };
540
+ }
541
+ // Check if explicitly allowed
542
+ const isAllowed = READONLY_BASH_COMMANDS.some(allowed => command.toLowerCase().startsWith(allowed.toLowerCase()) || baseCommand === allowed.toLowerCase());
543
+ if (!isAllowed) {
544
+ const msg = `Command "${command}" may not be safe in Plan mode.`;
545
+ console.log(`[ModeManager] WARNING bash: ${msg}`);
546
+ // Allow but warn - or could block here if strict
547
+ return;
548
+ }
549
+ console.log(`[ModeManager] ALLOWED bash: "${command}"`);
550
+ });
551
+ console.log(`Mode Manager Extension loaded. Current mode: ${currentMode.id}`);
552
+ }
553
+ /**
554
+ * Reset mode manager state for testing purposes.
555
+ * This allows tests to re-initialize the extension cleanly.
556
+ * @internal
557
+ */
558
+ export function __resetModeManagerState() {
559
+ MODE_MANAGER_STATE.initialized = false;
560
+ MODE_MANAGER_STATE.currentModeId = "build";
561
+ }
562
+ //# sourceMappingURL=mode-manager-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-manager-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/mode-manager-extension.ts"],"names":[],"mappings":"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"}