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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
// ── Constants ──────────────────────────────────────────────────────────────
|
|
5
|
+
const CRON_MARKER_BEGIN = "# BEGIN ccgateway heartbeats";
|
|
6
|
+
const CRON_MARKER_END = "# END ccgateway heartbeats";
|
|
7
|
+
const HEARTBEAT_PROMPT = "Read HEARTBEAT.md. Follow it strictly. If nothing needs attention, reply HEARTBEAT_OK.";
|
|
8
|
+
// ── HeartbeatManager ──────────────────────────────────────────────────────
|
|
9
|
+
export class HeartbeatManager {
|
|
10
|
+
agents;
|
|
11
|
+
spawner;
|
|
12
|
+
heartbeats;
|
|
13
|
+
constructor(agents, spawner, heartbeats) {
|
|
14
|
+
this.agents = agents;
|
|
15
|
+
this.spawner = spawner;
|
|
16
|
+
this.heartbeats = heartbeats;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run a heartbeat for an agent.
|
|
20
|
+
* - If no HEARTBEAT.md exists in the workspace, returns silent.
|
|
21
|
+
* - If the agent responds with "HEARTBEAT_OK", returns silent.
|
|
22
|
+
* - Otherwise returns the response.
|
|
23
|
+
*/
|
|
24
|
+
async runHeartbeat(agentId) {
|
|
25
|
+
// 1. Get agent config, validate
|
|
26
|
+
const agent = this.agents.getAgent(agentId);
|
|
27
|
+
if (!agent) {
|
|
28
|
+
throw new Error(`Agent "${agentId}" not found`);
|
|
29
|
+
}
|
|
30
|
+
// 2. Check if HEARTBEAT.md exists in workspace
|
|
31
|
+
const heartbeatPath = join(agent.workspace, "HEARTBEAT.md");
|
|
32
|
+
if (!existsSync(heartbeatPath)) {
|
|
33
|
+
return { silent: true };
|
|
34
|
+
}
|
|
35
|
+
// 3. Spawn claude --print with heartbeat prompt
|
|
36
|
+
const result = await this.spawner.spawn({
|
|
37
|
+
workspace: agent.workspace,
|
|
38
|
+
message: HEARTBEAT_PROMPT,
|
|
39
|
+
systemPrompt: "",
|
|
40
|
+
model: agent.model,
|
|
41
|
+
allowedTools: agent.allowedTools,
|
|
42
|
+
});
|
|
43
|
+
// 4. Check if response is HEARTBEAT_OK
|
|
44
|
+
const trimmed = result.response.trim();
|
|
45
|
+
if (trimmed === "HEARTBEAT_OK") {
|
|
46
|
+
return { silent: true };
|
|
47
|
+
}
|
|
48
|
+
// 5. Otherwise return the response
|
|
49
|
+
return { silent: false, response: result.response };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate crontab lines from heartbeats config.
|
|
53
|
+
* Format: <cron> TZ=<tz> ccg heartbeat run <agent>
|
|
54
|
+
*/
|
|
55
|
+
generateCronLines() {
|
|
56
|
+
return this.heartbeats.map((hb) => `${hb.cron} TZ=${hb.tz} ccg heartbeat run ${hb.agent}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Install cron jobs to system crontab.
|
|
60
|
+
* Returns the generated crontab lines (for display).
|
|
61
|
+
*/
|
|
62
|
+
installCron() {
|
|
63
|
+
const lines = this.generateCronLines();
|
|
64
|
+
if (lines.length === 0) {
|
|
65
|
+
return "(no heartbeats configured)";
|
|
66
|
+
}
|
|
67
|
+
// Read existing crontab
|
|
68
|
+
let existing = "";
|
|
69
|
+
try {
|
|
70
|
+
existing = execSync("crontab -l 2>/dev/null", {
|
|
71
|
+
encoding: "utf-8",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// No existing crontab — that's fine
|
|
76
|
+
}
|
|
77
|
+
// Remove any existing ccgateway section
|
|
78
|
+
const cleaned = this.removeCcgSection(existing);
|
|
79
|
+
// Build new crontab
|
|
80
|
+
const ccgSection = [
|
|
81
|
+
CRON_MARKER_BEGIN,
|
|
82
|
+
...lines,
|
|
83
|
+
CRON_MARKER_END,
|
|
84
|
+
].join("\n");
|
|
85
|
+
const newCrontab = cleaned.trim()
|
|
86
|
+
? `${cleaned.trim()}\n${ccgSection}\n`
|
|
87
|
+
: `${ccgSection}\n`;
|
|
88
|
+
// Install
|
|
89
|
+
execSync(`echo ${JSON.stringify(newCrontab)} | crontab -`, {
|
|
90
|
+
encoding: "utf-8",
|
|
91
|
+
});
|
|
92
|
+
return lines.join("\n");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Remove ccgateway cron jobs from system crontab.
|
|
96
|
+
*/
|
|
97
|
+
uninstallCron() {
|
|
98
|
+
let existing = "";
|
|
99
|
+
try {
|
|
100
|
+
existing = execSync("crontab -l 2>/dev/null", {
|
|
101
|
+
encoding: "utf-8",
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return; // No crontab to clean
|
|
106
|
+
}
|
|
107
|
+
const cleaned = this.removeCcgSection(existing);
|
|
108
|
+
if (cleaned.trim() === "") {
|
|
109
|
+
// Remove crontab entirely if empty
|
|
110
|
+
try {
|
|
111
|
+
execSync("crontab -r 2>/dev/null", { encoding: "utf-8" });
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Already empty
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
execSync(`echo ${JSON.stringify(cleaned.trim() + "\n")} | crontab -`, {
|
|
119
|
+
encoding: "utf-8",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* List configured heartbeats.
|
|
125
|
+
*/
|
|
126
|
+
listHeartbeats() {
|
|
127
|
+
return this.heartbeats;
|
|
128
|
+
}
|
|
129
|
+
// ── Private helpers ────────────────────────────────────────────────────
|
|
130
|
+
/**
|
|
131
|
+
* Remove the ccgateway section from crontab content.
|
|
132
|
+
*/
|
|
133
|
+
removeCcgSection(crontab) {
|
|
134
|
+
const lines = crontab.split("\n");
|
|
135
|
+
const result = [];
|
|
136
|
+
let inSection = false;
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
if (line.trim() === CRON_MARKER_BEGIN) {
|
|
139
|
+
inSection = true;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (line.trim() === CRON_MARKER_END) {
|
|
143
|
+
inSection = false;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (!inSection) {
|
|
147
|
+
result.push(line);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result.join("\n");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
/**
|
|
3
|
+
* Configure the logger.
|
|
4
|
+
*/
|
|
5
|
+
export declare function configureLogger(opts: {
|
|
6
|
+
level?: LogLevel;
|
|
7
|
+
file?: boolean;
|
|
8
|
+
}): void;
|
|
9
|
+
export declare const logger: {
|
|
10
|
+
debug: (msg: string) => Promise<void>;
|
|
11
|
+
info: (msg: string) => Promise<void>;
|
|
12
|
+
warn: (msg: string) => Promise<void>;
|
|
13
|
+
error: (msg: string) => Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA4C3D;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAGP;AAuBD,eAAO,MAAM,MAAM;iBACJ,MAAM;gBACP,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join, dirname } from "node:path";
|
|
4
|
+
import { getCcgHome } from "./config.js";
|
|
5
|
+
const LEVEL_ORDER = {
|
|
6
|
+
debug: 0,
|
|
7
|
+
info: 1,
|
|
8
|
+
warn: 2,
|
|
9
|
+
error: 3,
|
|
10
|
+
};
|
|
11
|
+
// ── State ───────────────────────────────────────────────────────────────────
|
|
12
|
+
let minLevel = "info";
|
|
13
|
+
let fileLogging = false;
|
|
14
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
15
|
+
function timestamp() {
|
|
16
|
+
const now = new Date();
|
|
17
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
18
|
+
return (`${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ` +
|
|
19
|
+
`${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`);
|
|
20
|
+
}
|
|
21
|
+
function logFilePath() {
|
|
22
|
+
return join(getCcgHome(), "logs", "ccgateway.log");
|
|
23
|
+
}
|
|
24
|
+
function format(level, message) {
|
|
25
|
+
return `[${timestamp()}] [${level.toUpperCase()}] ${message}`;
|
|
26
|
+
}
|
|
27
|
+
async function writeToFile(line) {
|
|
28
|
+
const path = logFilePath();
|
|
29
|
+
const dir = dirname(path);
|
|
30
|
+
if (!existsSync(dir)) {
|
|
31
|
+
await mkdir(dir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
await appendFile(path, line + "\n", "utf-8");
|
|
34
|
+
}
|
|
35
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Configure the logger.
|
|
38
|
+
*/
|
|
39
|
+
export function configureLogger(opts) {
|
|
40
|
+
if (opts.level !== undefined)
|
|
41
|
+
minLevel = opts.level;
|
|
42
|
+
if (opts.file !== undefined)
|
|
43
|
+
fileLogging = opts.file;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Core log function.
|
|
47
|
+
*/
|
|
48
|
+
async function log(level, message) {
|
|
49
|
+
if (LEVEL_ORDER[level] < LEVEL_ORDER[minLevel])
|
|
50
|
+
return;
|
|
51
|
+
const line = format(level, message);
|
|
52
|
+
// Always write to stdout
|
|
53
|
+
if (level === "error") {
|
|
54
|
+
process.stderr.write(line + "\n");
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
process.stdout.write(line + "\n");
|
|
58
|
+
}
|
|
59
|
+
// Optionally write to file
|
|
60
|
+
if (fileLogging) {
|
|
61
|
+
await writeToFile(line);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export const logger = {
|
|
65
|
+
debug: (msg) => log("debug", msg),
|
|
66
|
+
info: (msg) => log("info", msg),
|
|
67
|
+
warn: (msg) => log("warn", msg),
|
|
68
|
+
error: (msg) => log("error", msg),
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AgentRegistry } from "./agents.js";
|
|
2
|
+
import type { MessageRouter } from "./router.js";
|
|
3
|
+
import type { PluginLoader } from "./plugin.js";
|
|
4
|
+
import type { BindingConfig } from "./config.js";
|
|
5
|
+
export interface InboxMessage {
|
|
6
|
+
from: string;
|
|
7
|
+
content: string;
|
|
8
|
+
ts: number;
|
|
9
|
+
read: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class CrossAgentMessenger {
|
|
12
|
+
private agents;
|
|
13
|
+
private bindings;
|
|
14
|
+
private plugins;
|
|
15
|
+
private ccgHome;
|
|
16
|
+
private router?;
|
|
17
|
+
constructor(agents: AgentRegistry, bindings: BindingConfig[], plugins: PluginLoader, ccgHome: string);
|
|
18
|
+
/** Set the router for internal message routing (called after router is created) */
|
|
19
|
+
setRouter(router: MessageRouter): void;
|
|
20
|
+
/**
|
|
21
|
+
* Send a message to an agent. Uses channel-native messaging if the agent
|
|
22
|
+
* has a gateway binding, otherwise falls back to file-based inbox.
|
|
23
|
+
*/
|
|
24
|
+
send(toAgentId: string, content: string, fromAgentId?: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Direct file-based inbox write.
|
|
27
|
+
* Appends to $CCG_HOME/agents/{toAgentId}/inbox.jsonl
|
|
28
|
+
*/
|
|
29
|
+
sendToInbox(toAgentId: string, content: string, fromAgentId?: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Read unread inbox messages for an agent.
|
|
32
|
+
*/
|
|
33
|
+
readInbox(agentId: string): Promise<InboxMessage[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Mark all inbox messages as read.
|
|
36
|
+
*/
|
|
37
|
+
markInboxRead(agentId: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Get inbox file path for an agent.
|
|
40
|
+
*/
|
|
41
|
+
getInboxPath(agentId: string): string;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=messaging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;CACf;AAID,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IANjB,OAAO,CAAC,MAAM,CAAC,CAAgB;gBAGrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM;IAGzB,mFAAmF;IACnF,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAItC;;;OAGG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAoEhB;;;OAGG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAkBhB;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqBzD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAGtC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { appendFile, readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
// ── CrossAgentMessenger ──────────────────────────────────────────────────
|
|
5
|
+
export class CrossAgentMessenger {
|
|
6
|
+
agents;
|
|
7
|
+
bindings;
|
|
8
|
+
plugins;
|
|
9
|
+
ccgHome;
|
|
10
|
+
router;
|
|
11
|
+
constructor(agents, bindings, plugins, ccgHome) {
|
|
12
|
+
this.agents = agents;
|
|
13
|
+
this.bindings = bindings;
|
|
14
|
+
this.plugins = plugins;
|
|
15
|
+
this.ccgHome = ccgHome;
|
|
16
|
+
}
|
|
17
|
+
/** Set the router for internal message routing (called after router is created) */
|
|
18
|
+
setRouter(router) {
|
|
19
|
+
this.router = router;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Send a message to an agent. Uses channel-native messaging if the agent
|
|
23
|
+
* has a gateway binding, otherwise falls back to file-based inbox.
|
|
24
|
+
*/
|
|
25
|
+
async send(toAgentId, content, fromAgentId) {
|
|
26
|
+
// Validate target agent exists
|
|
27
|
+
const targetAgent = this.agents.getAgent(toAgentId);
|
|
28
|
+
if (!targetAgent) {
|
|
29
|
+
throw new Error(`Agent "${toAgentId}" not found`);
|
|
30
|
+
}
|
|
31
|
+
// 1. Find target agent's primary binding (first binding where agent matches)
|
|
32
|
+
const binding = this.bindings.find((b) => b.agent === toAgentId);
|
|
33
|
+
if (binding) {
|
|
34
|
+
// 2a. Post to Discord/Slack for human visibility (optional)
|
|
35
|
+
const gatewayPlugins = this.plugins.getPluginsByType("gateway");
|
|
36
|
+
const plugin = gatewayPlugins.find((p) => p.name === `${binding.gateway}-gateway`);
|
|
37
|
+
if (plugin && typeof plugin.sendToChannel === "function") {
|
|
38
|
+
let senderBotId = binding.bot;
|
|
39
|
+
if (fromAgentId) {
|
|
40
|
+
const senderBinding = this.bindings.find((b) => b.agent === fromAgentId && b.gateway === binding.gateway);
|
|
41
|
+
if (senderBinding) {
|
|
42
|
+
senderBotId = senderBinding.bot;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Post to channel so humans can see the cross-agent message
|
|
46
|
+
await plugin.sendToChannel(binding.channel, senderBotId, content);
|
|
47
|
+
}
|
|
48
|
+
// 2b. Route internally so the target agent actually processes it.
|
|
49
|
+
// Bot messages are ignored by the gateway, so we route directly.
|
|
50
|
+
if (this.router) {
|
|
51
|
+
const response = await this.router.route({
|
|
52
|
+
from: {
|
|
53
|
+
gateway: "internal",
|
|
54
|
+
channel: binding.channel,
|
|
55
|
+
user: fromAgentId || "system",
|
|
56
|
+
userId: fromAgentId || "system",
|
|
57
|
+
messageId: `xagent-${Date.now()}`,
|
|
58
|
+
},
|
|
59
|
+
to: { agent: toAgentId },
|
|
60
|
+
content,
|
|
61
|
+
attachments: [],
|
|
62
|
+
});
|
|
63
|
+
// Post the agent's response back to their channel for visibility
|
|
64
|
+
if (plugin && typeof plugin.sendToChannel === "function") {
|
|
65
|
+
await plugin.sendToChannel(binding.channel, binding.bot, response);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// 3. No binding or no usable gateway plugin — fall back to inbox
|
|
71
|
+
await this.sendToInbox(toAgentId, content, fromAgentId);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Direct file-based inbox write.
|
|
75
|
+
* Appends to $CCG_HOME/agents/{toAgentId}/inbox.jsonl
|
|
76
|
+
*/
|
|
77
|
+
async sendToInbox(toAgentId, content, fromAgentId) {
|
|
78
|
+
const msg = {
|
|
79
|
+
from: fromAgentId || "system",
|
|
80
|
+
content,
|
|
81
|
+
ts: Date.now(),
|
|
82
|
+
read: false,
|
|
83
|
+
};
|
|
84
|
+
const inboxPath = this.getInboxPath(toAgentId);
|
|
85
|
+
const dir = join(this.ccgHome, "agents", toAgentId);
|
|
86
|
+
if (!existsSync(dir)) {
|
|
87
|
+
await mkdir(dir, { recursive: true });
|
|
88
|
+
}
|
|
89
|
+
await appendFile(inboxPath, JSON.stringify(msg) + "\n", "utf-8");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Read unread inbox messages for an agent.
|
|
93
|
+
*/
|
|
94
|
+
async readInbox(agentId) {
|
|
95
|
+
const inboxPath = this.getInboxPath(agentId);
|
|
96
|
+
if (!existsSync(inboxPath)) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const raw = await readFile(inboxPath, "utf-8");
|
|
100
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
101
|
+
if (lines.length === 0) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const messages = lines.map((line) => JSON.parse(line));
|
|
105
|
+
return messages.filter((m) => !m.read);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Mark all inbox messages as read.
|
|
109
|
+
*/
|
|
110
|
+
async markInboxRead(agentId) {
|
|
111
|
+
const inboxPath = this.getInboxPath(agentId);
|
|
112
|
+
if (!existsSync(inboxPath)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const raw = await readFile(inboxPath, "utf-8");
|
|
116
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
117
|
+
if (lines.length === 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const messages = lines.map((line) => JSON.parse(line));
|
|
121
|
+
const updated = messages.map((m) => ({ ...m, read: true }));
|
|
122
|
+
const content = updated.map((m) => JSON.stringify(m)).join("\n") + "\n";
|
|
123
|
+
await writeFile(inboxPath, content, "utf-8");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get inbox file path for an agent.
|
|
127
|
+
*/
|
|
128
|
+
getInboxPath(agentId) {
|
|
129
|
+
return join(this.ccgHome, "agents", agentId, "inbox.jsonl");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=messaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MigrateOptions {
|
|
2
|
+
configPath?: string;
|
|
3
|
+
dryRun?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Strip provider prefix from a model name.
|
|
7
|
+
* e.g. "anthropic/claude-opus-4-6" -> "claude-opus-4-6"
|
|
8
|
+
*/
|
|
9
|
+
export declare function stripModelPrefix(model: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generate a Discord bot token env var name.
|
|
12
|
+
* e.g. "ginger" -> "DISCORD_GINGER_TOKEN"
|
|
13
|
+
*/
|
|
14
|
+
export declare function botTokenEnvVar(accountName: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Migrate from OpenClaw configuration to ccgateway config.
|
|
17
|
+
*/
|
|
18
|
+
export declare function migrateFromOpenClaw(options?: MigrateOptions): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Interactive setup for new users (no OpenClaw).
|
|
21
|
+
* Creates the ~/.ccgateway/ structure with a minimal starter config.
|
|
22
|
+
*/
|
|
23
|
+
export declare function initNew(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIrF;AAmMD;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD7C"}
|