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,376 @@
1
+ /**
2
+ * Discord Module
3
+ *
4
+ * Discord integration for 0xKobold.
5
+ * Simplified port from OpenClaw's Discord implementation.
6
+ */
7
+ import { Client, GatewayIntentBits, Partials, Events, } from 'discord.js';
8
+ import { createEventEmitter } from '../event-bus';
9
+ const emit = createEventEmitter('discord');
10
+ // Discord client instance
11
+ let client = null;
12
+ let config = null;
13
+ // Message processing state
14
+ const processingMessages = new Set();
15
+ const recentMessages = new Map();
16
+ // Cleanup interval for recent messages (1 minute)
17
+ setInterval(() => {
18
+ const now = Date.now();
19
+ for (const [id, timestamp] of recentMessages) {
20
+ if (now - timestamp > 60000) {
21
+ recentMessages.delete(id);
22
+ }
23
+ }
24
+ }, 60000);
25
+ /**
26
+ * Initialize Discord client
27
+ */
28
+ export async function initDiscord(discordConfig) {
29
+ if (!discordConfig.enabled) {
30
+ console.log('[Discord] Discord integration disabled');
31
+ return null;
32
+ }
33
+ if (!discordConfig.token) {
34
+ console.error('[Discord] No bot token configured');
35
+ return null;
36
+ }
37
+ config = discordConfig;
38
+ client = new Client({
39
+ intents: [
40
+ GatewayIntentBits.Guilds,
41
+ GatewayIntentBits.GuildMessages,
42
+ GatewayIntentBits.MessageContent,
43
+ GatewayIntentBits.DirectMessages,
44
+ GatewayIntentBits.GuildMembers,
45
+ ],
46
+ partials: [Partials.Channel, Partials.Message],
47
+ });
48
+ // Event handlers
49
+ client.on(Events.ClientReady, () => {
50
+ console.log(`[Discord] Logged in as ${client?.user?.tag}`);
51
+ updatePresence();
52
+ // @ts-ignore EventEmitter type
53
+ emit('discord.client.connected', {
54
+ botId: client?.user?.id,
55
+ botName: client?.user?.tag,
56
+ guilds: client?.guilds.cache.size ?? 0,
57
+ });
58
+ });
59
+ client.on(Events.MessageCreate, handleMessage);
60
+ client.on(Events.Error, (error) => {
61
+ console.error('[Discord] Client error:', error);
62
+ // @ts-ignore EventEmitter type
63
+ emit('system.error', { source: 'discord', error });
64
+ });
65
+ // @ts-ignore Discord event name
66
+ client.on(Events.Disconnect, () => {
67
+ console.log('[Discord] Disconnected');
68
+ // @ts-ignore EventEmitter type
69
+ emit('discord.client.disconnected', {});
70
+ });
71
+ // Login
72
+ try {
73
+ await client.login(discordConfig.token);
74
+ }
75
+ catch (err) {
76
+ console.error('[Discord] Failed to login:', err);
77
+ return null;
78
+ }
79
+ return client;
80
+ }
81
+ /**
82
+ * Handle incoming message
83
+ */
84
+ async function handleMessage(message) {
85
+ if (!client || !config)
86
+ return;
87
+ // Ignore own messages
88
+ if (message.author.id === client.user?.id)
89
+ return;
90
+ // Ignore bots (unless configured otherwise)
91
+ if (message.author.bot)
92
+ return;
93
+ // Check if we should process this message
94
+ if (!shouldProcessMessage(message))
95
+ return;
96
+ // Mark as processing
97
+ processingMessages.add(message.id);
98
+ recentMessages.set(message.id, Date.now());
99
+ try {
100
+ // Extract message info
101
+ const messageInfo = extractMessageInfo(message);
102
+ // Emit event for other modules
103
+ // @ts-ignore EventEmitter type
104
+ emit('discord.message.received', messageInfo);
105
+ // Auto-reply if enabled
106
+ if (shouldAutoReply(message)) {
107
+ await processMessage(message, messageInfo);
108
+ }
109
+ }
110
+ catch (err) {
111
+ console.error('[Discord] Error handling message:', err);
112
+ }
113
+ finally {
114
+ processingMessages.delete(message.id);
115
+ }
116
+ }
117
+ /**
118
+ * Check if message should be processed
119
+ */
120
+ function shouldProcessMessage(message) {
121
+ if (!config)
122
+ return false;
123
+ // Skip already processed
124
+ if (recentMessages.has(message.id))
125
+ return false;
126
+ if (processingMessages.has(message.id))
127
+ return false;
128
+ // DM handling
129
+ if (message.channel.type === 1) { // DM
130
+ switch (config.dmPolicy) {
131
+ case 'block':
132
+ return false;
133
+ case 'whitelist':
134
+ return config.dmWhitelist.includes(message.author.id);
135
+ case 'allow':
136
+ default:
137
+ return true;
138
+ }
139
+ }
140
+ // Guild channel handling
141
+ const channelId = message.channelId;
142
+ const channelConfig = config.channels?.[channelId];
143
+ // If channel has config, use it
144
+ if (channelConfig) {
145
+ return channelConfig.enabled !== false;
146
+ }
147
+ // Default to true for guild channels
148
+ return true;
149
+ }
150
+ /**
151
+ * Check if should auto-reply
152
+ */
153
+ function shouldAutoReply(message) {
154
+ if (!config)
155
+ return false;
156
+ const channelConfig = config.channels?.[message.channelId];
157
+ // Channel-specific setting takes precedence
158
+ if (channelConfig?.autoReply !== undefined) {
159
+ return channelConfig.autoReply;
160
+ }
161
+ // Mentioned in message
162
+ const isMentioned = message.mentions.has(client?.user?.id ?? '', { ignoreEveryone: true });
163
+ if (isMentioned)
164
+ return true;
165
+ // Default setting
166
+ return config.autoReply ?? true;
167
+ }
168
+ /**
169
+ * Process message and generate reply
170
+ */
171
+ async function processMessage(message, info) {
172
+ // Show typing indicator if enabled
173
+ if (config?.typingIndicator) {
174
+ if ('sendTyping' in message.channel) {
175
+ await message.channel.sendTyping();
176
+ }
177
+ }
178
+ // Get agent for this channel
179
+ const channelConfig = config?.channels?.[message.channelId];
180
+ const agentId = channelConfig?.agentId ?? 'default';
181
+ // Emit event for agent system to handle
182
+ // @ts-ignore EventEmitter type
183
+ emit('agent.message', {
184
+ source: 'discord',
185
+ agentId,
186
+ message: info,
187
+ reply: async (content, options) => {
188
+ await sendReply(message, content, options);
189
+ },
190
+ });
191
+ }
192
+ /**
193
+ * Send reply to message
194
+ */
195
+ export async function sendReply(originalMessage, content, options = {}) {
196
+ try {
197
+ const { reply = true, codeBlock, ephemeral } = options;
198
+ let formattedContent = content;
199
+ // Format as code block if specified
200
+ if (codeBlock) {
201
+ formattedContent = `\`\`\`${codeBlock}\n${content}\n\`\`\``;
202
+ }
203
+ // Chunk long messages
204
+ const chunks = chunkMessage(formattedContent, 2000);
205
+ for (let i = 0; i < chunks.length; i++) {
206
+ const chunk = chunks[i];
207
+ const isFirst = i === 0;
208
+ if (isFirst && reply) {
209
+ await originalMessage.reply({
210
+ content: chunk,
211
+ allowedMentions: { repliedUser: false },
212
+ });
213
+ }
214
+ else {
215
+ // @ts-ignore Discord channel send
216
+ await originalMessage.channel.send(chunk);
217
+ }
218
+ }
219
+ // @ts-ignore EventEmitter type
220
+ emit('discord.message.sent', {
221
+ channelId: originalMessage.channelId,
222
+ replyTo: originalMessage.id,
223
+ chunks: chunks.length,
224
+ });
225
+ }
226
+ catch (err) {
227
+ console.error('[Discord] Failed to send reply:', err);
228
+ }
229
+ }
230
+ /**
231
+ * Send message to channel
232
+ */
233
+ export async function sendToChannel(channelId, content, options = {}) {
234
+ if (!client)
235
+ return;
236
+ try {
237
+ const channel = await client.channels.fetch(channelId);
238
+ if (!channel || !('send' in channel))
239
+ return;
240
+ let formattedContent = content;
241
+ if (options.codeBlock) {
242
+ formattedContent = `\`\`\`${options.codeBlock}\n${content}\n\`\`\``;
243
+ }
244
+ const chunks = chunkMessage(formattedContent, 2000);
245
+ for (const chunk of chunks) {
246
+ // @ts-ignore Discord channel send
247
+ await channel.send(chunk);
248
+ }
249
+ // @ts-ignore EventEmitter type
250
+ emit('discord.message.sent', {
251
+ channelId,
252
+ chunks: chunks.length,
253
+ });
254
+ }
255
+ catch (err) {
256
+ console.error('[Discord] Failed to send to channel:', err);
257
+ }
258
+ }
259
+ /**
260
+ * Chunk message to fit Discord limits
261
+ */
262
+ function chunkMessage(content, maxLength) {
263
+ if (content.length <= maxLength) {
264
+ return [content];
265
+ }
266
+ const chunks = [];
267
+ let remaining = content;
268
+ while (remaining.length > 0) {
269
+ if (remaining.length <= maxLength) {
270
+ chunks.push(remaining);
271
+ break;
272
+ }
273
+ // Find good break point
274
+ let breakPoint = maxLength;
275
+ while (breakPoint > 0 && remaining[breakPoint] !== '\n') {
276
+ breakPoint--;
277
+ }
278
+ if (breakPoint === 0)
279
+ breakPoint = maxLength;
280
+ chunks.push(remaining.slice(0, breakPoint));
281
+ remaining = remaining.slice(breakPoint).trim();
282
+ }
283
+ return chunks;
284
+ }
285
+ /**
286
+ * Update bot presence
287
+ */
288
+ function updatePresence() {
289
+ if (!client?.user || !config)
290
+ return;
291
+ const presence = config.presence;
292
+ if (!presence)
293
+ return;
294
+ client.user.setPresence({
295
+ status: presence.status ?? 'online',
296
+ activities: presence.activity
297
+ ? [{ name: presence.activity, type: 0 }]
298
+ : undefined,
299
+ });
300
+ }
301
+ /**
302
+ * Extract message info
303
+ */
304
+ function extractMessageInfo(message) {
305
+ return {
306
+ id: message.id,
307
+ content: message.content,
308
+ author: {
309
+ id: message.author.id,
310
+ username: message.author.username,
311
+ displayName: message.author.displayName,
312
+ bot: message.author.bot,
313
+ },
314
+ channel: {
315
+ id: message.channelId,
316
+ type: message.channel.type,
317
+ name: getChannelName(message.channel),
318
+ },
319
+ guild: message.guild
320
+ ? {
321
+ id: message.guild.id,
322
+ name: message.guild.name,
323
+ }
324
+ : null,
325
+ mentions: {
326
+ users: message.mentions.users.map((u) => u.id),
327
+ roles: [...message.mentions.roles.keys()],
328
+ everyone: message.mentions.everyone,
329
+ },
330
+ attachments: message.attachments.map((a) => ({
331
+ id: a.id,
332
+ url: a.url,
333
+ name: a.name,
334
+ contentType: a.contentType,
335
+ size: a.size,
336
+ })),
337
+ timestamp: message.createdTimestamp,
338
+ isDM: message.channel.type === 1,
339
+ };
340
+ }
341
+ /**
342
+ * Get channel name
343
+ */
344
+ function getChannelName(channel) {
345
+ if (channel.type === 1)
346
+ return 'DM';
347
+ if ('name' in channel)
348
+ return channel.name ?? 'unknown';
349
+ return 'unknown';
350
+ }
351
+ /**
352
+ * Stop Discord client
353
+ */
354
+ export async function stopDiscord() {
355
+ if (client) {
356
+ await client.destroy();
357
+ client = null;
358
+ config = null;
359
+ console.log('[Discord] Client stopped');
360
+ }
361
+ }
362
+ /**
363
+ * Get client instance
364
+ */
365
+ export function getClient() {
366
+ return client;
367
+ }
368
+ /**
369
+ * Check if connected
370
+ */
371
+ export function isConnected() {
372
+ return client?.isReady() ?? false;
373
+ }
374
+ // Re-export
375
+ export { Client, Events } from 'discord.js';
376
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/discord/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Event Bus System
3
+ *
4
+ * Simple event system for inter-module communication.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ // Event Bus Implementation
8
+ class KoboldEventBus extends EventEmitter {
9
+ middleware = [];
10
+ // Subscribe to an event
11
+ // @ts-ignore EventEmitter override
12
+ on(event, listener) {
13
+ return super.on(event, listener);
14
+ }
15
+ // Unsubscribe from an event
16
+ // @ts-ignore EventEmitter override
17
+ off(event, listener) {
18
+ return super.off(event, listener);
19
+ }
20
+ // Publish an event - override EventEmitter.emit but return Promise<void>
21
+ // @ts-ignore Return type override
22
+ async emit(type, payload, options = {}) {
23
+ const event = {
24
+ type,
25
+ payload,
26
+ metadata: {
27
+ eventId: crypto.randomUUID(),
28
+ correlationId: options.correlationId,
29
+ causationId: options.causationId,
30
+ timestamp: Date.now(),
31
+ source: options.source ?? 'system',
32
+ tags: options.tags
33
+ },
34
+ timestamp: Date.now(),
35
+ source: options.source ?? 'system'
36
+ };
37
+ // Run middleware
38
+ for (const mw of this.middleware) {
39
+ try {
40
+ await mw(event);
41
+ }
42
+ catch (err) {
43
+ console.error(`Event middleware failed for ${type}:`, err);
44
+ return;
45
+ }
46
+ }
47
+ // Emit using Node's EventEmitter
48
+ super.emit(type, event);
49
+ }
50
+ // Add middleware
51
+ use(middleware) {
52
+ this.middleware.push(middleware);
53
+ }
54
+ }
55
+ // Global event bus instance
56
+ export const eventBus = new KoboldEventBus();
57
+ // Helper to create typed event emitters
58
+ export function createEventEmitter(source) {
59
+ return {
60
+ emit(type, payload, options = {}) {
61
+ return eventBus.emit(type, payload, { ...options, source });
62
+ }
63
+ };
64
+ }
65
+ // Event type guards
66
+ export const isAgentEvent = (type) => type.startsWith('agent.');
67
+ export const isDiscordEvent = (type) => type.startsWith('discord.');
68
+ export const isGatewayEvent = (type) => type.startsWith('gateway.');
69
+ // Event builder for complex payloads
70
+ export class EventBuilder {
71
+ payload = {};
72
+ options = {};
73
+ with(key, value) {
74
+ this.payload[key] = value;
75
+ return this;
76
+ }
77
+ withPayload(payload) {
78
+ Object.assign(this.payload, payload);
79
+ return this;
80
+ }
81
+ withCorrelationId(id) {
82
+ this.options.correlationId = id;
83
+ return this;
84
+ }
85
+ withSource(source) {
86
+ this.options.source = source;
87
+ return this;
88
+ }
89
+ withTags(...tags) {
90
+ this.options.tags = tags;
91
+ return this;
92
+ }
93
+ emit(type) {
94
+ return eventBus.emit(type, this.payload, this.options);
95
+ }
96
+ }
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/event-bus/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Command argument parser for extension handlers
3
+ *
4
+ * The framework passes args as a string, but we want parsed objects.
5
+ * This parser converts string args to objects based on arg definitions.
6
+ */
7
+ /**
8
+ * Parse command args string into an object based on arg definitions.
9
+ *
10
+ * Simple parsing: first N words map to first N args, rest goes to last arg
11
+ *
12
+ * Example:
13
+ * parseArgs("hello world description here", [
14
+ * { name: "title", required: true },
15
+ * { name: "description", required: false }
16
+ * ])
17
+ * // Returns: { title: "hello", description: "world description here" }
18
+ */
19
+ export function parseArgs(argsString, argDefs) {
20
+ const result = {};
21
+ if (!argsString.trim()) {
22
+ // Return all undefined for empty args
23
+ argDefs.forEach(def => {
24
+ result[def.name] = undefined;
25
+ });
26
+ return result;
27
+ }
28
+ const parts = argsString.trim().split(/\s+/);
29
+ const requiredCount = argDefs.filter(d => d.required).length;
30
+ // Check we have at least required args
31
+ if (parts.length < requiredCount) {
32
+ // Not enough args - still map what we have
33
+ }
34
+ // Map parts to args
35
+ // First N-1 required args get single words
36
+ // Last arg gets all remaining words
37
+ for (let i = 0; i < argDefs.length; i++) {
38
+ const def = argDefs[i];
39
+ if (i < parts.length) {
40
+ if (i === argDefs.length - 1) {
41
+ // Last arg gets all remaining words
42
+ result[def.name] = parts.slice(i).join(' ');
43
+ }
44
+ else {
45
+ result[def.name] = parts[i];
46
+ }
47
+ }
48
+ else {
49
+ result[def.name] = undefined;
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+ /**
55
+ * Create a typed args parser for a specific command
56
+ */
57
+ export function createParser(...defs) {
58
+ return (argsString) => parseArgs(argsString, defs);
59
+ }
60
+ // Common arg patterns
61
+ export const CommonArgs = {
62
+ id: { name: "id", description: "Item ID", required: true },
63
+ name: { name: "name", description: "Name", required: true },
64
+ title: { name: "title", description: "Title", required: true },
65
+ description: { name: "description", description: "Description", required: false },
66
+ status: { name: "status", description: "Status", required: true },
67
+ };
68
+ //# sourceMappingURL=command-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-args.js","sourceRoot":"","sources":["../../../src/extensions/command-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkB,EAAE,OAAiB;IAC7D,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,sCAAsC;QACtC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAE7D,uCAAuC;IACvC,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACjC,2CAA2C;IAC7C,CAAC;IAED,oBAAoB;IACpB,2CAA2C;IAC3C,oCAAoC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAEvB,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,oCAAoC;gBACpC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAqB,GAAG,IAAO;IACzD,OAAO,CAAC,UAAkB,EAAc,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,sBAAsB;AACtB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1D,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3D,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9D,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;CACzD,CAAC"}