ccgateway 0.1.9 → 0.2.2
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/dist/async-watcher.d.ts +29 -29
- package/dist/async-watcher.d.ts.map +1 -1
- package/dist/async-watcher.js +81 -119
- package/dist/async-watcher.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +21 -35
- package/dist/daemon.js.map +1 -1
- package/dist/messaging.d.ts +16 -2
- package/dist/messaging.d.ts.map +1 -1
- package/dist/messaging.js +58 -20
- package/dist/messaging.js.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugins/discord-gateway.d.ts.map +1 -1
- package/dist/plugins/discord-gateway.js +90 -11
- package/dist/plugins/discord-gateway.js.map +1 -1
- package/dist/plugins/slack-gateway.d.ts +2 -2
- package/dist/plugins/slack-gateway.d.ts.map +1 -1
- package/dist/plugins/slack-gateway.js +195 -111
- package/dist/plugins/slack-gateway.js.map +1 -1
- package/dist/router.d.ts +21 -13
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +107 -77
- package/dist/router.js.map +1 -1
- package/dist/skills.d.ts +6 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +21 -6
- package/dist/skills.js.map +1 -1
- package/dist/spawner.d.ts +49 -25
- package/dist/spawner.d.ts.map +1 -1
- package/dist/spawner.js +320 -85
- package/dist/spawner.js.map +1 -1
- package/package.json +1 -1
package/dist/async-watcher.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { CCSpawner } from "./spawner.js";
|
|
2
|
+
import type { SessionManager } from "./sessions.js";
|
|
1
3
|
export interface AsyncTask {
|
|
2
4
|
sessionName: string;
|
|
3
5
|
taskDir: string;
|
|
@@ -5,44 +7,42 @@ export interface AsyncTask {
|
|
|
5
7
|
gateway: string;
|
|
6
8
|
channel: string;
|
|
7
9
|
botId: string;
|
|
8
|
-
sessionKey: string;
|
|
9
|
-
workspace: string;
|
|
10
10
|
startedAt: number;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
appendToSession: (agentId: string, sessionKey: string, content: string, tokens: {
|
|
15
|
-
in: number;
|
|
16
|
-
out: number;
|
|
17
|
-
}) => Promise<void>;
|
|
18
|
-
}
|
|
12
|
+
type SendToChannelFn = (channelId: string, botId: string, content: string) => Promise<void>;
|
|
13
|
+
type GetSendToChannelFn = (gateway: string) => SendToChannelFn | null;
|
|
19
14
|
export declare class AsyncTaskWatcher {
|
|
15
|
+
private spawner;
|
|
16
|
+
private sessions;
|
|
17
|
+
private getSendToChannel;
|
|
20
18
|
private tasks;
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
private pollTimer;
|
|
20
|
+
constructor(spawner: CCSpawner, sessions: SessionManager, getSendToChannel: GetSendToChannelFn);
|
|
21
|
+
/**
|
|
22
|
+
* Register a new async task for monitoring.
|
|
23
|
+
*/
|
|
25
24
|
register(task: AsyncTask): void;
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Start the polling loop.
|
|
27
|
+
*/
|
|
29
28
|
start(): void;
|
|
30
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Stop the polling loop.
|
|
31
|
+
*/
|
|
31
32
|
stop(): void;
|
|
32
|
-
/** Whether the watcher is actively polling. */
|
|
33
|
-
isRunning(): boolean;
|
|
34
|
-
/** Single poll cycle — check all tasks. */
|
|
35
|
-
poll(): Promise<void>;
|
|
36
|
-
/** Check if a tmux/screen session is still running. */
|
|
37
|
-
private isSessionAlive;
|
|
38
|
-
/** Handle a completed task: resolve result, post, clean up. */
|
|
39
|
-
private handleCompletion;
|
|
40
33
|
/**
|
|
41
|
-
*
|
|
42
|
-
|
|
34
|
+
* Get the list of active tasks.
|
|
35
|
+
*/
|
|
36
|
+
getActiveTasks(): AsyncTask[];
|
|
37
|
+
private poll;
|
|
38
|
+
private resolveAndPost;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the result of a completed task, in priority order:
|
|
41
|
+
* 1. RESULT.md (Claude's own summary)
|
|
42
|
+
* 2. Last ~2000 chars of output.log
|
|
43
|
+
* 3. Fallback message
|
|
43
44
|
*/
|
|
44
45
|
private resolveResult;
|
|
45
|
-
/** Quick Sonnet call to summarize what was done based on git diff. */
|
|
46
|
-
private runSummaryFallback;
|
|
47
46
|
}
|
|
47
|
+
export {};
|
|
48
48
|
//# sourceMappingURL=async-watcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-watcher.d.ts","sourceRoot":"","sources":["../src/async-watcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"async-watcher.d.ts","sourceRoot":"","sources":["../src/async-watcher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,eAAe,GAAG,CACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,KAAK,kBAAkB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,eAAe,GAAG,IAAI,CAAC;AAMtE,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IAN1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAA+C;gBAGtD,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,kBAAkB;IAG9C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,cAAc,IAAI,SAAS,EAAE;YAMf,IAAI;YAqBJ,cAAc;IA8C5B;;;;;OAKG;YACW,aAAa;CAyB5B"}
|
package/dist/async-watcher.js
CHANGED
|
@@ -1,104 +1,108 @@
|
|
|
1
|
-
import { execSync, spawn } from "node:child_process";
|
|
2
1
|
import { readFile, rm } from "node:fs/promises";
|
|
3
2
|
import { existsSync } from "node:fs";
|
|
4
3
|
import { join } from "node:path";
|
|
5
4
|
import { logger } from "./logger.js";
|
|
6
|
-
// ──
|
|
7
|
-
const POLL_INTERVAL_MS = 10_000;
|
|
8
|
-
const OUTPUT_TAIL_CHARS = 2000;
|
|
9
|
-
const SUMMARY_TIMEOUT_MS = 30_000;
|
|
10
|
-
// ── AsyncTaskWatcher ───────────────────────────────────────────────────────
|
|
5
|
+
// ── AsyncTaskWatcher ─────────────────────────────────────────────────────
|
|
6
|
+
const POLL_INTERVAL_MS = 10_000; // 10 seconds
|
|
11
7
|
export class AsyncTaskWatcher {
|
|
8
|
+
spawner;
|
|
9
|
+
sessions;
|
|
10
|
+
getSendToChannel;
|
|
12
11
|
tasks = [];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.
|
|
12
|
+
pollTimer = null;
|
|
13
|
+
constructor(spawner, sessions, getSendToChannel) {
|
|
14
|
+
this.spawner = spawner;
|
|
15
|
+
this.sessions = sessions;
|
|
16
|
+
this.getSendToChannel = getSendToChannel;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Register a new async task for monitoring.
|
|
20
|
+
*/
|
|
19
21
|
register(task) {
|
|
20
22
|
this.tasks.push(task);
|
|
21
|
-
logger.info(`async-watcher:
|
|
22
|
-
}
|
|
23
|
-
/** List all in-flight tasks. */
|
|
24
|
-
listTasks() {
|
|
25
|
-
return this.tasks;
|
|
23
|
+
logger.info(`async-watcher: registered task ${task.sessionName} (agent=${task.agentId})`);
|
|
26
24
|
}
|
|
27
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Start the polling loop.
|
|
27
|
+
*/
|
|
28
28
|
start() {
|
|
29
|
-
if (this.
|
|
29
|
+
if (this.pollTimer)
|
|
30
30
|
return;
|
|
31
|
-
this.
|
|
32
|
-
this.poll()
|
|
33
|
-
logger.error(`async-watcher: poll error: ${err.message}`);
|
|
34
|
-
});
|
|
31
|
+
this.pollTimer = setInterval(() => {
|
|
32
|
+
void this.poll();
|
|
35
33
|
}, POLL_INTERVAL_MS);
|
|
36
34
|
logger.info("async-watcher: started");
|
|
37
35
|
}
|
|
38
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Stop the polling loop.
|
|
38
|
+
*/
|
|
39
39
|
stop() {
|
|
40
|
-
if (this.
|
|
41
|
-
clearInterval(this.
|
|
42
|
-
this.
|
|
40
|
+
if (this.pollTimer) {
|
|
41
|
+
clearInterval(this.pollTimer);
|
|
42
|
+
this.pollTimer = null;
|
|
43
43
|
}
|
|
44
|
+
logger.info("async-watcher: stopped");
|
|
44
45
|
}
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Get the list of active tasks.
|
|
48
|
+
*/
|
|
49
|
+
getActiveTasks() {
|
|
50
|
+
return [...this.tasks];
|
|
48
51
|
}
|
|
49
|
-
// ──
|
|
50
|
-
/** Single poll cycle — check all tasks. */
|
|
52
|
+
// ── Polling ──────────────────────────────────────────────────────────────
|
|
51
53
|
async poll() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
if (this.tasks.length === 0)
|
|
55
|
+
return;
|
|
56
|
+
// Check each task — iterate backwards so we can splice completed ones
|
|
57
|
+
for (let i = this.tasks.length - 1; i >= 0; i--) {
|
|
58
|
+
const task = this.tasks[i];
|
|
59
|
+
try {
|
|
60
|
+
const alive = await this.spawner.isSessionAlive(task.sessionName);
|
|
61
|
+
if (!alive) {
|
|
62
|
+
logger.info(`async-watcher: session ${task.sessionName} ended, resolving result`);
|
|
63
|
+
this.tasks.splice(i, 1);
|
|
64
|
+
await this.resolveAndPost(task);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
logger.error(`async-watcher: error checking ${task.sessionName}: ${err.message}`);
|
|
56
69
|
}
|
|
57
|
-
}
|
|
58
|
-
for (const task of completed) {
|
|
59
|
-
await this.handleCompletion(task);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/** Check if a tmux/screen session is still running. */
|
|
63
|
-
isSessionAlive(sessionName) {
|
|
64
|
-
try {
|
|
65
|
-
execSync(`tmux has-session -t ${sessionName} 2>/dev/null`, { stdio: "pipe" });
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
// tmux failed — try screen
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
const output = execSync(`screen -ls`, { encoding: "utf-8", stdio: "pipe" });
|
|
73
|
-
return output.includes(sessionName);
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
return false;
|
|
77
70
|
}
|
|
78
71
|
}
|
|
79
|
-
|
|
80
|
-
async
|
|
81
|
-
logger.info(`async-watcher: ${task.sessionName} completed, resolving result`);
|
|
72
|
+
// ── Result resolution ────────────────────────────────────────────────────
|
|
73
|
+
async resolveAndPost(task) {
|
|
82
74
|
let result;
|
|
83
75
|
try {
|
|
84
76
|
result = await this.resolveResult(task);
|
|
85
77
|
}
|
|
86
78
|
catch (err) {
|
|
87
|
-
result = `Task completed but failed to
|
|
79
|
+
result = `[async] Task ${task.sessionName} completed but failed to resolve result: ${err.message}`;
|
|
88
80
|
}
|
|
89
81
|
// Post result to channel
|
|
90
82
|
try {
|
|
91
|
-
|
|
83
|
+
const sendFn = this.getSendToChannel(task.gateway);
|
|
84
|
+
if (sendFn) {
|
|
85
|
+
await sendFn(task.channel, task.botId, result);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
logger.warn(`async-watcher: no sendToChannel for gateway ${task.gateway}`);
|
|
89
|
+
}
|
|
92
90
|
}
|
|
93
91
|
catch (err) {
|
|
94
92
|
logger.error(`async-watcher: failed to post result for ${task.sessionName}: ${err.message}`);
|
|
95
93
|
}
|
|
96
|
-
// Append to session history
|
|
94
|
+
// Append result to session history
|
|
97
95
|
try {
|
|
98
|
-
|
|
96
|
+
const sessionKey = this.sessions.getOrCreateSession(task.agentId, task.gateway, task.channel);
|
|
97
|
+
await this.sessions.appendMessage(task.agentId, sessionKey, {
|
|
98
|
+
role: "assistant",
|
|
99
|
+
content: result,
|
|
100
|
+
ts: Date.now(),
|
|
101
|
+
tokens: { in: 0, out: 0 },
|
|
102
|
+
});
|
|
99
103
|
}
|
|
100
104
|
catch (err) {
|
|
101
|
-
logger.error(`async-watcher: failed to
|
|
105
|
+
logger.error(`async-watcher: failed to save session for ${task.sessionName}: ${err.message}`);
|
|
102
106
|
}
|
|
103
107
|
// Clean up task directory
|
|
104
108
|
try {
|
|
@@ -107,77 +111,35 @@ export class AsyncTaskWatcher {
|
|
|
107
111
|
catch {
|
|
108
112
|
// non-fatal
|
|
109
113
|
}
|
|
110
|
-
// Remove from registry
|
|
111
|
-
this.tasks = this.tasks.filter((t) => t.sessionName !== task.sessionName);
|
|
112
|
-
logger.info(`async-watcher: ${task.sessionName} fully resolved and cleaned up`);
|
|
113
114
|
}
|
|
114
115
|
/**
|
|
115
|
-
* Resolve the result
|
|
116
|
-
*
|
|
116
|
+
* Resolve the result of a completed task, in priority order:
|
|
117
|
+
* 1. RESULT.md (Claude's own summary)
|
|
118
|
+
* 2. Last ~2000 chars of output.log
|
|
119
|
+
* 3. Fallback message
|
|
117
120
|
*/
|
|
118
121
|
async resolveResult(task) {
|
|
119
122
|
// 1. Try RESULT.md
|
|
120
123
|
const resultPath = join(task.taskDir, "RESULT.md");
|
|
121
124
|
if (existsSync(resultPath)) {
|
|
122
125
|
const content = await readFile(resultPath, "utf-8");
|
|
123
|
-
if (content.trim())
|
|
126
|
+
if (content.trim()) {
|
|
124
127
|
return content.trim();
|
|
128
|
+
}
|
|
125
129
|
}
|
|
126
|
-
// 2.
|
|
127
|
-
try {
|
|
128
|
-
const summary = await this.runSummaryFallback(task.workspace);
|
|
129
|
-
if (summary.trim())
|
|
130
|
-
return summary.trim();
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// fall through
|
|
134
|
-
}
|
|
135
|
-
// 3. Tail of output.log
|
|
130
|
+
// 2. Tail of output.log
|
|
136
131
|
const logPath = join(task.taskDir, "output.log");
|
|
137
132
|
if (existsSync(logPath)) {
|
|
138
133
|
const log = await readFile(logPath, "utf-8");
|
|
139
|
-
if (log.
|
|
140
|
-
|
|
134
|
+
if (log.trim()) {
|
|
135
|
+
const tail = log.slice(-2000);
|
|
136
|
+
const prefix = log.length > 2000 ? "...(truncated)\n" : "";
|
|
137
|
+
return `[async] Task completed. Output:\n\n${prefix}${tail}`;
|
|
141
138
|
}
|
|
142
|
-
if (log.trim())
|
|
143
|
-
return log.trim();
|
|
144
139
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
runSummaryFallback(workspace) {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
const child = spawn("claude", [
|
|
151
|
-
"--print",
|
|
152
|
-
"--dangerously-skip-permissions",
|
|
153
|
-
"--bare",
|
|
154
|
-
"--model",
|
|
155
|
-
"sonnet",
|
|
156
|
-
"-p",
|
|
157
|
-
"Summarize what was changed in this workspace based on `git diff HEAD~1` and `git log -1`. Be concise (under 500 words).",
|
|
158
|
-
], { cwd: workspace, stdio: ["ignore", "pipe", "pipe"] });
|
|
159
|
-
let stdout = "";
|
|
160
|
-
child.stdout.on("data", (chunk) => {
|
|
161
|
-
stdout += chunk.toString();
|
|
162
|
-
});
|
|
163
|
-
const timer = setTimeout(() => {
|
|
164
|
-
child.kill("SIGTERM");
|
|
165
|
-
reject(new Error("summary timed out"));
|
|
166
|
-
}, SUMMARY_TIMEOUT_MS);
|
|
167
|
-
child.on("close", (code) => {
|
|
168
|
-
clearTimeout(timer);
|
|
169
|
-
if (code === 0 && stdout.trim()) {
|
|
170
|
-
resolve(stdout);
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
reject(new Error("summary failed"));
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
child.on("error", (err) => {
|
|
177
|
-
clearTimeout(timer);
|
|
178
|
-
reject(err);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
140
|
+
// 3. Fallback
|
|
141
|
+
const elapsed = Math.round((Date.now() - task.startedAt) / 1000);
|
|
142
|
+
return `[async] Task ${task.sessionName} completed after ${elapsed}s. No output captured.`;
|
|
181
143
|
}
|
|
182
144
|
}
|
|
183
145
|
//# sourceMappingURL=async-watcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-watcher.js","sourceRoot":"","sources":["../src/async-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"async-watcher.js","sourceRoot":"","sources":["../src/async-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA0BA;;;;;;;;GAQG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA0BA;;;;;;;;GAQG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0IjD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAgDjC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuBrF;AAID,6BAA6B;AAC7B,wBAAgB,OAAO,IAAI,MAAM,CAEhC"}
|
package/dist/daemon.js
CHANGED
|
@@ -5,9 +5,9 @@ import { SkillManager } from './skills.js';
|
|
|
5
5
|
import { ContextBuilder } from './context.js';
|
|
6
6
|
import { CCSpawner } from './spawner.js';
|
|
7
7
|
import { MessageRouter } from './router.js';
|
|
8
|
+
import { AsyncTaskWatcher } from './async-watcher.js';
|
|
8
9
|
import { PluginLoader } from './plugin.js';
|
|
9
10
|
import { CrossAgentMessenger } from './messaging.js';
|
|
10
|
-
import { AsyncTaskWatcher } from './async-watcher.js';
|
|
11
11
|
import { createIpcServer, socketPath } from './ipc.js';
|
|
12
12
|
import { configureLogger, logger } from './logger.js';
|
|
13
13
|
import { writeFileSync, readFileSync, existsSync, unlinkSync, statSync } from 'node:fs';
|
|
@@ -43,40 +43,23 @@ export async function startDaemon() {
|
|
|
43
43
|
const skills = new SkillManager(ccgHome);
|
|
44
44
|
const context = new ContextBuilder(sessions, skills, ccgHome, registry);
|
|
45
45
|
const spawner = new CCSpawner();
|
|
46
|
-
// 5. Create PluginLoader
|
|
46
|
+
// 5. Create PluginLoader
|
|
47
47
|
const loader = new PluginLoader();
|
|
48
|
-
// 5.5 Create
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
const gatewayPlugins = loader.getPluginsByType("gateway");
|
|
52
|
-
for (const plugin of gatewayPlugins) {
|
|
53
|
-
const gw = plugin;
|
|
54
|
-
if (typeof gw.sendToChannel === "function") {
|
|
55
|
-
try {
|
|
56
|
-
await gw.sendToChannel(channel, botId, content);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// try next gateway
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
logger.error(`async-watcher: no gateway could deliver result to channel ${channel}`);
|
|
65
|
-
},
|
|
66
|
-
appendToSession: async (agentId, sessionKey, content, tokens) => {
|
|
67
|
-
await sessions.appendMessage(agentId, sessionKey, {
|
|
68
|
-
role: "assistant",
|
|
69
|
-
content,
|
|
70
|
-
ts: Date.now(),
|
|
71
|
-
tokens,
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
// 5.6 Create router (needs watcher)
|
|
76
|
-
const router = new MessageRouter(registry, sessions, context, spawner, config.bindings, watcher);
|
|
77
|
-
// 5.7 Create messenger (needs loader and router)
|
|
48
|
+
// 5.5 Create router
|
|
49
|
+
const router = new MessageRouter(registry, sessions, context, spawner, config.bindings);
|
|
50
|
+
// 5.6 Create messenger (needs loader and router)
|
|
78
51
|
const messenger = new CrossAgentMessenger(registry, config.bindings, loader, ccgHome);
|
|
79
52
|
messenger.setRouter(router);
|
|
53
|
+
// 5.7 Create async task watcher
|
|
54
|
+
const watcher = new AsyncTaskWatcher(spawner, sessions, (gateway) => {
|
|
55
|
+
// Resolve sendToChannel from the loaded plugin for this gateway
|
|
56
|
+
const plugin = loader.getPlugin(`${gateway}-gateway`);
|
|
57
|
+
if (plugin && typeof plugin.sendToChannel === 'function') {
|
|
58
|
+
return plugin.sendToChannel;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
});
|
|
62
|
+
router.setWatcher(watcher);
|
|
80
63
|
// 6. Build CcgCore object for plugins
|
|
81
64
|
const core = {
|
|
82
65
|
config,
|
|
@@ -107,9 +90,9 @@ export async function startDaemon() {
|
|
|
107
90
|
}
|
|
108
91
|
// 8. Start all plugins
|
|
109
92
|
await loader.startAll();
|
|
110
|
-
// 8.
|
|
93
|
+
// 8.1 Start async task watcher
|
|
111
94
|
watcher.start();
|
|
112
|
-
//
|
|
95
|
+
// 8.5 Start IPC server for cross-agent messaging from CLI
|
|
113
96
|
const ipcServer = createIpcServer(async (toAgent, content, fromAgent) => {
|
|
114
97
|
await messenger.send(toAgent, content, fromAgent);
|
|
115
98
|
});
|
|
@@ -119,7 +102,10 @@ export async function startDaemon() {
|
|
|
119
102
|
// 11. Set up signal handlers for graceful shutdown
|
|
120
103
|
const shutdown = async (signal) => {
|
|
121
104
|
logger.info(`ccgateway received ${signal}, shutting down...`);
|
|
122
|
-
|
|
105
|
+
try {
|
|
106
|
+
watcher.stop();
|
|
107
|
+
}
|
|
108
|
+
catch { /* non-fatal */ }
|
|
123
109
|
try {
|
|
124
110
|
ipcServer.close();
|
|
125
111
|
removeSocketFile();
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/messaging.d.ts
CHANGED
|
@@ -18,10 +18,24 @@ export declare class CrossAgentMessenger {
|
|
|
18
18
|
/** Set the router for internal message routing (called after router is created) */
|
|
19
19
|
setRouter(router: MessageRouter): void;
|
|
20
20
|
/**
|
|
21
|
-
* Send a message to an agent.
|
|
22
|
-
*
|
|
21
|
+
* Send a message to an agent. The request is posted to the target's
|
|
22
|
+
* channel for visibility, then the target agent processes it **in the
|
|
23
|
+
* background**. When done, the response is posted to both the target's
|
|
24
|
+
* channel and the sender's channel.
|
|
25
|
+
*
|
|
26
|
+
* Returns immediately after posting the request — does NOT block waiting
|
|
27
|
+
* for the target agent to finish.
|
|
23
28
|
*/
|
|
24
29
|
send(toAgentId: string, content: string, fromAgentId?: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Route a cross-agent message in the background and post the response
|
|
32
|
+
* to both the target's channel and the sender's channel when done.
|
|
33
|
+
*/
|
|
34
|
+
private routeInBackground;
|
|
35
|
+
/**
|
|
36
|
+
* Get the sendToChannel function for a gateway, if available.
|
|
37
|
+
*/
|
|
38
|
+
private getSendToChannel;
|
|
25
39
|
/**
|
|
26
40
|
* Direct file-based inbox write.
|
|
27
41
|
* Appends to $CCG_HOME/agents/{toAgentId}/inbox.jsonl
|
package/dist/messaging.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAQjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;CACf;AAYD,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;;;;;;;;OAQG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IA+ChB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwEzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;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"}
|