@hybridaione/hybridclaw 0.1.5

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 (196) hide show
  1. package/.env.example +14 -0
  2. package/.github/workflows/pages.yml +41 -0
  3. package/AGENTS.md +24 -0
  4. package/CHANGELOG.md +113 -0
  5. package/LICENSE +21 -0
  6. package/README.md +226 -0
  7. package/SECURITY.md +67 -0
  8. package/config.example.json +62 -0
  9. package/container/Dockerfile +23 -0
  10. package/container/package-lock.json +246 -0
  11. package/container/package.json +17 -0
  12. package/container/src/hybridai-client.ts +38 -0
  13. package/container/src/index.ts +198 -0
  14. package/container/src/ipc.ts +37 -0
  15. package/container/src/tools.ts +1008 -0
  16. package/container/src/types.ts +74 -0
  17. package/container/src/web-fetch.ts +389 -0
  18. package/container/tsconfig.json +16 -0
  19. package/dist/agent.d.ts +3 -0
  20. package/dist/agent.d.ts.map +1 -0
  21. package/dist/agent.js +21 -0
  22. package/dist/agent.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +32 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +38 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +107 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/container-runner.d.ts +11 -0
  32. package/dist/container-runner.d.ts.map +1 -0
  33. package/dist/container-runner.js +246 -0
  34. package/dist/container-runner.js.map +1 -0
  35. package/dist/conversation.d.ts +18 -0
  36. package/dist/conversation.d.ts.map +1 -0
  37. package/dist/conversation.js +29 -0
  38. package/dist/conversation.js.map +1 -0
  39. package/dist/db.d.ts +29 -0
  40. package/dist/db.d.ts.map +1 -0
  41. package/dist/db.js +205 -0
  42. package/dist/db.js.map +1 -0
  43. package/dist/discord.d.ts +17 -0
  44. package/dist/discord.d.ts.map +1 -0
  45. package/dist/discord.js +115 -0
  46. package/dist/discord.js.map +1 -0
  47. package/dist/env.d.ts +6 -0
  48. package/dist/env.d.ts.map +1 -0
  49. package/dist/env.js +36 -0
  50. package/dist/env.js.map +1 -0
  51. package/dist/gateway-client.d.ts +8 -0
  52. package/dist/gateway-client.d.ts.map +1 -0
  53. package/dist/gateway-client.js +57 -0
  54. package/dist/gateway-client.js.map +1 -0
  55. package/dist/gateway-service.d.ts +23 -0
  56. package/dist/gateway-service.d.ts.map +1 -0
  57. package/dist/gateway-service.js +360 -0
  58. package/dist/gateway-service.js.map +1 -0
  59. package/dist/gateway-types.d.ts +40 -0
  60. package/dist/gateway-types.d.ts.map +1 -0
  61. package/dist/gateway-types.js +6 -0
  62. package/dist/gateway-types.js.map +1 -0
  63. package/dist/gateway.d.ts +2 -0
  64. package/dist/gateway.d.ts.map +1 -0
  65. package/dist/gateway.js +138 -0
  66. package/dist/gateway.js.map +1 -0
  67. package/dist/hatch.d.ts +7 -0
  68. package/dist/hatch.d.ts.map +1 -0
  69. package/dist/hatch.js +99 -0
  70. package/dist/hatch.js.map +1 -0
  71. package/dist/health.d.ts +2 -0
  72. package/dist/health.d.ts.map +1 -0
  73. package/dist/health.js +169 -0
  74. package/dist/health.js.map +1 -0
  75. package/dist/heartbeat.d.ts +3 -0
  76. package/dist/heartbeat.d.ts.map +1 -0
  77. package/dist/heartbeat.js +103 -0
  78. package/dist/heartbeat.js.map +1 -0
  79. package/dist/hybridai-bots.d.ts +5 -0
  80. package/dist/hybridai-bots.d.ts.map +1 -0
  81. package/dist/hybridai-bots.js +34 -0
  82. package/dist/hybridai-bots.js.map +1 -0
  83. package/dist/index.d.ts +2 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +60 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/ipc.d.ts +33 -0
  88. package/dist/ipc.d.ts.map +1 -0
  89. package/dist/ipc.js +142 -0
  90. package/dist/ipc.js.map +1 -0
  91. package/dist/logger.d.ts +3 -0
  92. package/dist/logger.d.ts.map +1 -0
  93. package/dist/logger.js +21 -0
  94. package/dist/logger.js.map +1 -0
  95. package/dist/mount-security.d.ts +28 -0
  96. package/dist/mount-security.d.ts.map +1 -0
  97. package/dist/mount-security.js +187 -0
  98. package/dist/mount-security.js.map +1 -0
  99. package/dist/onboarding.d.ts +7 -0
  100. package/dist/onboarding.d.ts.map +1 -0
  101. package/dist/onboarding.js +445 -0
  102. package/dist/onboarding.js.map +1 -0
  103. package/dist/prompt-hooks.d.ts +17 -0
  104. package/dist/prompt-hooks.d.ts.map +1 -0
  105. package/dist/prompt-hooks.js +83 -0
  106. package/dist/prompt-hooks.js.map +1 -0
  107. package/dist/runtime-config.d.ts +78 -0
  108. package/dist/runtime-config.d.ts.map +1 -0
  109. package/dist/runtime-config.js +471 -0
  110. package/dist/runtime-config.js.map +1 -0
  111. package/dist/scheduled-task-runner.d.ts +11 -0
  112. package/dist/scheduled-task-runner.d.ts.map +1 -0
  113. package/dist/scheduled-task-runner.js +16 -0
  114. package/dist/scheduled-task-runner.js.map +1 -0
  115. package/dist/scheduler.d.ts +11 -0
  116. package/dist/scheduler.d.ts.map +1 -0
  117. package/dist/scheduler.js +165 -0
  118. package/dist/scheduler.js.map +1 -0
  119. package/dist/session-maintenance.d.ts +9 -0
  120. package/dist/session-maintenance.d.ts.map +1 -0
  121. package/dist/session-maintenance.js +168 -0
  122. package/dist/session-maintenance.js.map +1 -0
  123. package/dist/session-transcripts.d.ts +11 -0
  124. package/dist/session-transcripts.d.ts.map +1 -0
  125. package/dist/session-transcripts.js +32 -0
  126. package/dist/session-transcripts.js.map +1 -0
  127. package/dist/side-effects.d.ts +3 -0
  128. package/dist/side-effects.d.ts.map +1 -0
  129. package/dist/side-effects.js +30 -0
  130. package/dist/side-effects.js.map +1 -0
  131. package/dist/skills.d.ts +32 -0
  132. package/dist/skills.d.ts.map +1 -0
  133. package/dist/skills.js +376 -0
  134. package/dist/skills.js.map +1 -0
  135. package/dist/tui.d.ts +2 -0
  136. package/dist/tui.d.ts.map +1 -0
  137. package/dist/tui.js +305 -0
  138. package/dist/tui.js.map +1 -0
  139. package/dist/types.d.ts +132 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +3 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/workspace.d.ts +25 -0
  144. package/dist/workspace.d.ts.map +1 -0
  145. package/dist/workspace.js +154 -0
  146. package/dist/workspace.js.map +1 -0
  147. package/docs/chat.html +929 -0
  148. package/docs/hai_logo_free.png +0 -0
  149. package/docs/hero.png +0 -0
  150. package/docs/index.html +1213 -0
  151. package/package.json +34 -0
  152. package/skills/current-time/SKILL.md +26 -0
  153. package/skills/iss-position/SKILL.md +46 -0
  154. package/skills/iss-position/agents/openai.yaml +3 -0
  155. package/skills/iss-position/scripts/get_iss_position.py +107 -0
  156. package/skills/repo-orientation/SKILL.md +74 -0
  157. package/src/agent.ts +35 -0
  158. package/src/cli.ts +35 -0
  159. package/src/config.ts +137 -0
  160. package/src/container-runner.ts +305 -0
  161. package/src/conversation.ts +49 -0
  162. package/src/db.ts +290 -0
  163. package/src/discord.ts +156 -0
  164. package/src/env.ts +36 -0
  165. package/src/gateway-client.ts +73 -0
  166. package/src/gateway-service.ts +456 -0
  167. package/src/gateway-types.ts +47 -0
  168. package/src/gateway.ts +199 -0
  169. package/src/health.ts +189 -0
  170. package/src/heartbeat.ts +121 -0
  171. package/src/hybridai-bots.ts +48 -0
  172. package/src/ipc.ts +163 -0
  173. package/src/logger.ts +26 -0
  174. package/src/mount-security.ts +216 -0
  175. package/src/onboarding.ts +569 -0
  176. package/src/prompt-hooks.ts +113 -0
  177. package/src/runtime-config.ts +588 -0
  178. package/src/scheduled-task-runner.ts +26 -0
  179. package/src/scheduler.ts +196 -0
  180. package/src/session-maintenance.ts +263 -0
  181. package/src/session-transcripts.ts +45 -0
  182. package/src/side-effects.ts +41 -0
  183. package/src/skills.ts +429 -0
  184. package/src/tui.ts +327 -0
  185. package/src/types.ts +135 -0
  186. package/src/workspace.ts +171 -0
  187. package/templates/AGENTS.md +104 -0
  188. package/templates/BOOT.md +3 -0
  189. package/templates/BOOTSTRAP.md +54 -0
  190. package/templates/HEARTBEAT.md +5 -0
  191. package/templates/IDENTITY.md +18 -0
  192. package/templates/MEMORY.md +19 -0
  193. package/templates/SOUL.md +36 -0
  194. package/templates/TOOLS.md +22 -0
  195. package/templates/USER.md +17 -0
  196. package/tsconfig.json +18 -0
@@ -0,0 +1,360 @@
1
+ import { CronExpressionParser } from 'cron-parser';
2
+ import { APP_VERSION, HYBRIDAI_CHATBOT_ID, HYBRIDAI_ENABLE_RAG, HYBRIDAI_MODEL, HYBRIDAI_MODELS, } from './config.js';
3
+ import { runAgent } from './agent.js';
4
+ import { getActiveContainerCount } from './container-runner.js';
5
+ import { clearSessionHistory, createTask, deleteTask, getAllSessions, getConversationHistory, getOrCreateSession, getRecentAudit, getSessionCount, getTasksForSession, logAudit, storeMessage, toggleTask, updateSessionChatbot, updateSessionModel, updateSessionRag, } from './db.js';
6
+ import { fetchHybridAIBots } from './hybridai-bots.js';
7
+ import { logger } from './logger.js';
8
+ import { rearmScheduler } from './scheduler.js';
9
+ import { maybeCompactSession } from './session-maintenance.js';
10
+ import { appendSessionTranscript } from './session-transcripts.js';
11
+ import { processSideEffects } from './side-effects.js';
12
+ import { expandSkillInvocation } from './skills.js';
13
+ import { renderGatewayCommand, } from './gateway-types.js';
14
+ import { ensureBootstrapFiles } from './workspace.js';
15
+ import { buildConversationContext } from './conversation.js';
16
+ import { runIsolatedScheduledTask } from './scheduled-task-runner.js';
17
+ const BOT_CACHE_TTL = 300_000; // 5 minutes
18
+ const MAX_HISTORY_MESSAGES = 40;
19
+ export { renderGatewayCommand };
20
+ function formatUptime(seconds) {
21
+ const d = Math.floor(seconds / 86400);
22
+ const h = Math.floor((seconds % 86400) / 3600);
23
+ const m = Math.floor((seconds % 3600) / 60);
24
+ const s = seconds % 60;
25
+ const parts = [];
26
+ if (d > 0)
27
+ parts.push(`${d}d`);
28
+ if (h > 0)
29
+ parts.push(`${h}h`);
30
+ if (m > 0)
31
+ parts.push(`${m}m`);
32
+ parts.push(`${s}s`);
33
+ return parts.join(' ');
34
+ }
35
+ function parseIntOrNull(raw) {
36
+ if (!raw)
37
+ return null;
38
+ const parsed = parseInt(raw, 10);
39
+ return Number.isNaN(parsed) ? null : parsed;
40
+ }
41
+ function badCommand(title, text) {
42
+ return { kind: 'error', title, text };
43
+ }
44
+ function infoCommand(title, text) {
45
+ return { kind: 'info', title, text };
46
+ }
47
+ function plainCommand(text) {
48
+ return { kind: 'plain', text };
49
+ }
50
+ export function getGatewayStatus() {
51
+ return {
52
+ status: 'ok',
53
+ version: APP_VERSION,
54
+ uptime: Math.floor(process.uptime()),
55
+ sessions: getSessionCount(),
56
+ activeContainers: getActiveContainerCount(),
57
+ defaultModel: HYBRIDAI_MODEL,
58
+ ragDefault: HYBRIDAI_ENABLE_RAG,
59
+ timestamp: new Date().toISOString(),
60
+ };
61
+ }
62
+ export function getGatewayHistory(sessionId, limit = MAX_HISTORY_MESSAGES) {
63
+ return getConversationHistory(sessionId, Math.max(1, Math.min(limit, 200))).reverse();
64
+ }
65
+ export async function handleGatewayMessage(req) {
66
+ const startedAt = Date.now();
67
+ const session = getOrCreateSession(req.sessionId, req.guildId, req.channelId);
68
+ const chatbotId = req.chatbotId ?? session.chatbot_id ?? HYBRIDAI_CHATBOT_ID;
69
+ const enableRag = req.enableRag ?? session.enable_rag === 1;
70
+ const model = req.model ?? session.model ?? HYBRIDAI_MODEL;
71
+ if (!chatbotId) {
72
+ return {
73
+ status: 'error',
74
+ result: null,
75
+ toolsUsed: [],
76
+ error: 'No chatbot configured. Set `HYBRIDAI_CHATBOT_ID` or select a bot for this session.',
77
+ };
78
+ }
79
+ const agentId = chatbotId || 'default';
80
+ ensureBootstrapFiles(agentId);
81
+ const history = getConversationHistory(req.sessionId, MAX_HISTORY_MESSAGES);
82
+ const { messages, skills } = buildConversationContext({
83
+ agentId,
84
+ sessionSummary: session.session_summary,
85
+ history,
86
+ });
87
+ messages.push({
88
+ role: 'user',
89
+ content: expandSkillInvocation(req.content, skills),
90
+ });
91
+ try {
92
+ const scheduledTasks = getTasksForSession(req.sessionId);
93
+ const output = await runAgent(req.sessionId, messages, chatbotId, enableRag, model, agentId, req.channelId, scheduledTasks, undefined, req.onToolProgress, req.abortSignal);
94
+ processSideEffects(output, req.sessionId, req.channelId);
95
+ if (output.status === 'error') {
96
+ return {
97
+ status: 'error',
98
+ result: null,
99
+ toolsUsed: output.toolsUsed || [],
100
+ error: output.error || 'Unknown agent error.',
101
+ };
102
+ }
103
+ const resultText = output.result || 'No response from agent.';
104
+ storeMessage(req.sessionId, req.userId, req.username, 'user', req.content);
105
+ storeMessage(req.sessionId, 'assistant', null, 'assistant', resultText);
106
+ appendSessionTranscript(agentId, {
107
+ sessionId: req.sessionId,
108
+ channelId: req.channelId,
109
+ role: 'user',
110
+ userId: req.userId,
111
+ username: req.username,
112
+ content: req.content,
113
+ });
114
+ appendSessionTranscript(agentId, {
115
+ sessionId: req.sessionId,
116
+ channelId: req.channelId,
117
+ role: 'assistant',
118
+ userId: 'assistant',
119
+ username: null,
120
+ content: resultText,
121
+ });
122
+ void maybeCompactSession({
123
+ sessionId: req.sessionId,
124
+ agentId,
125
+ chatbotId,
126
+ enableRag,
127
+ model,
128
+ channelId: req.channelId,
129
+ }).catch((err) => {
130
+ logger.warn({ sessionId: req.sessionId, err }, 'Background session compaction failed');
131
+ });
132
+ return {
133
+ status: 'success',
134
+ result: resultText,
135
+ toolsUsed: output.toolsUsed || [],
136
+ };
137
+ }
138
+ catch (err) {
139
+ const errorMsg = err instanceof Error ? err.message : String(err);
140
+ logAudit('error', req.sessionId, { error: errorMsg }, Date.now() - startedAt);
141
+ logger.error({ sessionId: req.sessionId, err }, 'Gateway message handling failed');
142
+ return {
143
+ status: 'error',
144
+ result: null,
145
+ toolsUsed: [],
146
+ error: errorMsg,
147
+ };
148
+ }
149
+ }
150
+ export async function runGatewayScheduledTask(origSessionId, channelId, prompt, taskId, onResult, onError) {
151
+ const session = getOrCreateSession(origSessionId, null, channelId);
152
+ const chatbotId = session.chatbot_id || HYBRIDAI_CHATBOT_ID;
153
+ const model = session.model || HYBRIDAI_MODEL;
154
+ const agentId = chatbotId || 'default';
155
+ if (!chatbotId)
156
+ return;
157
+ await runIsolatedScheduledTask({
158
+ taskId,
159
+ prompt,
160
+ channelId,
161
+ chatbotId,
162
+ model,
163
+ agentId,
164
+ onResult,
165
+ onError,
166
+ });
167
+ }
168
+ export async function handleGatewayCommand(req) {
169
+ const cmd = (req.args[0] || '').toLowerCase();
170
+ const session = getOrCreateSession(req.sessionId, req.guildId, req.channelId);
171
+ switch (cmd) {
172
+ case 'help': {
173
+ const help = [
174
+ '`bot list` — List available bots',
175
+ '`bot set <id|name>` — Set chatbot for this session',
176
+ '`bot info` — Show current chatbot settings',
177
+ '`model list` — List available models',
178
+ '`model set <name>` — Set model for this session',
179
+ '`model info` — Show current model',
180
+ '`rag [on|off]` — Toggle or set RAG mode',
181
+ '`clear` — Clear session history',
182
+ '`status` — Show runtime status',
183
+ '`sessions` — List active sessions',
184
+ '`audit [n]` — Show recent audit entries',
185
+ '`schedule add "<cron>" <prompt>` — Add scheduled task',
186
+ '`schedule list` — List scheduled tasks',
187
+ '`schedule remove <id>` — Remove a task',
188
+ '`schedule toggle <id>` — Enable/disable a task',
189
+ ];
190
+ return infoCommand('HybridClaw Commands', help.join('\n'));
191
+ }
192
+ case 'bot': {
193
+ const sub = req.args[1]?.toLowerCase();
194
+ if (sub === 'list') {
195
+ try {
196
+ const bots = await fetchHybridAIBots({ cacheTtlMs: BOT_CACHE_TTL });
197
+ if (bots.length === 0)
198
+ return plainCommand('No bots available.');
199
+ const list = bots.map((b) => `• ${b.name} (${b.id})${b.description ? ` — ${b.description}` : ''}`).join('\n');
200
+ return infoCommand('Available Bots', list);
201
+ }
202
+ catch (err) {
203
+ return badCommand('Error', `Failed to fetch bots: ${err instanceof Error ? err.message : String(err)}`);
204
+ }
205
+ }
206
+ if (sub === 'set') {
207
+ const requested = req.args.slice(2).join(' ').trim();
208
+ if (!requested)
209
+ return badCommand('Usage', 'Usage: `bot set <id|name>`');
210
+ let resolvedBotId = requested;
211
+ try {
212
+ const bots = await fetchHybridAIBots({ cacheTtlMs: BOT_CACHE_TTL });
213
+ const matched = bots.find((b) => b.id === requested || b.name.toLowerCase() === requested.toLowerCase());
214
+ if (matched)
215
+ resolvedBotId = matched.id;
216
+ }
217
+ catch {
218
+ // keep user-supplied value when lookup fails
219
+ }
220
+ updateSessionChatbot(session.id, resolvedBotId);
221
+ return plainCommand(`Chatbot set to \`${resolvedBotId}\` for this session.`);
222
+ }
223
+ if (sub === 'info') {
224
+ const botId = session.chatbot_id || HYBRIDAI_CHATBOT_ID || 'Not set';
225
+ let botLabel = botId;
226
+ try {
227
+ const bots = await fetchHybridAIBots({ cacheTtlMs: BOT_CACHE_TTL });
228
+ const bot = bots.find((b) => b.id === botId);
229
+ if (bot)
230
+ botLabel = `${bot.name} (${bot.id})`;
231
+ }
232
+ catch {
233
+ // keep ID fallback
234
+ }
235
+ const model = session.model || HYBRIDAI_MODEL;
236
+ const ragStatus = session.enable_rag ? 'Enabled' : 'Disabled';
237
+ return infoCommand('Bot Info', `Chatbot: ${botLabel}\nModel: ${model}\nRAG: ${ragStatus}`);
238
+ }
239
+ return badCommand('Usage', 'Usage: `bot list|set <id|name>|info`');
240
+ }
241
+ case 'model': {
242
+ const sub = req.args[1]?.toLowerCase();
243
+ if (sub === 'list') {
244
+ const current = session.model || HYBRIDAI_MODEL;
245
+ const list = HYBRIDAI_MODELS.map((m) => m === current ? `${m} (current)` : m).join('\n');
246
+ return infoCommand('Available Models', list);
247
+ }
248
+ if (sub === 'set') {
249
+ const modelName = req.args[2];
250
+ if (!modelName)
251
+ return badCommand('Usage', 'Usage: `model set <name>`');
252
+ if (HYBRIDAI_MODELS.length > 0 && !HYBRIDAI_MODELS.includes(modelName)) {
253
+ return badCommand('Unknown Model', `\`${modelName}\` is not in the available models list.`);
254
+ }
255
+ updateSessionModel(session.id, modelName);
256
+ return plainCommand(`Model set to \`${modelName}\` for this session.`);
257
+ }
258
+ if (sub === 'info') {
259
+ const current = session.model || HYBRIDAI_MODEL;
260
+ return infoCommand('Model Info', `Current model: ${current}\nDefault model: ${HYBRIDAI_MODEL}`);
261
+ }
262
+ return badCommand('Usage', 'Usage: `model list|set <name>|info`');
263
+ }
264
+ case 'rag': {
265
+ const sub = req.args[1]?.toLowerCase();
266
+ if (sub === 'on' || sub === 'off') {
267
+ updateSessionRag(session.id, sub === 'on');
268
+ return plainCommand(`RAG ${sub === 'on' ? 'enabled' : 'disabled'} for this session.`);
269
+ }
270
+ if (!sub) {
271
+ const nextEnabled = session.enable_rag === 0;
272
+ updateSessionRag(session.id, nextEnabled);
273
+ return plainCommand(`RAG ${nextEnabled ? 'enabled' : 'disabled'} for this session.`);
274
+ }
275
+ return badCommand('Usage', 'Usage: `rag [on|off]`');
276
+ }
277
+ case 'clear': {
278
+ const deleted = clearSessionHistory(session.id);
279
+ return infoCommand('Session Cleared', `Deleted ${deleted} messages. Workspace files preserved.`);
280
+ }
281
+ case 'status': {
282
+ const status = getGatewayStatus();
283
+ const lines = [
284
+ `Uptime: ${formatUptime(status.uptime)}`,
285
+ `Sessions: ${status.sessions}`,
286
+ `Active Containers: ${status.activeContainers}`,
287
+ `Default Model: ${status.defaultModel}`,
288
+ `RAG Default: ${status.ragDefault ? 'On' : 'Off'}`,
289
+ ];
290
+ return infoCommand('Status', lines.join('\n'));
291
+ }
292
+ case 'sessions': {
293
+ const sessions = getAllSessions();
294
+ if (sessions.length === 0)
295
+ return plainCommand('No active sessions.');
296
+ const list = sessions.slice(0, 20).map((s) => `${s.id} — ${s.message_count} msgs, last active ${s.last_active}`).join('\n');
297
+ return infoCommand('Sessions', list);
298
+ }
299
+ case 'audit': {
300
+ const parsedLimit = parseIntOrNull(req.args[1]);
301
+ const limit = Math.min(parsedLimit ?? 10, 25);
302
+ const entries = getRecentAudit(limit);
303
+ if (entries.length === 0)
304
+ return plainCommand('No audit entries.');
305
+ const list = entries.map((entry) => `${entry.created_at} ${entry.event}${entry.duration_ms ? ` (${entry.duration_ms}ms)` : ''}`).join('\n');
306
+ return infoCommand('Recent Audit', list);
307
+ }
308
+ case 'schedule': {
309
+ const sub = req.args[1]?.toLowerCase();
310
+ if (sub === 'add') {
311
+ const rest = req.args.slice(2).join(' ');
312
+ const cronMatch = rest.match(/^"([^"]+)"\s+(.+)$/);
313
+ if (!cronMatch) {
314
+ return badCommand('Usage', 'Usage: `schedule add "<cron>" <prompt>`');
315
+ }
316
+ const [, cronExpr, prompt] = cronMatch;
317
+ try {
318
+ CronExpressionParser.parse(cronExpr);
319
+ }
320
+ catch {
321
+ return badCommand('Invalid Cron', `\`${cronExpr}\` is not a valid cron expression.`);
322
+ }
323
+ const taskId = createTask(session.id, req.channelId, cronExpr, prompt);
324
+ rearmScheduler();
325
+ return plainCommand(`Task #${taskId} created: \`${cronExpr}\` — ${prompt}`);
326
+ }
327
+ if (sub === 'list') {
328
+ const tasks = getTasksForSession(session.id);
329
+ if (tasks.length === 0)
330
+ return plainCommand('No scheduled tasks.');
331
+ const list = tasks.map((task) => `#${task.id} ${task.enabled ? 'enabled' : 'disabled'} \`${task.cron_expr}\` — ${task.prompt.slice(0, 60)}`).join('\n');
332
+ return infoCommand('Scheduled Tasks', list);
333
+ }
334
+ if (sub === 'remove') {
335
+ const taskId = parseIntOrNull(req.args[2]);
336
+ if (!taskId)
337
+ return badCommand('Usage', 'Usage: `schedule remove <id>`');
338
+ deleteTask(taskId);
339
+ rearmScheduler();
340
+ return plainCommand(`Task #${taskId} removed.`);
341
+ }
342
+ if (sub === 'toggle') {
343
+ const taskId = parseIntOrNull(req.args[2]);
344
+ if (!taskId)
345
+ return badCommand('Usage', 'Usage: `schedule toggle <id>`');
346
+ const tasks = getTasksForSession(session.id);
347
+ const task = tasks.find((t) => t.id === taskId);
348
+ if (!task)
349
+ return badCommand('Not Found', `Task #${taskId} was not found in this session.`);
350
+ toggleTask(taskId, !Boolean(task.enabled));
351
+ rearmScheduler();
352
+ return plainCommand(`Task #${taskId} ${task.enabled ? 'disabled' : 'enabled'}.`);
353
+ }
354
+ return badCommand('Usage', 'Usage: `schedule add|list|remove|toggle`');
355
+ }
356
+ default:
357
+ return badCommand('Unknown Command', `Unknown command: \`${cmd || '(empty)'}\`.`);
358
+ }
359
+ }
360
+ //# sourceMappingURL=gateway-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-service.js","sourceRoot":"","sources":["../src/gateway-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface GatewayCommandResult {
2
+ kind: 'plain' | 'info' | 'error';
3
+ title?: string;
4
+ text: string;
5
+ }
6
+ export interface GatewayChatResult {
7
+ status: 'success' | 'error';
8
+ result: string | null;
9
+ toolsUsed: string[];
10
+ error?: string;
11
+ }
12
+ export interface GatewayChatRequestBody {
13
+ sessionId: string;
14
+ guildId: string | null;
15
+ channelId: string;
16
+ userId: string;
17
+ username: string | null;
18
+ content: string;
19
+ chatbotId?: string | null;
20
+ model?: string | null;
21
+ enableRag?: boolean;
22
+ }
23
+ export interface GatewayCommandRequest {
24
+ sessionId: string;
25
+ guildId: string | null;
26
+ channelId: string;
27
+ args: string[];
28
+ }
29
+ export interface GatewayStatus {
30
+ status: 'ok';
31
+ version: string;
32
+ uptime: number;
33
+ sessions: number;
34
+ activeContainers: number;
35
+ defaultModel: string;
36
+ ragDefault: boolean;
37
+ timestamp: string;
38
+ }
39
+ export declare function renderGatewayCommand(result: GatewayCommandResult): string;
40
+ //# sourceMappingURL=gateway-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-types.d.ts","sourceRoot":"","sources":["../src/gateway-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAGzE"}
@@ -0,0 +1,6 @@
1
+ export function renderGatewayCommand(result) {
2
+ if (!result.title)
3
+ return result.text;
4
+ return `${result.title}\n${result.text}`;
5
+ }
6
+ //# sourceMappingURL=gateway-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-types.js","sourceRoot":"","sources":["../src/gateway-types.ts"],"names":[],"mappings":"AA2CA,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACtC,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ import { DISCORD_TOKEN, HEARTBEAT_CHANNEL, HEARTBEAT_INTERVAL, HYBRIDAI_CHATBOT_ID, onConfigChange, } from './config.js';
2
+ import { stopAllContainers } from './container-runner.js';
3
+ import { initDatabase } from './db.js';
4
+ import { getGatewayStatus, handleGatewayCommand, handleGatewayMessage, renderGatewayCommand, runGatewayScheduledTask, } from './gateway-service.js';
5
+ import { startHealthServer } from './health.js';
6
+ import { startHeartbeat, stopHeartbeat } from './heartbeat.js';
7
+ import { logger } from './logger.js';
8
+ import { startScheduler, stopScheduler } from './scheduler.js';
9
+ import { buildResponseText, formatError, formatInfo, initDiscord, sendToChannel, } from './discord.js';
10
+ let detachConfigListener = null;
11
+ function isDiscordChannelId(channelId) {
12
+ return /^\d{16,22}$/.test(channelId);
13
+ }
14
+ async function deliverProactiveMessage(channelId, text, source) {
15
+ if (!DISCORD_TOKEN || !isDiscordChannelId(channelId)) {
16
+ logger.info({ source, channelId, text }, 'Proactive message (no Discord delivery)');
17
+ return;
18
+ }
19
+ try {
20
+ await sendToChannel(channelId, text);
21
+ }
22
+ catch (error) {
23
+ logger.warn({ source, channelId, error }, 'Failed to send proactive message to Discord channel');
24
+ logger.info({ source, channelId, text }, 'Proactive message fallback');
25
+ }
26
+ }
27
+ async function startDiscordIntegration() {
28
+ if (!DISCORD_TOKEN) {
29
+ logger.info('DISCORD_TOKEN not set; Discord integration disabled');
30
+ return;
31
+ }
32
+ initDiscord(async (sessionId, guildId, channelId, userId, username, content, reply) => {
33
+ try {
34
+ const result = await handleGatewayMessage({
35
+ sessionId,
36
+ guildId,
37
+ channelId,
38
+ userId,
39
+ username,
40
+ content,
41
+ });
42
+ if (result.status === 'error') {
43
+ await reply(formatError('Agent Error', result.error || 'Unknown error'));
44
+ return;
45
+ }
46
+ await reply(buildResponseText(result.result || 'No response from agent.', result.toolsUsed));
47
+ }
48
+ catch (error) {
49
+ const text = error instanceof Error ? error.message : String(error);
50
+ logger.error({ error, sessionId, channelId }, 'Discord message handling failed');
51
+ await reply(formatError('Gateway Error', text));
52
+ }
53
+ }, async (sessionId, guildId, channelId, args, reply) => {
54
+ try {
55
+ const result = await handleGatewayCommand({
56
+ sessionId,
57
+ guildId,
58
+ channelId,
59
+ args,
60
+ });
61
+ if (result.kind === 'error') {
62
+ await reply(formatError(result.title || 'Error', result.text));
63
+ return;
64
+ }
65
+ if (result.kind === 'info') {
66
+ await reply(formatInfo(result.title || 'Info', result.text));
67
+ return;
68
+ }
69
+ await reply(renderGatewayCommand(result));
70
+ }
71
+ catch (error) {
72
+ const text = error instanceof Error ? error.message : String(error);
73
+ logger.error({ error, sessionId, channelId, args }, 'Discord command handling failed');
74
+ await reply(formatError('Gateway Error', text));
75
+ }
76
+ });
77
+ logger.info('Discord integration started inside gateway');
78
+ }
79
+ function setupShutdown() {
80
+ const shutdown = () => {
81
+ logger.info('Shutting down gateway...');
82
+ if (detachConfigListener) {
83
+ detachConfigListener();
84
+ detachConfigListener = null;
85
+ }
86
+ stopHeartbeat();
87
+ stopAllContainers();
88
+ stopScheduler();
89
+ process.exit(0);
90
+ };
91
+ process.on('SIGINT', shutdown);
92
+ process.on('SIGTERM', shutdown);
93
+ }
94
+ async function runScheduledTask(sessionId, channelId, prompt, taskId) {
95
+ await runGatewayScheduledTask(sessionId, channelId, prompt, taskId, async (result) => {
96
+ await deliverProactiveMessage(channelId, result, `schedule:${taskId}`);
97
+ logger.info({ taskId, channelId, result }, 'Scheduled task completed');
98
+ }, (error) => {
99
+ logger.error({ taskId, channelId, error }, 'Scheduled task failed');
100
+ });
101
+ }
102
+ function startOrRestartHeartbeat() {
103
+ stopHeartbeat();
104
+ const agentId = HYBRIDAI_CHATBOT_ID || 'default';
105
+ startHeartbeat(agentId, HEARTBEAT_INTERVAL, (text) => {
106
+ const channelId = HEARTBEAT_CHANNEL || 'heartbeat';
107
+ void deliverProactiveMessage(channelId, text, 'heartbeat');
108
+ logger.info({ text }, 'Heartbeat message');
109
+ });
110
+ }
111
+ async function main() {
112
+ logger.info('Starting HybridClaw gateway');
113
+ initDatabase();
114
+ startHealthServer();
115
+ setupShutdown();
116
+ await startDiscordIntegration();
117
+ startOrRestartHeartbeat();
118
+ detachConfigListener = onConfigChange((next, prev) => {
119
+ const shouldRestart = next.hybridai.defaultChatbotId !== prev.hybridai.defaultChatbotId
120
+ || next.heartbeat.intervalMs !== prev.heartbeat.intervalMs
121
+ || next.heartbeat.enabled !== prev.heartbeat.enabled;
122
+ if (!shouldRestart)
123
+ return;
124
+ logger.info({
125
+ heartbeatEnabled: next.heartbeat.enabled,
126
+ heartbeatIntervalMs: next.heartbeat.intervalMs,
127
+ heartbeatAgentId: next.hybridai.defaultChatbotId || 'default',
128
+ }, 'Config changed, restarting heartbeat');
129
+ startOrRestartHeartbeat();
130
+ });
131
+ startScheduler(runScheduledTask);
132
+ logger.info({ ...getGatewayStatus(), discord: !!DISCORD_TOKEN }, 'HybridClaw gateway started');
133
+ }
134
+ main().catch((err) => {
135
+ logger.fatal({ err }, 'Failed to start gateway');
136
+ process.exit(1);
137
+ });
138
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hatching process — first-run onboarding where the agent "becomes hybrid".
3
+ * Asks the user questions for USER.md and lets the agent define IDENTITY.md.
4
+ */
5
+ import readline from 'readline';
6
+ export declare function runHatching(agentId: string, rl: readline.Interface): Promise<void>;
7
+ //# sourceMappingURL=hatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hatch.d.ts","sourceRoot":"","sources":["../src/hatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAgChC,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFxF"}