@cereworker/cli 26.325.20 → 26.325.22

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.
@@ -0,0 +1,299 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ export const SLASH_COMMANDS = [
5
+ { name: '/agents', hint: 'list sub-agents' },
6
+ { name: '/approve', hint: 'approve pairing code' },
7
+ { name: '/auth', hint: 'authenticate provider' },
8
+ { name: '/auto', hint: 'toggle auto mode' },
9
+ { name: '/channels', hint: 'list channels' },
10
+ { name: '/clear', hint: 'new conversation' },
11
+ { name: '/config', hint: 'show config' },
12
+ { name: '/conversations', hint: 'list conversations' },
13
+ { name: '/exit', hint: 'quit' },
14
+ { name: '/finetune', hint: 'fine-tune controls' },
15
+ { name: '/help', hint: 'show help' },
16
+ { name: '/memory', hint: 'show memory' },
17
+ { name: '/model', hint: 'switch model' },
18
+ { name: '/nodes', hint: 'gateway nodes' },
19
+ { name: '/pairing', hint: 'list pairings' },
20
+ { name: '/provider', hint: 'switch provider' },
21
+ { name: '/quit', hint: 'quit' },
22
+ { name: '/resume', hint: 'resume conversation' },
23
+ { name: '/skills', hint: 'list skills' },
24
+ { name: '/stop', hint: 'emergency stop' },
25
+ { name: '/task', hint: 'run task' },
26
+ ];
27
+ /** Parse a raw message into command + args. Returns null if not a slash command. */
28
+ export function parseCommand(text) {
29
+ const trimmed = text.trim();
30
+ if (!trimmed.startsWith('/'))
31
+ return null;
32
+ const spaceIdx = trimmed.indexOf(' ');
33
+ const command = spaceIdx === -1 ? trimmed.slice(1) : trimmed.slice(1, spaceIdx);
34
+ const args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);
35
+ return { command, args };
36
+ }
37
+ /**
38
+ * Handle a slash command. Returns a result that both TUI and channels can use.
39
+ * TUI-only commands return { type: 'tuiOnly' }.
40
+ */
41
+ export function handleSlashCommand(command, args, ctx) {
42
+ const { orchestrator, cerebrum, channelManager, skillRegistry, config, service } = ctx;
43
+ switch (command) {
44
+ // --- TUI-only commands ---
45
+ case 'quit':
46
+ case 'exit':
47
+ case 'clear':
48
+ case 'resume':
49
+ case 'approve':
50
+ case 'pairing':
51
+ case 'auth':
52
+ return { type: 'tuiOnly' };
53
+ // --- Shared commands ---
54
+ case 'help':
55
+ return {
56
+ type: 'message',
57
+ text: `Available commands:
58
+ /model [name] Show or switch the current model
59
+ /provider [name] Show or switch the current provider
60
+ /agents Show sub-agent summary
61
+ /memory Show MEMORY.md contents
62
+ /skills List loaded skills
63
+ /config Show current configuration
64
+ /conversations List past conversations
65
+ /channels Show channel status
66
+ /nodes Show connected nodes
67
+ /auto [on|off] Toggle auto mode
68
+ /finetune [sub] Fine-tuning: start, status, config, history
69
+ /task [sub] Recurring tasks: list, run <id>, history <id>
70
+ /stop Emergency stop
71
+ /clear Start a new conversation (TUI only)
72
+ /resume <id> Resume a conversation (TUI only)
73
+ /help Show this help
74
+ /quit Exit (TUI only)`,
75
+ };
76
+ case 'model':
77
+ if (args.trim()) {
78
+ cerebrum.setModel(args.trim());
79
+ return { type: 'message', text: `Model switched to: ${args.trim()}` };
80
+ }
81
+ return { type: 'message', text: `Current model: ${ctx.currentModel}` };
82
+ case 'provider':
83
+ if (args.trim()) {
84
+ cerebrum.setProvider(args.trim());
85
+ return { type: 'message', text: `Provider switched to: ${args.trim()}` };
86
+ }
87
+ return { type: 'message', text: `Current provider: ${ctx.currentProvider}` };
88
+ case 'auto': {
89
+ const arg = args.trim().toLowerCase();
90
+ if (arg === 'on') {
91
+ orchestrator.setAutoMode(true);
92
+ return { type: 'message', text: 'Auto mode ENABLED. Commands execute without approval.' };
93
+ }
94
+ else if (arg === 'off') {
95
+ orchestrator.setAutoMode(false);
96
+ return { type: 'message', text: 'Auto mode DISABLED. Unknown commands require approval.' };
97
+ }
98
+ return { type: 'message', text: `Auto mode: ${ctx.autoMode ? 'ON' : 'OFF'}. Usage: /auto [on|off]` };
99
+ }
100
+ case 'channels': {
101
+ const connected = channelManager.listConnected();
102
+ const all = channelManager.list();
103
+ const info = all.map((ch) => ` ${ch.meta.emoji} ${ch.meta.name}: ${ch.isConnected() ? 'connected' : 'offline'}`).join('\n');
104
+ return { type: 'message', text: `Channels (${connected.length}/${all.length} connected):\n${info || ' (none registered)'}` };
105
+ }
106
+ case 'agents': {
107
+ const mgr = orchestrator.getSubAgentManager();
108
+ if (!mgr)
109
+ return { type: 'message', text: 'Sub-agents are not enabled.' };
110
+ const summary = mgr.getSummary();
111
+ const agents = mgr.listAgents();
112
+ const lines = [`Agents: ${summary.total} total, ${summary.running} running, ${summary.completed} completed, ${summary.failed} failed`];
113
+ for (const a of agents.slice(0, 10)) {
114
+ const elapsed = Math.round((Date.now() - a.spawnedAt) / 1000);
115
+ lines.push(` [${a.status}] ${a.label ?? a.id} - ${a.task.slice(0, 60)} (${elapsed}s)`);
116
+ }
117
+ return { type: 'message', text: lines.join('\n') };
118
+ }
119
+ case 'memory': {
120
+ const memPath = join(config.hippocampus.directory.replace('~', homedir()), 'MEMORY.md');
121
+ try {
122
+ if (existsSync(memPath)) {
123
+ const content = readFileSync(memPath, 'utf-8');
124
+ return { type: 'message', text: `--- MEMORY.md ---\n${content.slice(0, 2000)}` };
125
+ }
126
+ return { type: 'message', text: 'No MEMORY.md found.' };
127
+ }
128
+ catch {
129
+ return { type: 'message', text: 'Failed to read MEMORY.md' };
130
+ }
131
+ }
132
+ case 'skills': {
133
+ const skills = skillRegistry.list();
134
+ if (skills.length === 0)
135
+ return { type: 'message', text: 'No skills loaded.' };
136
+ const lines = skills.map((s) => {
137
+ const emoji = s.metadata?.cereworker?.emoji ?? '';
138
+ return ` ${emoji} ${s.name} - ${s.description}`;
139
+ });
140
+ return { type: 'message', text: `Loaded skills (${skills.length}):\n${lines.join('\n')}` };
141
+ }
142
+ case 'config': {
143
+ const lines = [
144
+ `Provider: ${ctx.currentProvider}`,
145
+ `Model: ${ctx.currentModel}`,
146
+ `Temperature: ${config.cerebrum.temperature}`,
147
+ `Max steps: ${config.cerebrum.maxSteps}`,
148
+ `Cerebellum: ${config.cerebellum.enabled ? 'enabled' : 'disabled'}`,
149
+ `Hippocampus: ${config.hippocampus.enabled ? config.hippocampus.directory : 'disabled'}`,
150
+ `Sub-agents: ${config.subAgents.enabled ? `max ${config.subAgents.maxConcurrent}` : 'disabled'}`,
151
+ `Logging: ${config.logging.level}${config.logging.file ? ` -> ${config.logging.file}` : ''}`,
152
+ ];
153
+ return { type: 'message', text: `Configuration:\n${lines.map((l) => ` ${l}`).join('\n')}` };
154
+ }
155
+ case 'conversations': {
156
+ const store = orchestrator.getConversationStore();
157
+ const convs = store.list().slice(0, 20);
158
+ if (convs.length === 0)
159
+ return { type: 'message', text: 'No conversations found.' };
160
+ const activeId = orchestrator.getActiveConversationId();
161
+ const lines = convs.map((c) => {
162
+ const date = new Date(c.updatedAt).toLocaleString();
163
+ const preview = store.getPreview(c.id)?.slice(0, 50) ?? '(empty)';
164
+ const marker = c.id === activeId ? ' *' : '';
165
+ return ` ${c.id.slice(0, 8)}${marker} | ${date} | ${preview}`;
166
+ });
167
+ return { type: 'message', text: `Conversations (${convs.length}):\n${lines.join('\n')}`, sticky: true };
168
+ }
169
+ case 'nodes': {
170
+ const gwMode = config.gateway.mode;
171
+ if (gwMode === 'gateway' && ctx.gatewayServer) {
172
+ const nodes = ctx.gatewayServer.listNodes();
173
+ if (nodes.length === 0)
174
+ return { type: 'message', text: 'No nodes connected.' };
175
+ const lines = nodes.map((n) => {
176
+ const elapsed = Math.round((Date.now() - n.connectedAt) / 1000);
177
+ return ` ${n.nodeId} (${n.status}, ${n.capabilities.length} tools, ${elapsed}s)`;
178
+ });
179
+ return { type: 'message', text: `Connected nodes (${nodes.length}):\n${lines.join('\n')}` };
180
+ }
181
+ else if (gwMode === 'node' && ctx.gatewayClient) {
182
+ return { type: 'message', text: `Node mode: ${ctx.gatewayClient.isConnected() ? 'connected' : 'disconnected'} to ${config.gateway.gatewayUrl}` };
183
+ }
184
+ return { type: 'message', text: 'Gateway not active. Set gateway.mode in config.' };
185
+ }
186
+ case 'stop':
187
+ orchestrator.emergencyStop();
188
+ ctx.gatewayServer?.emergencyStopAll();
189
+ return { type: 'message', text: 'Emergency stop triggered. All operations aborted.' };
190
+ case 'finetune': {
191
+ const ftArgs = args.trim().split(/\s+/);
192
+ const ftSub = ftArgs[0] || '';
193
+ if (ftSub === 'start') {
194
+ return {
195
+ type: 'async',
196
+ promise: orchestrator.triggerFineTune()
197
+ .then(() => 'Fine-tuning started.')
198
+ .catch((err) => `Fine-tune error: ${err.message}`),
199
+ };
200
+ }
201
+ else if (ftSub === 'status' || ftSub === '') {
202
+ return {
203
+ type: 'async',
204
+ promise: orchestrator.getFineTuneStatus().then((st) => {
205
+ const lines = [
206
+ `Status: ${st.status}`,
207
+ st.jobId ? `Job: ${st.jobId}` : null,
208
+ st.status === 'running' ? `Progress: ${Math.round(st.progress * 100)}% (step ${st.currentStep}/${st.totalSteps})` : null,
209
+ st.currentLoss ? `Loss: ${st.currentLoss.toFixed(4)}` : null,
210
+ st.checkpointPath ? `Checkpoint: ${st.checkpointPath}` : null,
211
+ st.error ? `Error: ${st.error}` : null,
212
+ ].filter(Boolean);
213
+ return `Fine-Tuning Status:\n ${lines.join('\n ')}`;
214
+ }).catch((err) => `Fine-tune status error: ${err.message}`),
215
+ };
216
+ }
217
+ else if (ftSub === 'config') {
218
+ const configKey = ftArgs[1] || '';
219
+ const configVal = ftArgs[2] || '';
220
+ if (configKey === 'method' && configVal) {
221
+ const valid = ['auto', 'lora', 'qlora', 'full'];
222
+ if (valid.includes(configVal)) {
223
+ orchestrator.setFineTuneMethod(configVal);
224
+ return { type: 'message', text: `Fine-tune method set to: ${configVal}` };
225
+ }
226
+ return { type: 'message', text: `Invalid method. Valid: ${valid.join(', ')}` };
227
+ }
228
+ else if (configKey === 'schedule' && configVal) {
229
+ const valid = ['auto', 'hourly', 'daily', 'weekly'];
230
+ if (valid.includes(configVal)) {
231
+ orchestrator.setFineTuneSchedule(configVal);
232
+ return { type: 'message', text: `Fine-tune schedule set to: ${configVal}` };
233
+ }
234
+ return { type: 'message', text: `Invalid schedule. Valid: ${valid.join(', ')}` };
235
+ }
236
+ return {
237
+ type: 'message',
238
+ text: `Fine-Tune Config:\n Method: ${orchestrator.getFineTuneMethod()}\n Schedule: ${orchestrator.getFineTuneSchedule()}\n\nUsage: /finetune config method|schedule <value>`,
239
+ };
240
+ }
241
+ else if (ftSub === 'history') {
242
+ const history = orchestrator.getFineTuneHistory();
243
+ if (history.length === 0)
244
+ return { type: 'message', text: 'No fine-tune history yet.' };
245
+ const lines = history.slice(-10).map((h) => {
246
+ const date = new Date(h.completedAt).toLocaleString();
247
+ return ` ${h.jobId} | ${h.status} | loss: ${h.loss.toFixed(4)} | ${date}`;
248
+ });
249
+ return { type: 'message', text: `Fine-Tune History (last ${lines.length}):\n${lines.join('\n')}`, sticky: true };
250
+ }
251
+ return {
252
+ type: 'message',
253
+ text: 'Usage: /finetune [start|status|config|history]',
254
+ };
255
+ }
256
+ case 'task': {
257
+ const taskArgs = args.trim().split(/\s+/);
258
+ const taskSub = taskArgs[0] || '';
259
+ const taskTarget = taskArgs[1] || '';
260
+ if (taskSub === 'run' && taskTarget) {
261
+ return {
262
+ type: 'async',
263
+ promise: service.runTask(taskTarget).then((result) => result.success ? `Task "${taskTarget}" completed.` : `Task "${taskTarget}" failed: ${result.error}`),
264
+ };
265
+ }
266
+ else if (taskSub === 'history' && taskTarget) {
267
+ const convId = orchestrator.getTaskConversation(taskTarget);
268
+ if (!convId)
269
+ return { type: 'message', text: `No conversation history for task "${taskTarget}".` };
270
+ const messages = orchestrator.getMessages(convId);
271
+ if (messages.length === 0)
272
+ return { type: 'message', text: `Task "${taskTarget}" has an empty conversation.` };
273
+ const lines = messages.slice(-10).map((m) => {
274
+ const prefix = m.role === 'user' ? '[GOAL]' : '[AGENT]';
275
+ const text = m.content.length > 200 ? m.content.slice(0, 200) + '...' : m.content;
276
+ return ` ${prefix} ${text}`;
277
+ });
278
+ return { type: 'message', text: `Task "${taskTarget}" — last ${lines.length} messages:\n${lines.join('\n')}`, sticky: true };
279
+ }
280
+ else if (taskSub === '' || taskSub === 'list') {
281
+ const tasks = service.getEnabledTasks();
282
+ if (tasks.length === 0)
283
+ return { type: 'message', text: 'No recurring tasks configured.' };
284
+ const state = service.getTaskState();
285
+ const lines = tasks.map((t) => {
286
+ const s = state[t.id];
287
+ const running = orchestrator.isTaskRunning(t.id) ? ' [RUNNING]' : '';
288
+ const lastRun = s?.lastRunAt ? ` (last: ${new Date(s.lastRunAt).toLocaleString()}, runs: ${s.runCount ?? 0})` : ' (never run)';
289
+ return ` ${t.id} (${t.schedule})${running}${lastRun}\n ${t.goal.split('\n')[0]}`;
290
+ });
291
+ return { type: 'message', text: `Recurring Tasks:\n${lines.join('\n')}`, sticky: true };
292
+ }
293
+ return { type: 'message', text: 'Usage: /task [list|run|history]\n /task run <id> Manually trigger a task\n /task history <id> Show recent messages' };
294
+ }
295
+ default:
296
+ return { type: 'unknown' };
297
+ }
298
+ }
299
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAuExE"}
1
+ {"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,2CA2HxE"}
@@ -1,18 +1,34 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState, useMemo } from 'react';
3
3
  import { Box, Text, useInput } from 'ink';
4
- const SLASH_COMMANDS = [
5
- '/auto', '/agents', '/auth', '/channels', '/clear', '/config',
6
- '/conversations', '/exit', '/finetune', '/help', '/memory',
7
- '/model', '/nodes', '/provider', '/quit', '/resume', '/skills', '/stop',
8
- ];
4
+ import { SLASH_COMMANDS } from '../commands.js';
9
5
  export function InputBar({ onSubmit, onCommand, disabled }) {
10
6
  const [input, setInput] = useState('');
11
- const suggestion = useMemo(() => {
12
- if (!input.startsWith('/') || input.length < 2)
13
- return '';
14
- const match = SLASH_COMMANDS.find((cmd) => cmd.startsWith(input) && cmd !== input);
15
- return match ? match.slice(input.length) : '';
7
+ const { suggestion, hint, allMatches } = useMemo(() => {
8
+ if (!input.startsWith('/'))
9
+ return { suggestion: '', hint: '', allMatches: [] };
10
+ // Just "/" typed show all commands
11
+ if (input === '/') {
12
+ return { suggestion: '', hint: '', allMatches: SLASH_COMMANDS };
13
+ }
14
+ // Filter matching commands
15
+ const matches = SLASH_COMMANDS.filter((cmd) => cmd.name.startsWith(input) && cmd.name !== input);
16
+ if (matches.length === 1) {
17
+ return {
18
+ suggestion: matches[0].name.slice(input.length),
19
+ hint: matches[0].hint,
20
+ allMatches: [],
21
+ };
22
+ }
23
+ if (matches.length > 1) {
24
+ return { suggestion: '', hint: '', allMatches: matches };
25
+ }
26
+ // Exact match — show hint only
27
+ const exact = SLASH_COMMANDS.find((cmd) => cmd.name === input);
28
+ if (exact) {
29
+ return { suggestion: '', hint: exact.hint, allMatches: [] };
30
+ }
31
+ return { suggestion: '', hint: '', allMatches: [] };
16
32
  }, [input]);
17
33
  useInput((ch, key) => {
18
34
  if (key.return) {
@@ -43,6 +59,20 @@ export function InputBar({ onSubmit, onCommand, disabled }) {
43
59
  setInput((prev) => prev + suggestion);
44
60
  return;
45
61
  }
62
+ // Tab with multiple matches — complete to common prefix
63
+ if (key.tab && allMatches.length > 1) {
64
+ const names = allMatches.map((m) => m.name);
65
+ let common = names[0];
66
+ for (const name of names.slice(1)) {
67
+ while (!name.startsWith(common)) {
68
+ common = common.slice(0, -1);
69
+ }
70
+ }
71
+ if (common.length > input.length) {
72
+ setInput(common);
73
+ }
74
+ return;
75
+ }
46
76
  if (disabled && input.trim() !== '/sto') {
47
77
  // Allow typing /stop even while disabled, block other input
48
78
  if (ch && !key.ctrl && !key.meta) {
@@ -61,6 +91,6 @@ export function InputBar({ onSubmit, onCommand, disabled }) {
61
91
  setInput((prev) => prev + ch);
62
92
  }
63
93
  });
64
- return (_jsxs(Box, { borderStyle: "single", borderColor: disabled ? 'gray' : 'blue', paddingX: 1, children: [_jsx(Text, { color: disabled ? 'gray' : 'blue', bold: true, children: '> ' }), _jsx(Text, { children: input }), suggestion && _jsx(Text, { dimColor: true, children: suggestion }), !disabled && !suggestion && _jsx(Text, { color: "blue", children: "|" })] }));
94
+ return (_jsxs(Box, { flexDirection: "column", children: [allMatches.length > 0 && (_jsx(Box, { paddingX: 2, flexDirection: "row", flexWrap: "wrap", children: allMatches.map((cmd) => (_jsx(Box, { marginRight: 1, children: _jsx(Text, { dimColor: true, children: cmd.name }) }, cmd.name))) })), _jsxs(Box, { borderStyle: "single", borderColor: disabled ? 'gray' : 'blue', paddingX: 1, children: [_jsx(Text, { color: disabled ? 'gray' : 'blue', bold: true, children: '> ' }), _jsx(Text, { children: input }), suggestion && _jsx(Text, { dimColor: true, children: suggestion }), hint && _jsxs(Text, { dimColor: true, children: [" \u2014 ", hint] }), !disabled && !suggestion && !hint && allMatches.length === 0 && _jsx(Text, { color: "blue", children: "|" })] })] }));
65
95
  }
66
96
  //# sourceMappingURL=InputBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQhD,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAiB;IACvE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QACpD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAEhF,qCAAqC;QACrC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;QAClE,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QACjG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;gBACrB,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAC3D,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAC/D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC9D,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,4CAA4C;YAC5C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACtB,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YAED,IAAI,QAAQ;gBAAE,OAAO;YAErB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChF,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAChE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;YACD,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;YAC1B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,wDAAwD;QACxD,IAAI,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YACxC,4DAA4D;YAC5D,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACpC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACjC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAExB,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CACxB,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,YAClD,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACvB,KAAC,GAAG,IAAgB,WAAW,EAAE,CAAC,YAChC,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,IAAI,GAAQ,IADxB,GAAG,CAAC,IAAI,CAEZ,CACP,CAAC,GACE,CACP,EACD,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,aAC5E,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,kBAC1C,IAAI,GACA,EACP,KAAC,IAAI,cAAE,KAAK,GAAQ,EACnB,UAAU,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,GAAQ,EAChD,IAAI,IAAI,MAAC,IAAI,IAAC,QAAQ,+BAAK,IAAI,IAAQ,EACvC,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,IACxF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAqB,YAAY,EAAE,aAAa,EAAa,mBAAmB,EAAiC,MAAM,kBAAkB,CAAC;AAG/J,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAoC,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAWrF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AAIzF,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAChD,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,eAAe,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,YAAY,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,eAAe,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA2/BvE"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAqB,YAAY,EAAE,aAAa,EAAa,mBAAmB,EAAiC,MAAM,kBAAkB,CAAC;AAG/J,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAoC,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYrF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AAIzF,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAChD,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,eAAe,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,YAAY,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,eAAe,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA2gCvE"}
package/dist/service.js CHANGED
@@ -9,6 +9,7 @@ import { CerebrumProvider } from '@cereworker/cerebrum';
9
9
  import { createChannelManager } from '@cereworker/channels';
10
10
  import { createBrowserTools, PuppeteerBackend, CdpBackend, BrowserRelay, ExtensionBackend } from '@cereworker/browser';
11
11
  import { loadSkills, filterEligibleSkills, SkillRegistry } from '@cereworker/skills';
12
+ import { parseCommand, handleSlashCommand } from './commands.js';
12
13
  import { HippocampusStore, HippocampusCurator, ConversationExtractor, createMemoryTools, memoryReadParameters, memoryWriteParameters, memoryLogParameters, memorySearchParameters, } from '@cereworker/hippocampus';
13
14
  import { GatewayServer, GatewayNodeClient, createProxyTools } from '@cereworker/gateway';
14
15
  const log = createLogger('service');
@@ -255,7 +256,26 @@ export function createService(config) {
255
256
  }
256
257
  // Wire channels to orchestrator
257
258
  channelManager.setHandler(async (msg) => {
258
- // Capture any proactive messages emitted during this turn
259
+ // Check for slash commands from channels
260
+ const parsed = parseCommand(msg.text);
261
+ if (parsed) {
262
+ const cmdCtx = {
263
+ orchestrator, cerebrum, channelManager, skillRegistry, config,
264
+ service: { runTask, getTaskState, getEnabledTasks },
265
+ currentModel: cerebrum.getDefaultModel(),
266
+ currentProvider: cerebrum.getDefaultProvider(),
267
+ autoMode: orchestrator.getAutoMode(),
268
+ };
269
+ const result = handleSlashCommand(parsed.command, parsed.args, cmdCtx);
270
+ if (result.type === 'message')
271
+ return result.text;
272
+ if (result.type === 'async')
273
+ return await result.promise;
274
+ if (result.type === 'tuiOnly')
275
+ return `/${parsed.command} is only available in the TUI.`;
276
+ return `Unknown command: /${parsed.command}. Type /help for available commands.`;
277
+ }
278
+ // Regular message — send to orchestrator
259
279
  let proactiveReply = '';
260
280
  const unsub = orchestrator.on('message:proactive', ({ content }) => {
261
281
  proactiveReply += (proactiveReply ? '\n\n' : '') + content;
@@ -265,7 +285,6 @@ export function createService(config) {
265
285
  const messages = orchestrator.getMessages();
266
286
  const lastMsg = messages[messages.length - 1];
267
287
  const reply = lastMsg?.role === 'cerebrum' ? lastMsg.content : undefined;
268
- // Append proactive message (e.g. discovery confirmation) to the reply
269
288
  if (proactiveReply) {
270
289
  return reply ? `${reply}\n\n${proactiveReply}` : proactiveReply;
271
290
  }