ccgateway 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -0
- package/bin/ccg-dev.sh +3 -0
- package/dist/agents.d.ts +17 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +45 -0
- package/dist/agents.js.map +1 -0
- package/dist/chat.d.ts +14 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +104 -0
- package/dist/chat.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +501 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +53 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +45 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +201 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon.d.ts +27 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +207 -0
- package/dist/daemon.js.map +1 -0
- package/dist/heartbeat.d.ts +42 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +153 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +70 -0
- package/dist/logger.js.map +1 -0
- package/dist/messaging.d.ts +43 -0
- package/dist/messaging.d.ts.map +1 -0
- package/dist/messaging.js +132 -0
- package/dist/messaging.js.map +1 -0
- package/dist/migrate.d.ts +24 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +356 -0
- package/dist/migrate.js.map +1 -0
- package/dist/plugin.d.ts +63 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +93 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/discord-gateway.d.ts +32 -0
- package/dist/plugins/discord-gateway.d.ts.map +1 -0
- package/dist/plugins/discord-gateway.js +208 -0
- package/dist/plugins/discord-gateway.js.map +1 -0
- package/dist/plugins/slack-gateway.d.ts +35 -0
- package/dist/plugins/slack-gateway.d.ts.map +1 -0
- package/dist/plugins/slack-gateway.js +291 -0
- package/dist/plugins/slack-gateway.js.map +1 -0
- package/dist/router.d.ts +44 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +103 -0
- package/dist/router.js.map +1 -0
- package/dist/sessions.d.ts +55 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +160 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills.d.ts +58 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +194 -0
- package/dist/skills.js.map +1 -0
- package/dist/spawner.d.ts +29 -0
- package/dist/spawner.d.ts.map +1 -0
- package/dist/spawner.js +54 -0
- package/dist/spawner.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { dirname, join, resolve } from "node:path";
|
|
7
|
+
import { loadConfig, saveConfig, getCcgHome } from "./config.js";
|
|
8
|
+
import { AgentRegistry } from "./agents.js";
|
|
9
|
+
import { SessionManager } from "./sessions.js";
|
|
10
|
+
import { SkillManager } from "./skills.js";
|
|
11
|
+
import { ContextBuilder } from "./context.js";
|
|
12
|
+
import { CCSpawner } from "./spawner.js";
|
|
13
|
+
import { startChat } from "./chat.js";
|
|
14
|
+
import { HeartbeatManager } from "./heartbeat.js";
|
|
15
|
+
import { CrossAgentMessenger } from "./messaging.js";
|
|
16
|
+
import { PluginLoader } from "./plugin.js";
|
|
17
|
+
import { startDaemon, stopDaemon, getDaemonStatus } from "./daemon.js";
|
|
18
|
+
import { migrateFromOpenClaw, initNew } from "./migrate.js";
|
|
19
|
+
// ── Read version from package.json ──────────────────────────────────────────
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
// In dev (src/cli.ts) the package.json is one level up; in dist (dist/cli.js) also one level up.
|
|
23
|
+
const pkgPath = join(__dirname, "..", "package.json");
|
|
24
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
25
|
+
// ── Build CLI ───────────────────────────────────────────────────────────────
|
|
26
|
+
const program = new Command();
|
|
27
|
+
program
|
|
28
|
+
.name("ccg")
|
|
29
|
+
.description("ccgateway — multi-agent orchestration layer for Claude Code")
|
|
30
|
+
.version(pkg.version);
|
|
31
|
+
// ── send command ────────────────────────────────────────────────────────────
|
|
32
|
+
program
|
|
33
|
+
.command("send <agent> <message>")
|
|
34
|
+
.description("Send a message to an agent's primary channel")
|
|
35
|
+
.option("--direct", "Force file-based inbox delivery")
|
|
36
|
+
.option("--from <agentId>", "Specify sender agent id")
|
|
37
|
+
.action(async (agent, message, opts) => {
|
|
38
|
+
try {
|
|
39
|
+
const config = await loadConfig();
|
|
40
|
+
const ccgHome = getCcgHome();
|
|
41
|
+
const registry = new AgentRegistry(config);
|
|
42
|
+
const loader = new PluginLoader();
|
|
43
|
+
const messenger = new CrossAgentMessenger(registry, config.bindings, loader, ccgHome);
|
|
44
|
+
if (opts.direct) {
|
|
45
|
+
await messenger.sendToInbox(agent, message, opts.from);
|
|
46
|
+
console.log(`Message delivered to ${agent}'s inbox.`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
await messenger.send(agent, message, opts.from);
|
|
50
|
+
console.log(`Message sent to ${agent}.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error(`Error: ${err.message}`);
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ── start / stop / status ───────────────────────────────────────────────────
|
|
59
|
+
program
|
|
60
|
+
.command("start")
|
|
61
|
+
.description("Start the ccgateway daemon (foreground)")
|
|
62
|
+
.action(async () => {
|
|
63
|
+
try {
|
|
64
|
+
await startDaemon();
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`Error: ${err.message}`);
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
program
|
|
72
|
+
.command("stop")
|
|
73
|
+
.description("Stop the running ccgateway daemon")
|
|
74
|
+
.action(() => {
|
|
75
|
+
stopDaemon();
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command("status")
|
|
79
|
+
.description("Show daemon status, PID, and connected gateways")
|
|
80
|
+
.action(() => {
|
|
81
|
+
const status = getDaemonStatus();
|
|
82
|
+
if (!status.running) {
|
|
83
|
+
console.log("ccgateway is not running.");
|
|
84
|
+
if (status.pid) {
|
|
85
|
+
console.log(` Stale PID file references pid=${status.pid}`);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
console.log("ccgateway is running.");
|
|
90
|
+
console.log(` PID: ${status.pid}`);
|
|
91
|
+
if (status.uptime !== undefined) {
|
|
92
|
+
const hours = Math.floor(status.uptime / 3600);
|
|
93
|
+
const mins = Math.floor((status.uptime % 3600) / 60);
|
|
94
|
+
const secs = status.uptime % 60;
|
|
95
|
+
console.log(` Uptime: ${hours}h ${mins}m ${secs}s`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// ── migrate subcommand ──────────────────────────────────────────────────────
|
|
99
|
+
const migrateCmd = program
|
|
100
|
+
.command("migrate")
|
|
101
|
+
.description("Migrate configuration from another system");
|
|
102
|
+
migrateCmd
|
|
103
|
+
.command("openclaw")
|
|
104
|
+
.description("Migrate from OpenClaw configuration")
|
|
105
|
+
.option("--config <path>", "Path to openclaw.json")
|
|
106
|
+
.option("--dry-run", "Preview migration without writing files")
|
|
107
|
+
.action(async (opts) => {
|
|
108
|
+
try {
|
|
109
|
+
await migrateFromOpenClaw({
|
|
110
|
+
configPath: opts.config,
|
|
111
|
+
dryRun: opts.dryRun,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(`Error: ${err.message}`);
|
|
116
|
+
process.exitCode = 1;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// ── init subcommand ─────────────────────────────────────────────────────────
|
|
120
|
+
program
|
|
121
|
+
.command("init")
|
|
122
|
+
.description("Initialize ccgateway configuration interactively")
|
|
123
|
+
.action(async () => {
|
|
124
|
+
try {
|
|
125
|
+
await initNew();
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.error(`Error: ${err.message}`);
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// ── chat subcommand ───────────────────────────────────────────────────────
|
|
133
|
+
program
|
|
134
|
+
.command("chat <agent>")
|
|
135
|
+
.description("Start interactive chat REPL with an agent")
|
|
136
|
+
.action(async (agentId) => {
|
|
137
|
+
const config = await loadConfig();
|
|
138
|
+
const ccgHome = getCcgHome();
|
|
139
|
+
const registry = new AgentRegistry(config);
|
|
140
|
+
const sessions = new SessionManager(ccgHome);
|
|
141
|
+
const skills = new SkillManager(ccgHome);
|
|
142
|
+
const context = new ContextBuilder(sessions, skills, ccgHome, registry);
|
|
143
|
+
const spawner = new CCSpawner();
|
|
144
|
+
try {
|
|
145
|
+
await startChat(agentId, registry, sessions, context, spawner);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
console.error(`Error: ${err.message}`);
|
|
149
|
+
process.exitCode = 1;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// ── heartbeat subcommand ─────────────────────────────────────────────────
|
|
153
|
+
const heartbeatCmd = program
|
|
154
|
+
.command("heartbeat")
|
|
155
|
+
.description("Manage heartbeat schedules");
|
|
156
|
+
heartbeatCmd
|
|
157
|
+
.command("install")
|
|
158
|
+
.description("Install cron jobs for heartbeats")
|
|
159
|
+
.action(async () => {
|
|
160
|
+
const config = await loadConfig();
|
|
161
|
+
const registry = new AgentRegistry(config);
|
|
162
|
+
const spawner = new CCSpawner();
|
|
163
|
+
const manager = new HeartbeatManager(registry, spawner, config.heartbeats);
|
|
164
|
+
try {
|
|
165
|
+
const lines = manager.installCron();
|
|
166
|
+
console.log("Installed heartbeat cron jobs:");
|
|
167
|
+
console.log(lines);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
console.error(`Error: ${err.message}`);
|
|
171
|
+
process.exitCode = 1;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
heartbeatCmd
|
|
175
|
+
.command("uninstall")
|
|
176
|
+
.description("Remove heartbeat cron jobs")
|
|
177
|
+
.action(async () => {
|
|
178
|
+
const config = await loadConfig();
|
|
179
|
+
const registry = new AgentRegistry(config);
|
|
180
|
+
const spawner = new CCSpawner();
|
|
181
|
+
const manager = new HeartbeatManager(registry, spawner, config.heartbeats);
|
|
182
|
+
try {
|
|
183
|
+
manager.uninstallCron();
|
|
184
|
+
console.log("Heartbeat cron jobs removed.");
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
console.error(`Error: ${err.message}`);
|
|
188
|
+
process.exitCode = 1;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
heartbeatCmd
|
|
192
|
+
.command("list")
|
|
193
|
+
.description("List configured heartbeats")
|
|
194
|
+
.action(async () => {
|
|
195
|
+
const config = await loadConfig();
|
|
196
|
+
const registry = new AgentRegistry(config);
|
|
197
|
+
const spawner = new CCSpawner();
|
|
198
|
+
const manager = new HeartbeatManager(registry, spawner, config.heartbeats);
|
|
199
|
+
const heartbeats = manager.listHeartbeats();
|
|
200
|
+
if (heartbeats.length === 0) {
|
|
201
|
+
console.log("No heartbeats configured.");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const header = ["Agent", "Cron", "Timezone"];
|
|
205
|
+
const rows = heartbeats.map((hb) => [hb.agent, hb.cron, hb.tz]);
|
|
206
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
207
|
+
const formatRow = (cols) => cols.map((c, i) => c.padEnd(widths[i])).join(" ");
|
|
208
|
+
console.log(formatRow(header));
|
|
209
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
210
|
+
for (const row of rows) {
|
|
211
|
+
console.log(formatRow(row));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
heartbeatCmd
|
|
215
|
+
.command("run <agent>")
|
|
216
|
+
.description("Run heartbeat for an agent manually")
|
|
217
|
+
.action(async (agentId) => {
|
|
218
|
+
const config = await loadConfig();
|
|
219
|
+
const registry = new AgentRegistry(config);
|
|
220
|
+
const spawner = new CCSpawner();
|
|
221
|
+
const manager = new HeartbeatManager(registry, spawner, config.heartbeats);
|
|
222
|
+
try {
|
|
223
|
+
const result = await manager.runHeartbeat(agentId);
|
|
224
|
+
if (result.silent) {
|
|
225
|
+
console.log(`Heartbeat for "${agentId}": all clear.`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(`Heartbeat for "${agentId}":`);
|
|
229
|
+
console.log(result.response);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
console.error(`Error: ${err.message}`);
|
|
234
|
+
process.exitCode = 1;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
// ── agents subcommand ──────────────────────────────────────────────────────
|
|
238
|
+
const agentsCmd = program
|
|
239
|
+
.command("agents")
|
|
240
|
+
.description("Manage agents");
|
|
241
|
+
agentsCmd
|
|
242
|
+
.command("list")
|
|
243
|
+
.description("List all agents")
|
|
244
|
+
.action(async () => {
|
|
245
|
+
const config = await loadConfig();
|
|
246
|
+
const registry = new AgentRegistry(config);
|
|
247
|
+
const agents = registry.listAgents();
|
|
248
|
+
if (agents.length === 0) {
|
|
249
|
+
console.log("No agents configured.");
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
// Table header
|
|
253
|
+
const header = ["ID", "Name", "Emoji", "Workspace", "Model"];
|
|
254
|
+
const rows = agents.map((a) => [
|
|
255
|
+
a.id,
|
|
256
|
+
a.name,
|
|
257
|
+
a.emoji || "(none)",
|
|
258
|
+
a.workspace,
|
|
259
|
+
a.model,
|
|
260
|
+
]);
|
|
261
|
+
// Calculate column widths
|
|
262
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
263
|
+
const formatRow = (cols) => cols.map((c, i) => c.padEnd(widths[i])).join(" ");
|
|
264
|
+
console.log(formatRow(header));
|
|
265
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
266
|
+
for (const row of rows) {
|
|
267
|
+
console.log(formatRow(row));
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
agentsCmd
|
|
271
|
+
.command("add")
|
|
272
|
+
.description("Add an agent")
|
|
273
|
+
.requiredOption("--id <id>", "Agent id")
|
|
274
|
+
.requiredOption("--name <name>", "Agent name")
|
|
275
|
+
.requiredOption("--workspace <path>", "Workspace directory path")
|
|
276
|
+
.option("--model <model>", "Model to use", "claude-sonnet-4-6")
|
|
277
|
+
.option("--emoji <emoji>", "Emoji for the agent", "")
|
|
278
|
+
.option("--skills <skills...>", "Skills list", [])
|
|
279
|
+
.option("--allowedTools <tools...>", "Allowed tools list", ["Edit", "Read", "Write", "Bash", "Grep", "Glob"])
|
|
280
|
+
.option("--maxConcurrentSessions <n>", "Max concurrent sessions", "4")
|
|
281
|
+
.action(async (opts) => {
|
|
282
|
+
const workspacePath = resolve(opts.workspace);
|
|
283
|
+
if (!existsSync(workspacePath)) {
|
|
284
|
+
console.error(`Error: Workspace directory does not exist: ${workspacePath}`);
|
|
285
|
+
process.exitCode = 1;
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const config = await loadConfig();
|
|
289
|
+
const registry = new AgentRegistry(config);
|
|
290
|
+
const agent = {
|
|
291
|
+
id: opts.id,
|
|
292
|
+
name: opts.name,
|
|
293
|
+
emoji: opts.emoji,
|
|
294
|
+
workspace: workspacePath,
|
|
295
|
+
model: opts.model,
|
|
296
|
+
skills: opts.skills,
|
|
297
|
+
allowedTools: opts.allowedTools,
|
|
298
|
+
maxConcurrentSessions: parseInt(opts.maxConcurrentSessions, 10),
|
|
299
|
+
};
|
|
300
|
+
try {
|
|
301
|
+
registry.addAgent(agent);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
console.error(`Error: ${err.message}`);
|
|
305
|
+
process.exitCode = 1;
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
config.agents = registry.listAgents();
|
|
309
|
+
await saveConfig(config);
|
|
310
|
+
console.log(`Agent "${agent.id}" added.`);
|
|
311
|
+
});
|
|
312
|
+
agentsCmd
|
|
313
|
+
.command("remove <id>")
|
|
314
|
+
.description("Remove an agent")
|
|
315
|
+
.action(async (id) => {
|
|
316
|
+
const config = await loadConfig();
|
|
317
|
+
const registry = new AgentRegistry(config);
|
|
318
|
+
if (!registry.removeAgent(id)) {
|
|
319
|
+
console.error(`Error: Agent "${id}" not found.`);
|
|
320
|
+
process.exitCode = 1;
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
config.agents = registry.listAgents();
|
|
324
|
+
await saveConfig(config);
|
|
325
|
+
console.log(`Agent "${id}" removed.`);
|
|
326
|
+
});
|
|
327
|
+
agentsCmd
|
|
328
|
+
.command("info <id>")
|
|
329
|
+
.description("Show full agent config and workspace validation")
|
|
330
|
+
.action(async (id) => {
|
|
331
|
+
const config = await loadConfig();
|
|
332
|
+
const registry = new AgentRegistry(config);
|
|
333
|
+
const agent = registry.getAgent(id);
|
|
334
|
+
if (!agent) {
|
|
335
|
+
console.error(`Error: Agent "${id}" not found.`);
|
|
336
|
+
process.exitCode = 1;
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
console.log(`Agent: ${agent.name} (${agent.id})`);
|
|
340
|
+
console.log(` Emoji: ${agent.emoji || "(none)"}`);
|
|
341
|
+
console.log(` Workspace: ${agent.workspace}`);
|
|
342
|
+
console.log(` Model: ${agent.model}`);
|
|
343
|
+
console.log(` Skills: ${agent.skills.length > 0 ? agent.skills.join(", ") : "(none)"}`);
|
|
344
|
+
console.log(` Allowed tools: ${agent.allowedTools.join(", ")}`);
|
|
345
|
+
console.log(` Max concurrent: ${agent.maxConcurrentSessions}`);
|
|
346
|
+
const validation = registry.validateWorkspace(id);
|
|
347
|
+
if (validation.valid) {
|
|
348
|
+
console.log(` Workspace validation: OK`);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
console.log(` Workspace validation: FAILED`);
|
|
352
|
+
for (const err of validation.errors) {
|
|
353
|
+
console.log(` - ${err}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
// ── sessions subcommand ───────────────────────────────────────────────────
|
|
358
|
+
const sessionsCmd = program
|
|
359
|
+
.command("sessions")
|
|
360
|
+
.description("Manage sessions");
|
|
361
|
+
sessionsCmd
|
|
362
|
+
.command("list")
|
|
363
|
+
.description("List sessions with agent, key, message count, last activity")
|
|
364
|
+
.option("--agent <id>", "Filter by agent id")
|
|
365
|
+
.action(async (opts) => {
|
|
366
|
+
const mgr = new SessionManager(getCcgHome());
|
|
367
|
+
const sessions = await mgr.listSessions(opts.agent);
|
|
368
|
+
if (sessions.length === 0) {
|
|
369
|
+
console.log("No sessions found.");
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const header = ["Agent", "Session Key", "Messages", "Last Activity"];
|
|
373
|
+
const rows = sessions.map((s) => [
|
|
374
|
+
s.agentId,
|
|
375
|
+
s.sessionKey,
|
|
376
|
+
String(s.messageCount),
|
|
377
|
+
new Date(s.lastActivity).toISOString(),
|
|
378
|
+
]);
|
|
379
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
380
|
+
const formatRow = (cols) => cols.map((c, i) => c.padEnd(widths[i])).join(" ");
|
|
381
|
+
console.log(formatRow(header));
|
|
382
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
383
|
+
for (const row of rows) {
|
|
384
|
+
console.log(formatRow(row));
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
sessionsCmd
|
|
388
|
+
.command("inspect <sessionKey>")
|
|
389
|
+
.description("Show messages in a session (most recent 20)")
|
|
390
|
+
.action(async (sessionKey) => {
|
|
391
|
+
const parts = sessionKey.split(":");
|
|
392
|
+
if (parts.length < 3) {
|
|
393
|
+
console.error("Error: Session key must be in format agentId:source:sourceId");
|
|
394
|
+
process.exitCode = 1;
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const agentId = parts[0];
|
|
398
|
+
const mgr = new SessionManager(getCcgHome());
|
|
399
|
+
const messages = await mgr.readHistory(agentId, sessionKey);
|
|
400
|
+
if (messages.length === 0) {
|
|
401
|
+
console.log("No messages found for this session.");
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
// Show the most recent 20 messages
|
|
405
|
+
const recent = messages.slice(-20);
|
|
406
|
+
const skipped = messages.length - recent.length;
|
|
407
|
+
if (skipped > 0) {
|
|
408
|
+
console.log(`... ${skipped} older message(s) omitted ...\n`);
|
|
409
|
+
}
|
|
410
|
+
for (const msg of recent) {
|
|
411
|
+
const time = new Date(msg.ts).toISOString();
|
|
412
|
+
const src = msg.source ? ` [${msg.source}]` : "";
|
|
413
|
+
const user = msg.sourceUser ? ` (${msg.sourceUser})` : "";
|
|
414
|
+
console.log(`[${time}] ${msg.role}${src}${user}:`);
|
|
415
|
+
console.log(` ${msg.content}`);
|
|
416
|
+
console.log();
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
sessionsCmd
|
|
420
|
+
.command("reset <sessionKey>")
|
|
421
|
+
.description("Archive and reset a session")
|
|
422
|
+
.action(async (sessionKey) => {
|
|
423
|
+
const parts = sessionKey.split(":");
|
|
424
|
+
if (parts.length < 3) {
|
|
425
|
+
console.error("Error: Session key must be in format agentId:source:sourceId");
|
|
426
|
+
process.exitCode = 1;
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const agentId = parts[0];
|
|
430
|
+
const mgr = new SessionManager(getCcgHome());
|
|
431
|
+
await mgr.resetSession(agentId, sessionKey);
|
|
432
|
+
console.log(`Session "${sessionKey}" has been archived and reset.`);
|
|
433
|
+
});
|
|
434
|
+
// ── skills subcommand ────────────────────────────────────────────────────
|
|
435
|
+
const skillsCmd = program
|
|
436
|
+
.command("skills")
|
|
437
|
+
.description("Manage skills");
|
|
438
|
+
skillsCmd
|
|
439
|
+
.command("list")
|
|
440
|
+
.description("List all skills (name, description, type, scope)")
|
|
441
|
+
.option("--agent <id>", "Filter by agent id")
|
|
442
|
+
.action(async (opts) => {
|
|
443
|
+
const mgr = new SkillManager(getCcgHome());
|
|
444
|
+
const skills = await mgr.listSkills(opts.agent);
|
|
445
|
+
if (skills.length === 0) {
|
|
446
|
+
console.log("No skills found.");
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const header = ["Name", "Description", "Type", "Scope"];
|
|
450
|
+
const rows = skills.map((s) => [
|
|
451
|
+
s.name,
|
|
452
|
+
s.description,
|
|
453
|
+
s.type,
|
|
454
|
+
s.agentId ? `agent:${s.agentId}` : "shared",
|
|
455
|
+
]);
|
|
456
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
457
|
+
const formatRow = (cols) => cols.map((c, i) => c.padEnd(widths[i])).join(" ");
|
|
458
|
+
console.log(formatRow(header));
|
|
459
|
+
console.log(widths.map((w) => "-".repeat(w)).join(" "));
|
|
460
|
+
for (const row of rows) {
|
|
461
|
+
console.log(formatRow(row));
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
skillsCmd
|
|
465
|
+
.command("add <file>")
|
|
466
|
+
.description("Add a skill (copy .md file to skills directory)")
|
|
467
|
+
.option("--agent <id>", "Add to agent-specific skills")
|
|
468
|
+
.action(async (file, opts) => {
|
|
469
|
+
const filePath = resolve(file);
|
|
470
|
+
if (!existsSync(filePath)) {
|
|
471
|
+
console.error(`Error: File does not exist: ${filePath}`);
|
|
472
|
+
process.exitCode = 1;
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (!filePath.endsWith(".md")) {
|
|
476
|
+
console.error("Error: Skill file must be a .md file");
|
|
477
|
+
process.exitCode = 1;
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const mgr = new SkillManager(getCcgHome());
|
|
481
|
+
await mgr.addSkill(filePath, opts.agent);
|
|
482
|
+
const scope = opts.agent ? `agent:${opts.agent}` : "shared";
|
|
483
|
+
console.log(`Skill added to ${scope} skills.`);
|
|
484
|
+
});
|
|
485
|
+
skillsCmd
|
|
486
|
+
.command("remove <name>")
|
|
487
|
+
.description("Remove a skill")
|
|
488
|
+
.option("--agent <id>", "Remove from agent-specific skills")
|
|
489
|
+
.action(async (name, opts) => {
|
|
490
|
+
const mgr = new SkillManager(getCcgHome());
|
|
491
|
+
const removed = await mgr.removeSkill(name, opts.agent);
|
|
492
|
+
if (!removed) {
|
|
493
|
+
console.error(`Error: Skill "${name}" not found.`);
|
|
494
|
+
process.exitCode = 1;
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
console.log(`Skill "${name}" removed.`);
|
|
498
|
+
});
|
|
499
|
+
// ── Run ─────────────────────────────────────────────────────────────────────
|
|
500
|
+
program.parse();
|
|
501
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface AgentConfig {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
emoji: string;
|
|
5
|
+
workspace: string;
|
|
6
|
+
model: string;
|
|
7
|
+
skills: string[];
|
|
8
|
+
allowedTools: string[];
|
|
9
|
+
maxConcurrentSessions: number;
|
|
10
|
+
}
|
|
11
|
+
export interface BindingConfig {
|
|
12
|
+
agent: string;
|
|
13
|
+
gateway: string;
|
|
14
|
+
channel: string;
|
|
15
|
+
bot: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PluginEntry {
|
|
18
|
+
name: string;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
config: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface HeartbeatConfig {
|
|
23
|
+
agent: string;
|
|
24
|
+
cron: string;
|
|
25
|
+
tz: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CcgConfig {
|
|
28
|
+
agents: AgentConfig[];
|
|
29
|
+
bindings: BindingConfig[];
|
|
30
|
+
plugins: PluginEntry[];
|
|
31
|
+
heartbeats: HeartbeatConfig[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns the CCG_HOME directory.
|
|
35
|
+
* Uses `CCG_HOME` env var if set, otherwise defaults to `~/.ccgateway`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCcgHome(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Loads the CcgConfig from `$CCG_HOME/config.json`.
|
|
40
|
+
* If the file does not exist, returns the default (empty) config.
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadConfig(): Promise<CcgConfig>;
|
|
43
|
+
/**
|
|
44
|
+
* Saves the CcgConfig to `$CCG_HOME/config.json`.
|
|
45
|
+
* Creates the CCG_HOME directory if it doesn't exist.
|
|
46
|
+
*/
|
|
47
|
+
export declare function saveConfig(config: CcgConfig): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Ensures the standard CCG_HOME subdirectories exist:
|
|
50
|
+
* agents, skills, plugins, logs
|
|
51
|
+
*/
|
|
52
|
+
export declare function ensureDirectories(): Promise<void>;
|
|
53
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAWD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAWD;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAgBrD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUvD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
agents: [],
|
|
8
|
+
bindings: [],
|
|
9
|
+
plugins: [],
|
|
10
|
+
heartbeats: [],
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Returns the CCG_HOME directory.
|
|
14
|
+
* Uses `CCG_HOME` env var if set, otherwise defaults to `~/.ccgateway`.
|
|
15
|
+
*/
|
|
16
|
+
export function getCcgHome() {
|
|
17
|
+
return process.env.CCG_HOME || join(homedir(), ".ccgateway");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns the path to the config file inside CCG_HOME.
|
|
21
|
+
*/
|
|
22
|
+
function configPath() {
|
|
23
|
+
return join(getCcgHome(), "config.json");
|
|
24
|
+
}
|
|
25
|
+
// ── Core functions ──────────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Loads the CcgConfig from `$CCG_HOME/config.json`.
|
|
28
|
+
* If the file does not exist, returns the default (empty) config.
|
|
29
|
+
*/
|
|
30
|
+
export async function loadConfig() {
|
|
31
|
+
const path = configPath();
|
|
32
|
+
if (!existsSync(path)) {
|
|
33
|
+
return { ...DEFAULT_CONFIG };
|
|
34
|
+
}
|
|
35
|
+
const raw = await readFile(path, "utf-8");
|
|
36
|
+
const parsed = JSON.parse(raw);
|
|
37
|
+
return {
|
|
38
|
+
agents: parsed.agents ?? [],
|
|
39
|
+
bindings: parsed.bindings ?? [],
|
|
40
|
+
plugins: parsed.plugins ?? [],
|
|
41
|
+
heartbeats: parsed.heartbeats ?? [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Saves the CcgConfig to `$CCG_HOME/config.json`.
|
|
46
|
+
* Creates the CCG_HOME directory if it doesn't exist.
|
|
47
|
+
*/
|
|
48
|
+
export async function saveConfig(config) {
|
|
49
|
+
const home = getCcgHome();
|
|
50
|
+
if (!existsSync(home)) {
|
|
51
|
+
await mkdir(home, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
const path = configPath();
|
|
54
|
+
await writeFile(path, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Ensures the standard CCG_HOME subdirectories exist:
|
|
58
|
+
* agents, skills, plugins, logs
|
|
59
|
+
*/
|
|
60
|
+
export async function ensureDirectories() {
|
|
61
|
+
const home = getCcgHome();
|
|
62
|
+
const dirs = ["agents", "skills", "plugins", "logs"];
|
|
63
|
+
for (const dir of dirs) {
|
|
64
|
+
const dirPath = join(home, dir);
|
|
65
|
+
if (!existsSync(dirPath)) {
|
|
66
|
+
await mkdir(dirPath, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAyClC,+EAA+E;AAE/E,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;IAErD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAiB;IAChD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAErD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC"}
|