@studiomopoke/crosschat 1.6.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/LICENSE +62 -0
- package/README.md +279 -0
- package/bin/cli.cjs +631 -0
- package/crosschat.md +196 -0
- package/dashboard/dist/assets/index-Blgmbgo_.css +1 -0
- package/dashboard/dist/assets/index-DzcjxzDR.js +49 -0
- package/dashboard/dist/index.html +13 -0
- package/dist/dashboard/dashboard-listener.d.ts +22 -0
- package/dist/dashboard/dashboard-listener.d.ts.map +1 -0
- package/dist/dashboard/dashboard-listener.js +124 -0
- package/dist/dashboard/dashboard-listener.js.map +1 -0
- package/dist/dashboard/http-server.d.ts +25 -0
- package/dist/dashboard/http-server.d.ts.map +1 -0
- package/dist/dashboard/http-server.js +281 -0
- package/dist/dashboard/http-server.js.map +1 -0
- package/dist/dashboard/message-bridge.d.ts +19 -0
- package/dist/dashboard/message-bridge.d.ts.map +1 -0
- package/dist/dashboard/message-bridge.js +48 -0
- package/dist/dashboard/message-bridge.js.map +1 -0
- package/dist/hub/agent-connection.d.ts +101 -0
- package/dist/hub/agent-connection.d.ts.map +1 -0
- package/dist/hub/agent-connection.js +383 -0
- package/dist/hub/agent-connection.js.map +1 -0
- package/dist/hub/hub-main.d.ts +2 -0
- package/dist/hub/hub-main.d.ts.map +1 -0
- package/dist/hub/hub-main.js +16 -0
- package/dist/hub/hub-main.js.map +1 -0
- package/dist/hub/hub-server.d.ts +8 -0
- package/dist/hub/hub-server.d.ts.map +1 -0
- package/dist/hub/hub-server.js +1500 -0
- package/dist/hub/hub-server.js.map +1 -0
- package/dist/hub/protocol.d.ts +221 -0
- package/dist/hub/protocol.d.ts.map +1 -0
- package/dist/hub/protocol.js +20 -0
- package/dist/hub/protocol.js.map +1 -0
- package/dist/hub/task-manager.d.ts +68 -0
- package/dist/hub/task-manager.d.ts.map +1 -0
- package/dist/hub/task-manager.js +250 -0
- package/dist/hub/task-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +2 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +234 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +48 -0
- package/dist/prompts.js.map +1 -0
- package/dist/registry/cleanup.d.ts +2 -0
- package/dist/registry/cleanup.d.ts.map +1 -0
- package/dist/registry/cleanup.js +60 -0
- package/dist/registry/cleanup.js.map +1 -0
- package/dist/registry/registry.d.ts +11 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +82 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/stores/message-store.d.ts +21 -0
- package/dist/stores/message-store.d.ts.map +1 -0
- package/dist/stores/message-store.js +83 -0
- package/dist/stores/message-store.js.map +1 -0
- package/dist/stores/task-store.d.ts +15 -0
- package/dist/stores/task-store.d.ts.map +1 -0
- package/dist/stores/task-store.js +57 -0
- package/dist/stores/task-store.js.map +1 -0
- package/dist/tools/accept-claim.d.ts +4 -0
- package/dist/tools/accept-claim.d.ts.map +1 -0
- package/dist/tools/accept-claim.js +27 -0
- package/dist/tools/accept-claim.js.map +1 -0
- package/dist/tools/chat-send.d.ts +4 -0
- package/dist/tools/chat-send.d.ts.map +1 -0
- package/dist/tools/chat-send.js +19 -0
- package/dist/tools/chat-send.js.map +1 -0
- package/dist/tools/claim-task.d.ts +4 -0
- package/dist/tools/claim-task.d.ts.map +1 -0
- package/dist/tools/claim-task.js +26 -0
- package/dist/tools/claim-task.js.map +1 -0
- package/dist/tools/clear-session.d.ts +5 -0
- package/dist/tools/clear-session.d.ts.map +1 -0
- package/dist/tools/clear-session.js +41 -0
- package/dist/tools/clear-session.js.map +1 -0
- package/dist/tools/complete-task.d.ts +4 -0
- package/dist/tools/complete-task.d.ts.map +1 -0
- package/dist/tools/complete-task.js +29 -0
- package/dist/tools/complete-task.js.map +1 -0
- package/dist/tools/create-room.d.ts +4 -0
- package/dist/tools/create-room.d.ts.map +1 -0
- package/dist/tools/create-room.js +28 -0
- package/dist/tools/create-room.js.map +1 -0
- package/dist/tools/delegate-task.d.ts +4 -0
- package/dist/tools/delegate-task.d.ts.map +1 -0
- package/dist/tools/delegate-task.js +32 -0
- package/dist/tools/delegate-task.js.map +1 -0
- package/dist/tools/get-messages.d.ts +4 -0
- package/dist/tools/get-messages.d.ts.map +1 -0
- package/dist/tools/get-messages.js +35 -0
- package/dist/tools/get-messages.js.map +1 -0
- package/dist/tools/get-room-digest.d.ts +4 -0
- package/dist/tools/get-room-digest.d.ts.map +1 -0
- package/dist/tools/get-room-digest.js +63 -0
- package/dist/tools/get-room-digest.js.map +1 -0
- package/dist/tools/get-task-status.d.ts +4 -0
- package/dist/tools/get-task-status.d.ts.map +1 -0
- package/dist/tools/get-task-status.js +26 -0
- package/dist/tools/get-task-status.js.map +1 -0
- package/dist/tools/join-room.d.ts +4 -0
- package/dist/tools/join-room.d.ts.map +1 -0
- package/dist/tools/join-room.js +26 -0
- package/dist/tools/join-room.js.map +1 -0
- package/dist/tools/list-peers.d.ts +4 -0
- package/dist/tools/list-peers.d.ts.map +1 -0
- package/dist/tools/list-peers.js +26 -0
- package/dist/tools/list-peers.js.map +1 -0
- package/dist/tools/list-tasks.d.ts +4 -0
- package/dist/tools/list-tasks.d.ts.map +1 -0
- package/dist/tools/list-tasks.js +28 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/send-message.d.ts +4 -0
- package/dist/tools/send-message.d.ts.map +1 -0
- package/dist/tools/send-message.js +28 -0
- package/dist/tools/send-message.js.map +1 -0
- package/dist/tools/set-status.d.ts +4 -0
- package/dist/tools/set-status.d.ts.map +1 -0
- package/dist/tools/set-status.js +28 -0
- package/dist/tools/set-status.js.map +1 -0
- package/dist/tools/update-task.d.ts +4 -0
- package/dist/tools/update-task.d.ts.map +1 -0
- package/dist/tools/update-task.js +28 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/tools/wait-for-messages.d.ts +4 -0
- package/dist/tools/wait-for-messages.d.ts.map +1 -0
- package/dist/tools/wait-for-messages.js +84 -0
- package/dist/tools/wait-for-messages.js.map +1 -0
- package/dist/transport/peer-protocol.d.ts +7 -0
- package/dist/transport/peer-protocol.d.ts.map +1 -0
- package/dist/transport/peer-protocol.js +30 -0
- package/dist/transport/peer-protocol.js.map +1 -0
- package/dist/transport/uds-client.d.ts +3 -0
- package/dist/transport/uds-client.d.ts.map +1 -0
- package/dist/transport/uds-client.js +57 -0
- package/dist/transport/uds-client.js.map +1 -0
- package/dist/transport/uds-server.d.ts +12 -0
- package/dist/transport/uds-server.d.ts.map +1 -0
- package/dist/transport/uds-server.js +87 -0
- package/dist/transport/uds-server.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/util/id.d.ts +2 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +5 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/logger.d.ts +3 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +13 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/pid.d.ts +2 -0
- package/dist/util/pid.d.ts.map +1 -0
- package/dist/util/pid.js +10 -0
- package/dist/util/pid.js.map +1 -0
- package/hooks/permission-hook.sh +116 -0
- package/package.json +59 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { type AgentStatus, type PeerInfo, type RoomMessageMessage, type TaskCreatedMessage, type TaskClaimedMessage, type TaskClaimAcceptedMessage, type TaskUpdatedMessage, type TaskCompletedMessage, type TaskFilter, type HubTaskStatus, type TaskSummary, type TaskNote, type MessageImportance } from './protocol.js';
|
|
2
|
+
type TaskEvent = TaskCreatedMessage | TaskClaimedMessage | TaskClaimAcceptedMessage | TaskUpdatedMessage | TaskCompletedMessage;
|
|
3
|
+
type MessageCallback = (msg: RoomMessageMessage) => void;
|
|
4
|
+
type TaskEventCallback = (evt: TaskEvent) => void;
|
|
5
|
+
type VoidCallback = () => void;
|
|
6
|
+
/**
|
|
7
|
+
* Client-side WebSocket connection used by each agent to communicate
|
|
8
|
+
* with the CrossChat hub server.
|
|
9
|
+
*
|
|
10
|
+
* Handles registration, heartbeats, reconnection with exponential
|
|
11
|
+
* backoff, and provides typed methods for every protocol message.
|
|
12
|
+
*/
|
|
13
|
+
export declare class AgentConnection {
|
|
14
|
+
private readonly port;
|
|
15
|
+
private readonly peerId;
|
|
16
|
+
private readonly name;
|
|
17
|
+
private readonly cwd;
|
|
18
|
+
private ws;
|
|
19
|
+
private heartbeatTimer;
|
|
20
|
+
private reconnectTimer;
|
|
21
|
+
private reconnectDelay;
|
|
22
|
+
private stopped;
|
|
23
|
+
private currentRoomId;
|
|
24
|
+
private pendingRequests;
|
|
25
|
+
private messageCallbacks;
|
|
26
|
+
private taskEventCallbacks;
|
|
27
|
+
private connectedCallbacks;
|
|
28
|
+
private disconnectedCallbacks;
|
|
29
|
+
constructor(port: number, peerId: string, name: string, cwd: string);
|
|
30
|
+
/** Open the WebSocket connection to the hub and send registration. */
|
|
31
|
+
connect(): void;
|
|
32
|
+
private doConnect;
|
|
33
|
+
/** Gracefully close the connection without reconnecting. */
|
|
34
|
+
disconnect(): void;
|
|
35
|
+
/** Whether the underlying WebSocket is currently open. */
|
|
36
|
+
get connected(): boolean;
|
|
37
|
+
/** Send a message to the agent's current room. */
|
|
38
|
+
sendMessage(content: string, metadata?: Record<string, unknown>, importance?: MessageImportance): void;
|
|
39
|
+
/** Update this agent's availability status. */
|
|
40
|
+
setStatus(status: AgentStatus, detail?: string, taskId?: string): void;
|
|
41
|
+
/** Get the current room ID. */
|
|
42
|
+
getCurrentRoom(): string;
|
|
43
|
+
/** Join a room (implicitly leaves the current room). */
|
|
44
|
+
joinRoom(roomId: string): void;
|
|
45
|
+
/** Create a new room on the server. */
|
|
46
|
+
createRoom(roomId: string, name?: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Request the list of connected peers from the hub.
|
|
49
|
+
* Returns a Promise that resolves when the server responds.
|
|
50
|
+
*/
|
|
51
|
+
listPeers(): Promise<PeerInfo[]>;
|
|
52
|
+
/** Create a task in the current room. */
|
|
53
|
+
createTask(description: string, context?: string, filter?: TaskFilter): void;
|
|
54
|
+
/** Bid on an open task. */
|
|
55
|
+
claimTask(taskId: string): void;
|
|
56
|
+
/** List tasks with optional filters. Returns a Promise. */
|
|
57
|
+
listTasks(filter?: {
|
|
58
|
+
status?: string;
|
|
59
|
+
roomId?: string;
|
|
60
|
+
assignedTo?: string;
|
|
61
|
+
}): Promise<{
|
|
62
|
+
tasks: TaskSummary[];
|
|
63
|
+
}>;
|
|
64
|
+
/** Get full task details including notes. Returns a Promise. */
|
|
65
|
+
getTask(taskId: string): Promise<TaskSummary & {
|
|
66
|
+
notes: TaskNote[];
|
|
67
|
+
result?: string;
|
|
68
|
+
error?: string;
|
|
69
|
+
}>;
|
|
70
|
+
/** Accept a claim on a task you created. */
|
|
71
|
+
acceptClaim(taskId: string, claimantId: string): void;
|
|
72
|
+
/** Append a progress note to a task (supports markdown). */
|
|
73
|
+
updateTask(taskId: string, content: string, status?: HubTaskStatus): void;
|
|
74
|
+
/** Mark a task as completed or failed with a result blob. */
|
|
75
|
+
completeTask(taskId: string, result: string, status: 'completed' | 'failed', error?: string): void;
|
|
76
|
+
/** Clear session state: messages from current room and optionally archive completed tasks. */
|
|
77
|
+
clearSession(opts?: {
|
|
78
|
+
messages?: boolean;
|
|
79
|
+
tasks?: boolean;
|
|
80
|
+
}): Promise<{
|
|
81
|
+
messagesCleared: number;
|
|
82
|
+
tasksArchived: number;
|
|
83
|
+
}>;
|
|
84
|
+
/** Register a callback invoked for every incoming room message. */
|
|
85
|
+
onMessage(callback: MessageCallback): void;
|
|
86
|
+
/** Register a callback invoked for task lifecycle events. */
|
|
87
|
+
onTaskEvent(callback: TaskEventCallback): void;
|
|
88
|
+
/** Register a callback invoked on (re)connection. */
|
|
89
|
+
onConnected(callback: VoidCallback): void;
|
|
90
|
+
/** Register a callback invoked when the connection drops. */
|
|
91
|
+
onDisconnected(callback: VoidCallback): void;
|
|
92
|
+
private send;
|
|
93
|
+
/** Send without throwing — used for internal/lifecycle messages where failure is expected. */
|
|
94
|
+
private trySend;
|
|
95
|
+
private handleServerMessage;
|
|
96
|
+
private startHeartbeat;
|
|
97
|
+
private stopHeartbeat;
|
|
98
|
+
private scheduleReconnect;
|
|
99
|
+
}
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=agent-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-connection.d.ts","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { generateId } from '../util/id.js';
|
|
3
|
+
import { log, logError } from '../util/logger.js';
|
|
4
|
+
import { encodeMessage, decodeMessage, } from './protocol.js';
|
|
5
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
6
|
+
const INITIAL_RECONNECT_DELAY_MS = 1_000;
|
|
7
|
+
const MAX_RECONNECT_DELAY_MS = 30_000;
|
|
8
|
+
/**
|
|
9
|
+
* Client-side WebSocket connection used by each agent to communicate
|
|
10
|
+
* with the CrossChat hub server.
|
|
11
|
+
*
|
|
12
|
+
* Handles registration, heartbeats, reconnection with exponential
|
|
13
|
+
* backoff, and provides typed methods for every protocol message.
|
|
14
|
+
*/
|
|
15
|
+
export class AgentConnection {
|
|
16
|
+
port;
|
|
17
|
+
peerId;
|
|
18
|
+
name;
|
|
19
|
+
cwd;
|
|
20
|
+
ws = null;
|
|
21
|
+
heartbeatTimer = null;
|
|
22
|
+
reconnectTimer = null;
|
|
23
|
+
reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
24
|
+
stopped = false;
|
|
25
|
+
currentRoomId = 'general';
|
|
26
|
+
pendingRequests = new Map();
|
|
27
|
+
messageCallbacks = [];
|
|
28
|
+
taskEventCallbacks = [];
|
|
29
|
+
connectedCallbacks = [];
|
|
30
|
+
disconnectedCallbacks = [];
|
|
31
|
+
constructor(port, peerId, name, cwd) {
|
|
32
|
+
this.port = port;
|
|
33
|
+
this.peerId = peerId;
|
|
34
|
+
this.name = name;
|
|
35
|
+
this.cwd = cwd;
|
|
36
|
+
}
|
|
37
|
+
// ─── Connection lifecycle ──────────────────────────────────────
|
|
38
|
+
/** Open the WebSocket connection to the hub and send registration. */
|
|
39
|
+
connect() {
|
|
40
|
+
this.stopped = false;
|
|
41
|
+
this.doConnect();
|
|
42
|
+
}
|
|
43
|
+
doConnect() {
|
|
44
|
+
if (this.stopped)
|
|
45
|
+
return;
|
|
46
|
+
const url = `ws://localhost:${this.port}/ws/agent`;
|
|
47
|
+
try {
|
|
48
|
+
this.ws = new WebSocket(url);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
this.scheduleReconnect();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.ws.on('open', () => {
|
|
55
|
+
log(`Agent connection established on port ${this.port}`);
|
|
56
|
+
this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
57
|
+
// Register with the hub
|
|
58
|
+
this.send({
|
|
59
|
+
type: 'agent.register',
|
|
60
|
+
peerId: this.peerId,
|
|
61
|
+
name: this.name,
|
|
62
|
+
cwd: this.cwd,
|
|
63
|
+
pid: process.pid,
|
|
64
|
+
});
|
|
65
|
+
this.startHeartbeat();
|
|
66
|
+
for (const cb of this.connectedCallbacks) {
|
|
67
|
+
try {
|
|
68
|
+
cb();
|
|
69
|
+
}
|
|
70
|
+
catch { /* swallow callback errors */ }
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
this.ws.on('message', (raw) => {
|
|
74
|
+
try {
|
|
75
|
+
const msg = decodeMessage(raw.toString());
|
|
76
|
+
this.handleServerMessage(msg);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Ignore malformed messages
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
this.ws.on('close', () => {
|
|
83
|
+
this.ws = null;
|
|
84
|
+
this.stopHeartbeat();
|
|
85
|
+
for (const cb of this.disconnectedCallbacks) {
|
|
86
|
+
try {
|
|
87
|
+
cb();
|
|
88
|
+
}
|
|
89
|
+
catch { /* swallow callback errors */ }
|
|
90
|
+
}
|
|
91
|
+
this.scheduleReconnect();
|
|
92
|
+
});
|
|
93
|
+
this.ws.on('error', (err) => {
|
|
94
|
+
logError('Agent connection WS error', err);
|
|
95
|
+
// 'close' fires after 'error', which triggers reconnect
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Gracefully close the connection without reconnecting. */
|
|
99
|
+
disconnect() {
|
|
100
|
+
this.stopped = true;
|
|
101
|
+
this.stopHeartbeat();
|
|
102
|
+
if (this.reconnectTimer) {
|
|
103
|
+
clearTimeout(this.reconnectTimer);
|
|
104
|
+
this.reconnectTimer = null;
|
|
105
|
+
}
|
|
106
|
+
// Reject all pending requests
|
|
107
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
108
|
+
clearTimeout(pending.timer);
|
|
109
|
+
pending.reject(new Error('Connection closed'));
|
|
110
|
+
this.pendingRequests.delete(id);
|
|
111
|
+
}
|
|
112
|
+
if (this.ws) {
|
|
113
|
+
// Send disconnect notice before closing
|
|
114
|
+
try {
|
|
115
|
+
this.send({ type: 'agent.disconnect' });
|
|
116
|
+
}
|
|
117
|
+
catch { /* best-effort */ }
|
|
118
|
+
this.ws.close();
|
|
119
|
+
this.ws = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Whether the underlying WebSocket is currently open. */
|
|
123
|
+
get connected() {
|
|
124
|
+
return this.ws?.readyState === WebSocket.OPEN;
|
|
125
|
+
}
|
|
126
|
+
// ─── Outgoing message helpers ──────────────────────────────────
|
|
127
|
+
/** Send a message to the agent's current room. */
|
|
128
|
+
sendMessage(content, metadata, importance) {
|
|
129
|
+
this.send({ type: 'agent.sendMessage', content, metadata, importance });
|
|
130
|
+
}
|
|
131
|
+
/** Update this agent's availability status. */
|
|
132
|
+
setStatus(status, detail, taskId) {
|
|
133
|
+
this.send({ type: 'agent.status', status, detail, taskId });
|
|
134
|
+
}
|
|
135
|
+
/** Get the current room ID. */
|
|
136
|
+
getCurrentRoom() {
|
|
137
|
+
return this.currentRoomId;
|
|
138
|
+
}
|
|
139
|
+
/** Join a room (implicitly leaves the current room). */
|
|
140
|
+
joinRoom(roomId) {
|
|
141
|
+
this.send({ type: 'agent.joinRoom', roomId });
|
|
142
|
+
}
|
|
143
|
+
/** Create a new room on the server. */
|
|
144
|
+
createRoom(roomId, name) {
|
|
145
|
+
this.send({ type: 'agent.createRoom', roomId, name });
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Request the list of connected peers from the hub.
|
|
149
|
+
* Returns a Promise that resolves when the server responds.
|
|
150
|
+
*/
|
|
151
|
+
listPeers() {
|
|
152
|
+
const requestId = generateId();
|
|
153
|
+
this.send({ type: 'agent.listPeers', requestId });
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
const timer = setTimeout(() => {
|
|
156
|
+
this.pendingRequests.delete(requestId);
|
|
157
|
+
reject(new Error('listPeers request timed out'));
|
|
158
|
+
}, 10_000);
|
|
159
|
+
timer.unref();
|
|
160
|
+
this.pendingRequests.set(requestId, {
|
|
161
|
+
resolve: resolve,
|
|
162
|
+
reject,
|
|
163
|
+
timer,
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/** Create a task in the current room. */
|
|
168
|
+
createTask(description, context, filter) {
|
|
169
|
+
this.send({ type: 'task.create', description, context, filter });
|
|
170
|
+
}
|
|
171
|
+
/** Bid on an open task. */
|
|
172
|
+
claimTask(taskId) {
|
|
173
|
+
this.send({ type: 'task.claim', taskId });
|
|
174
|
+
}
|
|
175
|
+
/** List tasks with optional filters. Returns a Promise. */
|
|
176
|
+
listTasks(filter) {
|
|
177
|
+
const requestId = generateId();
|
|
178
|
+
this.send({ type: 'agent.listTasks', requestId, ...filter });
|
|
179
|
+
return new Promise((resolve, reject) => {
|
|
180
|
+
const timer = setTimeout(() => {
|
|
181
|
+
this.pendingRequests.delete(requestId);
|
|
182
|
+
reject(new Error('listTasks request timed out'));
|
|
183
|
+
}, 10_000);
|
|
184
|
+
timer.unref();
|
|
185
|
+
this.pendingRequests.set(requestId, {
|
|
186
|
+
resolve: resolve,
|
|
187
|
+
reject,
|
|
188
|
+
timer,
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/** Get full task details including notes. Returns a Promise. */
|
|
193
|
+
getTask(taskId) {
|
|
194
|
+
const requestId = generateId();
|
|
195
|
+
this.send({ type: 'agent.getTask', requestId, taskId });
|
|
196
|
+
return new Promise((resolve, reject) => {
|
|
197
|
+
const timer = setTimeout(() => {
|
|
198
|
+
this.pendingRequests.delete(requestId);
|
|
199
|
+
reject(new Error('getTask request timed out'));
|
|
200
|
+
}, 10_000);
|
|
201
|
+
timer.unref();
|
|
202
|
+
this.pendingRequests.set(requestId, {
|
|
203
|
+
resolve: resolve,
|
|
204
|
+
reject,
|
|
205
|
+
timer,
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/** Accept a claim on a task you created. */
|
|
210
|
+
acceptClaim(taskId, claimantId) {
|
|
211
|
+
this.send({ type: 'task.accept', taskId, claimantId });
|
|
212
|
+
}
|
|
213
|
+
/** Append a progress note to a task (supports markdown). */
|
|
214
|
+
updateTask(taskId, content, status) {
|
|
215
|
+
this.send({ type: 'task.update', taskId, content, status });
|
|
216
|
+
}
|
|
217
|
+
/** Mark a task as completed or failed with a result blob. */
|
|
218
|
+
completeTask(taskId, result, status, error) {
|
|
219
|
+
this.send({ type: 'task.complete', taskId, result, status, error });
|
|
220
|
+
}
|
|
221
|
+
/** Clear session state: messages from current room and optionally archive completed tasks. */
|
|
222
|
+
clearSession(opts) {
|
|
223
|
+
const requestId = generateId();
|
|
224
|
+
this.send({
|
|
225
|
+
type: 'agent.clearSession',
|
|
226
|
+
requestId,
|
|
227
|
+
messages: opts?.messages,
|
|
228
|
+
tasks: opts?.tasks,
|
|
229
|
+
});
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
const timer = setTimeout(() => {
|
|
232
|
+
this.pendingRequests.delete(requestId);
|
|
233
|
+
reject(new Error('clearSession request timed out'));
|
|
234
|
+
}, 10_000);
|
|
235
|
+
timer.unref();
|
|
236
|
+
this.pendingRequests.set(requestId, {
|
|
237
|
+
resolve: resolve,
|
|
238
|
+
reject,
|
|
239
|
+
timer,
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// ─── Event registration ────────────────────────────────────────
|
|
244
|
+
/** Register a callback invoked for every incoming room message. */
|
|
245
|
+
onMessage(callback) {
|
|
246
|
+
this.messageCallbacks.push(callback);
|
|
247
|
+
}
|
|
248
|
+
/** Register a callback invoked for task lifecycle events. */
|
|
249
|
+
onTaskEvent(callback) {
|
|
250
|
+
this.taskEventCallbacks.push(callback);
|
|
251
|
+
}
|
|
252
|
+
/** Register a callback invoked on (re)connection. */
|
|
253
|
+
onConnected(callback) {
|
|
254
|
+
this.connectedCallbacks.push(callback);
|
|
255
|
+
}
|
|
256
|
+
/** Register a callback invoked when the connection drops. */
|
|
257
|
+
onDisconnected(callback) {
|
|
258
|
+
this.disconnectedCallbacks.push(callback);
|
|
259
|
+
}
|
|
260
|
+
// ─── Internal plumbing ─────────────────────────────────────────
|
|
261
|
+
send(msg) {
|
|
262
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
263
|
+
throw new Error('Not connected to hub — WebSocket not open');
|
|
264
|
+
}
|
|
265
|
+
this.ws.send(encodeMessage(msg));
|
|
266
|
+
}
|
|
267
|
+
/** Send without throwing — used for internal/lifecycle messages where failure is expected. */
|
|
268
|
+
trySend(msg) {
|
|
269
|
+
try {
|
|
270
|
+
this.send(msg);
|
|
271
|
+
}
|
|
272
|
+
catch { /* connection down — expected during reconnect */ }
|
|
273
|
+
}
|
|
274
|
+
handleServerMessage(msg) {
|
|
275
|
+
switch (msg.type) {
|
|
276
|
+
case 'registered':
|
|
277
|
+
log(`Registered with hub (peerId=${msg.peerId}, server=${msg.serverVersion})`);
|
|
278
|
+
break;
|
|
279
|
+
case 'peers': {
|
|
280
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
281
|
+
if (pending) {
|
|
282
|
+
clearTimeout(pending.timer);
|
|
283
|
+
this.pendingRequests.delete(msg.requestId);
|
|
284
|
+
pending.resolve(msg.peers);
|
|
285
|
+
}
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case 'task.detail': {
|
|
289
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
290
|
+
if (pending) {
|
|
291
|
+
clearTimeout(pending.timer);
|
|
292
|
+
this.pendingRequests.delete(msg.requestId);
|
|
293
|
+
pending.resolve(msg.task);
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case 'tasks': {
|
|
298
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
299
|
+
if (pending) {
|
|
300
|
+
clearTimeout(pending.timer);
|
|
301
|
+
this.pendingRequests.delete(msg.requestId);
|
|
302
|
+
pending.resolve({ tasks: msg.tasks });
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
case 'session.cleared': {
|
|
307
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
308
|
+
if (pending) {
|
|
309
|
+
clearTimeout(pending.timer);
|
|
310
|
+
this.pendingRequests.delete(msg.requestId);
|
|
311
|
+
const cleared = msg;
|
|
312
|
+
pending.resolve({ messagesCleared: cleared.messagesCleared, tasksArchived: cleared.tasksArchived });
|
|
313
|
+
}
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
case 'room.joined':
|
|
317
|
+
this.currentRoomId = msg.roomId;
|
|
318
|
+
log(`Joined room "${msg.name}" (${msg.roomId})`);
|
|
319
|
+
break;
|
|
320
|
+
case 'room.created':
|
|
321
|
+
log(`Room created: "${msg.name}" (${msg.roomId})`);
|
|
322
|
+
break;
|
|
323
|
+
case 'room.message':
|
|
324
|
+
for (const cb of this.messageCallbacks) {
|
|
325
|
+
try {
|
|
326
|
+
cb(msg);
|
|
327
|
+
}
|
|
328
|
+
catch { /* swallow */ }
|
|
329
|
+
}
|
|
330
|
+
break;
|
|
331
|
+
case 'task.created':
|
|
332
|
+
case 'task.claimed':
|
|
333
|
+
case 'task.claimAccepted':
|
|
334
|
+
case 'task.updated':
|
|
335
|
+
case 'task.completed':
|
|
336
|
+
for (const cb of this.taskEventCallbacks) {
|
|
337
|
+
try {
|
|
338
|
+
cb(msg);
|
|
339
|
+
}
|
|
340
|
+
catch { /* swallow */ }
|
|
341
|
+
}
|
|
342
|
+
break;
|
|
343
|
+
case 'error':
|
|
344
|
+
logError(`Hub error: ${msg.message}${msg.requestId ? ` (requestId=${msg.requestId})` : ''}`);
|
|
345
|
+
// If the error is tied to a pending request, reject it
|
|
346
|
+
if (msg.requestId) {
|
|
347
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
348
|
+
if (pending) {
|
|
349
|
+
clearTimeout(pending.timer);
|
|
350
|
+
this.pendingRequests.delete(msg.requestId);
|
|
351
|
+
pending.reject(new Error(msg.message));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
startHeartbeat() {
|
|
358
|
+
this.stopHeartbeat();
|
|
359
|
+
this.heartbeatTimer = setInterval(() => {
|
|
360
|
+
this.trySend({ type: 'agent.heartbeat' });
|
|
361
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
362
|
+
this.heartbeatTimer.unref();
|
|
363
|
+
}
|
|
364
|
+
stopHeartbeat() {
|
|
365
|
+
if (this.heartbeatTimer) {
|
|
366
|
+
clearInterval(this.heartbeatTimer);
|
|
367
|
+
this.heartbeatTimer = null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
scheduleReconnect() {
|
|
371
|
+
if (this.stopped || this.reconnectTimer)
|
|
372
|
+
return;
|
|
373
|
+
log(`Reconnecting in ${this.reconnectDelay}ms...`);
|
|
374
|
+
this.reconnectTimer = setTimeout(() => {
|
|
375
|
+
this.reconnectTimer = null;
|
|
376
|
+
this.doConnect();
|
|
377
|
+
}, this.reconnectDelay);
|
|
378
|
+
this.reconnectTimer.unref();
|
|
379
|
+
// Exponential backoff: 1s -> 2s -> 4s -> 8s -> ... -> 30s max
|
|
380
|
+
this.reconnectDelay = Math.min(this.reconnectDelay * 2, MAX_RECONNECT_DELAY_MS);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=agent-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-connection.js","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-main.d.ts","sourceRoot":"","sources":["../../src/hub/hub-main.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { startHub } from './hub-server.js';
|
|
2
|
+
import { log, logError } from '../util/logger.js';
|
|
3
|
+
process.on('uncaughtException', (err) => {
|
|
4
|
+
logError('Uncaught exception in hub', err);
|
|
5
|
+
process.exit(1);
|
|
6
|
+
});
|
|
7
|
+
process.on('unhandledRejection', (reason) => {
|
|
8
|
+
logError('Unhandled rejection in hub', reason);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
});
|
|
11
|
+
log('Starting CrossChat hub...');
|
|
12
|
+
startHub().catch((err) => {
|
|
13
|
+
logError('Fatal error starting hub', err);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=hub-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-main.js","sourceRoot":"","sources":["../../src/hub/hub-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,QAAQ,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEjC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACvB,QAAQ,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start the hub server.
|
|
3
|
+
*
|
|
4
|
+
* Central hub for CrossChat: manages agent WebSocket connections, peer registry,
|
|
5
|
+
* rooms, message routing, tasks, and serves the React dashboard frontend.
|
|
6
|
+
*/
|
|
7
|
+
export declare function startHub(): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=hub-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-server.d.ts","sourceRoot":"","sources":["../../src/hub/hub-server.ts"],"names":[],"mappings":"AAiLA;;;;;GAKG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4jD9C"}
|