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.
- package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
- package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
- package/HEARTBEAT.md +45 -0
- package/README.md +197 -0
- package/USAGE.md +191 -0
- package/dist/package.json +77 -0
- package/dist/src/agent/pi-adapter.js +307 -0
- package/dist/src/agent/pi-adapter.js.map +1 -0
- package/dist/src/agent/tool-adapter.js +86 -0
- package/dist/src/agent/tool-adapter.js.map +1 -0
- package/dist/src/approval/queue.js +114 -0
- package/dist/src/approval/queue.js.map +1 -0
- package/dist/src/ascii-kobold.js +76 -0
- package/dist/src/ascii-kobold.js.map +1 -0
- package/dist/src/cli/client.js +217 -0
- package/dist/src/cli/client.js.map +1 -0
- package/dist/src/cli/commands/agent.js +272 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/chat.js +234 -0
- package/dist/src/cli/commands/chat.js.map +1 -0
- package/dist/src/cli/commands/config.js +202 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +203 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +184 -0
- package/dist/src/cli/commands/gateway.js.map +1 -0
- package/dist/src/cli/commands/init.js +175 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/kobold.js +21 -0
- package/dist/src/cli/commands/kobold.js.map +1 -0
- package/dist/src/cli/commands/logs.js +27 -0
- package/dist/src/cli/commands/logs.js.map +1 -0
- package/dist/src/cli/commands/mode.js +121 -0
- package/dist/src/cli/commands/mode.js.map +1 -0
- package/dist/src/cli/commands/persona.js +261 -0
- package/dist/src/cli/commands/persona.js.map +1 -0
- package/dist/src/cli/commands/start.js +66 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/status.js +117 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/stop.js +27 -0
- package/dist/src/cli/commands/stop.js.map +1 -0
- package/dist/src/cli/commands/system.js +128 -0
- package/dist/src/cli/commands/system.js.map +1 -0
- package/dist/src/cli/commands/tui.js +103 -0
- package/dist/src/cli/commands/tui.js.map +1 -0
- package/dist/src/cli/commands/update.js +133 -0
- package/dist/src/cli/commands/update.js.map +1 -0
- package/dist/src/cli/extensions/discord.js +113 -0
- package/dist/src/cli/extensions/discord.js.map +1 -0
- package/dist/src/cli/extensions/env.js +91 -0
- package/dist/src/cli/extensions/env.js.map +1 -0
- package/dist/src/cli/extensions/heartbeat.js +78 -0
- package/dist/src/cli/extensions/heartbeat.js.map +1 -0
- package/dist/src/cli/index.js +24 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/program.js +70 -0
- package/dist/src/cli/program.js.map +1 -0
- package/dist/src/cli/repl.js +184 -0
- package/dist/src/cli/repl.js.map +1 -0
- package/dist/src/cli/shared/discord-service.js +102 -0
- package/dist/src/cli/shared/discord-service.js.map +1 -0
- package/dist/src/config/index.js +10 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/loader.js +401 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/paths.js +84 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/config/types.js +8 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/context-detector.js +60 -0
- package/dist/src/context-detector.js.map +1 -0
- package/dist/src/discord/index.js +376 -0
- package/dist/src/discord/index.js.map +1 -0
- package/dist/src/event-bus/index.js +97 -0
- package/dist/src/event-bus/index.js.map +1 -0
- package/dist/src/extensions/command-args.js +68 -0
- package/dist/src/extensions/command-args.js.map +1 -0
- package/dist/src/extensions/core/agent-registry-extension.js +541 -0
- package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-worker.js +148 -0
- package/dist/src/extensions/core/agent-worker.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard.js +154 -0
- package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
- package/dist/src/extensions/core/confirm-destructive.js +43 -0
- package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
- package/dist/src/extensions/core/context-aware-extension.js +124 -0
- package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/extension.js +124 -0
- package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
- package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
- package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/settings.js +105 -0
- package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
- package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
- package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
- package/dist/src/extensions/core/discord-channel-extension.js +205 -0
- package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/discord-extension.js +142 -0
- package/dist/src/extensions/core/discord-extension.js.map +1 -0
- package/dist/src/extensions/core/env-loader-extension.js +157 -0
- package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/fileops-extension.js +699 -0
- package/dist/src/extensions/core/fileops-extension.js.map +1 -0
- package/dist/src/extensions/core/gateway-extension.js +730 -0
- package/dist/src/extensions/core/gateway-extension.js.map +1 -0
- package/dist/src/extensions/core/git-checkpoint.js +46 -0
- package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
- package/dist/src/extensions/core/handoff-extension.js +206 -0
- package/dist/src/extensions/core/handoff-extension.js.map +1 -0
- package/dist/src/extensions/core/heartbeat-extension.js +373 -0
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
- package/dist/src/extensions/core/mcp-extension.js +413 -0
- package/dist/src/extensions/core/mcp-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +562 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/multi-channel-extension.js +435 -0
- package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
- package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
- package/dist/src/extensions/core/onboarding-extension.js +122 -0
- package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
- package/dist/src/extensions/core/persona-loader-extension.js +139 -0
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/pi-notify-extension.js +70 -0
- package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
- package/dist/src/extensions/core/protected-paths.js +24 -0
- package/dist/src/extensions/core/protected-paths.js.map +1 -0
- package/dist/src/extensions/core/questionnaire-extension.js +242 -0
- package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
- package/dist/src/extensions/core/self-update-extension.js +181 -0
- package/dist/src/extensions/core/self-update-extension.js.map +1 -0
- package/dist/src/extensions/core/session-bridge-extension.js +78 -0
- package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
- package/dist/src/extensions/core/session-manager-extension.js +319 -0
- package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/session-name-extension.js +88 -0
- package/dist/src/extensions/core/session-name-extension.js.map +1 -0
- package/dist/src/extensions/core/session-pruning-extension.js +480 -0
- package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
- package/dist/src/extensions/core/task-manager-extension.js +661 -0
- package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/update-extension.js +438 -0
- package/dist/src/extensions/core/update-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-extension.js +463 -0
- package/dist/src/extensions/core/websearch-extension.js.map +1 -0
- package/dist/src/extensions/index.js +5 -0
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.js +80 -0
- package/dist/src/extensions/loader.js.map +1 -0
- package/dist/src/gateway/index.js +353 -0
- package/dist/src/gateway/index.js.map +1 -0
- package/dist/src/index.js +150 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/anthropic.js +86 -0
- package/dist/src/llm/anthropic.js.map +1 -0
- package/dist/src/llm/index.js +9 -0
- package/dist/src/llm/index.js.map +1 -0
- package/dist/src/llm/ollama.js +113 -0
- package/dist/src/llm/ollama.js.map +1 -0
- package/dist/src/llm/router.js +145 -0
- package/dist/src/llm/router.js.map +1 -0
- package/dist/src/llm/types.js +7 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/memory/index.js +5 -0
- package/dist/src/memory/index.js.map +1 -0
- package/dist/src/memory/store.js +91 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/pi-config.js +80 -0
- package/dist/src/pi-config.js.map +1 -0
- package/dist/src/skills/builtin/file.js +184 -0
- package/dist/src/skills/builtin/file.js.map +1 -0
- package/dist/src/skills/builtin/shell.js +100 -0
- package/dist/src/skills/builtin/shell.js.map +1 -0
- package/dist/src/skills/builtin/subagent.js +62 -0
- package/dist/src/skills/builtin/subagent.js.map +1 -0
- package/dist/src/skills/hello.js +42 -0
- package/dist/src/skills/hello.js.map +1 -0
- package/dist/src/skills/index.js +11 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/loader.js +382 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/types.js +8 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/utils/working-dir.js +71 -0
- package/dist/src/utils/working-dir.js.map +1 -0
- package/package.json +77 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +198 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +865 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +153 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- 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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"}
|