codesail 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/bin/codesail.js +2 -0
- package/dist/chunk-4OXDCPSF.js +44 -0
- package/dist/chunk-4OXDCPSF.js.map +1 -0
- package/dist/chunk-HG54UP2Y.js +25 -0
- package/dist/chunk-HG54UP2Y.js.map +1 -0
- package/dist/chunk-LWJDKIJF.js +180 -0
- package/dist/chunk-LWJDKIJF.js.map +1 -0
- package/dist/chunk-SFXOQ3OG.js +236 -0
- package/dist/chunk-SFXOQ3OG.js.map +1 -0
- package/dist/daemon/index.js +464 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/encryption-IBHFWEPA.js +20 -0
- package/dist/encryption-IBHFWEPA.js.map +1 -0
- package/dist/index.js +658 -0
- package/dist/index.js.map +1 -0
- package/dist/state-J732R3HC.js +14 -0
- package/dist/state-J732R3HC.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSocketClient,
|
|
3
|
+
fetchMessages,
|
|
4
|
+
fetchSessions,
|
|
5
|
+
loadCredentials
|
|
6
|
+
} from "../chunk-SFXOQ3OG.js";
|
|
7
|
+
import {
|
|
8
|
+
removeDaemonState,
|
|
9
|
+
writeDaemonState
|
|
10
|
+
} from "../chunk-4OXDCPSF.js";
|
|
11
|
+
import {
|
|
12
|
+
decodeBase64,
|
|
13
|
+
decryptFromBase64,
|
|
14
|
+
decryptValue,
|
|
15
|
+
encryptToBase64,
|
|
16
|
+
resolveSessionEncryption
|
|
17
|
+
} from "../chunk-LWJDKIJF.js";
|
|
18
|
+
import {
|
|
19
|
+
DEFAULT_SERVER_URL
|
|
20
|
+
} from "../chunk-HG54UP2Y.js";
|
|
21
|
+
|
|
22
|
+
// src/types/update.ts
|
|
23
|
+
function parseUpdate(data) {
|
|
24
|
+
if (!data || typeof data !== "object") return null;
|
|
25
|
+
const obj = data;
|
|
26
|
+
const id = obj.id;
|
|
27
|
+
const seq = obj.seq;
|
|
28
|
+
const createdAt = obj.createdAt;
|
|
29
|
+
const body = obj.body;
|
|
30
|
+
if (!body || typeof body.t !== "string") return null;
|
|
31
|
+
switch (body.t) {
|
|
32
|
+
case "new-message":
|
|
33
|
+
return {
|
|
34
|
+
id,
|
|
35
|
+
seq,
|
|
36
|
+
createdAt,
|
|
37
|
+
body: {
|
|
38
|
+
t: "new-message",
|
|
39
|
+
sessionId: body.sessionId,
|
|
40
|
+
messageId: body.messageId,
|
|
41
|
+
messageSeq: body.messageSeq,
|
|
42
|
+
encryptedContent: body.encryptedContent
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
case "update-session":
|
|
46
|
+
return {
|
|
47
|
+
id,
|
|
48
|
+
seq,
|
|
49
|
+
createdAt,
|
|
50
|
+
body: {
|
|
51
|
+
t: "update-session",
|
|
52
|
+
sessionId: body.sessionId,
|
|
53
|
+
metadata: body.metadata,
|
|
54
|
+
agentState: body.agentState
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
case "update-machine":
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
seq,
|
|
61
|
+
createdAt,
|
|
62
|
+
body: { t: "update-machine", machineId: body.machineId, ...body }
|
|
63
|
+
};
|
|
64
|
+
case "new-session":
|
|
65
|
+
return {
|
|
66
|
+
id,
|
|
67
|
+
seq,
|
|
68
|
+
createdAt,
|
|
69
|
+
body: { t: "new-session", sessionId: body.sessionId, ...body }
|
|
70
|
+
};
|
|
71
|
+
default:
|
|
72
|
+
return { id, seq, createdAt, body: { t: "unknown" } };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function parseEphemeral(data) {
|
|
76
|
+
if (!data || typeof data !== "object") return null;
|
|
77
|
+
const obj = data;
|
|
78
|
+
if (obj.type !== "activity") return null;
|
|
79
|
+
return {
|
|
80
|
+
type: "activity",
|
|
81
|
+
id: obj.id,
|
|
82
|
+
active: obj.active === true,
|
|
83
|
+
activeAt: obj.activeAt ?? Date.now(),
|
|
84
|
+
thinking: obj.thinking === true
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// src/types/message.ts
|
|
89
|
+
function parseMessageContent(json) {
|
|
90
|
+
if (!json || typeof json !== "object") return null;
|
|
91
|
+
const dict = json;
|
|
92
|
+
const role = dict.role;
|
|
93
|
+
if (role === "user") {
|
|
94
|
+
const content = dict.content;
|
|
95
|
+
if (!content || content.type !== "text" || typeof content.text !== "string") return null;
|
|
96
|
+
return {
|
|
97
|
+
type: "user",
|
|
98
|
+
role: "user",
|
|
99
|
+
text: content.text,
|
|
100
|
+
meta: dict.meta
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (role === "agent") {
|
|
104
|
+
const content = dict.content;
|
|
105
|
+
if (!content || typeof content.type !== "string") return null;
|
|
106
|
+
const meta = dict.meta;
|
|
107
|
+
if (content.type === "output") {
|
|
108
|
+
const data = content.data;
|
|
109
|
+
if (!data || typeof data.type !== "string") return null;
|
|
110
|
+
const messageText = extractMessageText(data);
|
|
111
|
+
return {
|
|
112
|
+
type: "agent",
|
|
113
|
+
role: "agent",
|
|
114
|
+
content: {
|
|
115
|
+
type: "output",
|
|
116
|
+
data: {
|
|
117
|
+
type: data.type,
|
|
118
|
+
raw: data,
|
|
119
|
+
isSidechain: data.isSidechain === true,
|
|
120
|
+
isMeta: data.isMeta === true,
|
|
121
|
+
uuid: data.uuid,
|
|
122
|
+
messageText
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
meta
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (content.type === "event") {
|
|
129
|
+
const data = content.data;
|
|
130
|
+
if (!data || typeof data.type !== "string") return null;
|
|
131
|
+
return {
|
|
132
|
+
type: "event",
|
|
133
|
+
eventType: data.type,
|
|
134
|
+
data
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (content.type === "acp") {
|
|
138
|
+
const provider = content.provider;
|
|
139
|
+
const data = content.data;
|
|
140
|
+
if (!provider || !data || typeof data.type !== "string") return null;
|
|
141
|
+
return {
|
|
142
|
+
type: "agent",
|
|
143
|
+
role: "agent",
|
|
144
|
+
content: {
|
|
145
|
+
type: "acp",
|
|
146
|
+
provider,
|
|
147
|
+
data: {
|
|
148
|
+
type: data.type,
|
|
149
|
+
raw: data,
|
|
150
|
+
toolName: data.name ?? data.toolName,
|
|
151
|
+
messageText: data.message ?? data.text
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
meta
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
function extractMessageText(data) {
|
|
162
|
+
const message = data.message;
|
|
163
|
+
if (!message) return void 0;
|
|
164
|
+
if (typeof message.content === "string") return message.content;
|
|
165
|
+
if (Array.isArray(message.content)) {
|
|
166
|
+
const texts = message.content.filter((item) => item.type === "text" && typeof item.text === "string").map((item) => item.text);
|
|
167
|
+
return texts.length > 0 ? texts.join("\n") : void 0;
|
|
168
|
+
}
|
|
169
|
+
return void 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/daemon/sync.ts
|
|
173
|
+
var SyncEngine = class {
|
|
174
|
+
masterSecret;
|
|
175
|
+
token;
|
|
176
|
+
serverURL;
|
|
177
|
+
socketClient = null;
|
|
178
|
+
state = {
|
|
179
|
+
sessions: [],
|
|
180
|
+
messagesBySession: /* @__PURE__ */ new Map(),
|
|
181
|
+
activity: /* @__PURE__ */ new Map()
|
|
182
|
+
};
|
|
183
|
+
constructor(masterSecret, token, serverURL) {
|
|
184
|
+
this.masterSecret = masterSecret;
|
|
185
|
+
this.token = token;
|
|
186
|
+
this.serverURL = serverURL;
|
|
187
|
+
}
|
|
188
|
+
async start() {
|
|
189
|
+
this.socketClient = createSocketClient(this.serverURL, this.token);
|
|
190
|
+
this.socketClient.onConnect(() => {
|
|
191
|
+
console.log("[Sync] Socket connected");
|
|
192
|
+
this.refreshSessions().catch((err) => console.error("[Sync] Refresh error:", err));
|
|
193
|
+
});
|
|
194
|
+
this.socketClient.onDisconnect((reason) => {
|
|
195
|
+
console.log("[Sync] Socket disconnected:", reason);
|
|
196
|
+
});
|
|
197
|
+
this.socketClient.onUpdate((data) => this.handleUpdate(data));
|
|
198
|
+
this.socketClient.onEphemeral((data) => this.handleEphemeral(data));
|
|
199
|
+
this.socketClient.connect();
|
|
200
|
+
await this.refreshSessions();
|
|
201
|
+
}
|
|
202
|
+
stop() {
|
|
203
|
+
this.socketClient?.disconnect();
|
|
204
|
+
this.socketClient = null;
|
|
205
|
+
}
|
|
206
|
+
getSocket() {
|
|
207
|
+
return this.socketClient;
|
|
208
|
+
}
|
|
209
|
+
async refreshSessions() {
|
|
210
|
+
const rawSessions = await fetchSessions(this.token, this.serverURL);
|
|
211
|
+
this.state.sessions = this.processSessions(rawSessions);
|
|
212
|
+
}
|
|
213
|
+
processSessions(rawSessions) {
|
|
214
|
+
const results = [];
|
|
215
|
+
for (const raw of rawSessions) {
|
|
216
|
+
try {
|
|
217
|
+
const encryption = resolveSessionEncryption(raw.dataEncryptionKey, this.masterSecret);
|
|
218
|
+
let metadata = null;
|
|
219
|
+
try {
|
|
220
|
+
const metaData = decodeBase64(raw.metadata);
|
|
221
|
+
metadata = decryptValue(encryption, metaData);
|
|
222
|
+
} catch {
|
|
223
|
+
}
|
|
224
|
+
let agentState = null;
|
|
225
|
+
if (raw.agentState) {
|
|
226
|
+
try {
|
|
227
|
+
const stateData = decodeBase64(raw.agentState);
|
|
228
|
+
agentState = decryptValue(encryption, stateData);
|
|
229
|
+
} catch {
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
results.push({
|
|
233
|
+
id: raw.id,
|
|
234
|
+
seq: raw.seq,
|
|
235
|
+
metadata,
|
|
236
|
+
metadataVersion: raw.metadataVersion,
|
|
237
|
+
agentState,
|
|
238
|
+
agentStateVersion: raw.agentStateVersion,
|
|
239
|
+
encryption,
|
|
240
|
+
active: raw.active ?? true,
|
|
241
|
+
activeAt: raw.activeAt ?? raw.updatedAt,
|
|
242
|
+
createdAt: raw.createdAt,
|
|
243
|
+
updatedAt: raw.updatedAt,
|
|
244
|
+
dataEncryptionKey: raw.dataEncryptionKey
|
|
245
|
+
});
|
|
246
|
+
} catch (err) {
|
|
247
|
+
console.error(`[Sync] Failed to process session ${raw.id}:`, err);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return results.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
251
|
+
}
|
|
252
|
+
async loadMessages(sessionId) {
|
|
253
|
+
const session = this.state.sessions.find((s) => s.id === sessionId);
|
|
254
|
+
if (!session) return [];
|
|
255
|
+
const rawMessages = await fetchMessages(sessionId, this.token, this.serverURL);
|
|
256
|
+
const decrypted = [];
|
|
257
|
+
for (const raw of rawMessages) {
|
|
258
|
+
if (raw.content.t !== "encrypted") continue;
|
|
259
|
+
try {
|
|
260
|
+
const json = decryptFromBase64(session.encryption, raw.content.c);
|
|
261
|
+
const content = parseMessageContent(json);
|
|
262
|
+
decrypted.push({
|
|
263
|
+
id: raw.id,
|
|
264
|
+
seq: raw.seq,
|
|
265
|
+
localId: raw.localId,
|
|
266
|
+
content,
|
|
267
|
+
createdAt: raw.createdAt
|
|
268
|
+
});
|
|
269
|
+
} catch {
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
this.state.messagesBySession.set(sessionId, decrypted);
|
|
273
|
+
return decrypted;
|
|
274
|
+
}
|
|
275
|
+
handleUpdate(data) {
|
|
276
|
+
const update = parseUpdate(data);
|
|
277
|
+
if (!update) return;
|
|
278
|
+
switch (update.body.t) {
|
|
279
|
+
case "new-message": {
|
|
280
|
+
const { sessionId, messageId, messageSeq, encryptedContent } = update.body;
|
|
281
|
+
const session = this.state.sessions.find((s) => s.id === sessionId);
|
|
282
|
+
if (!session || encryptedContent.t !== "encrypted") break;
|
|
283
|
+
try {
|
|
284
|
+
const json = decryptFromBase64(session.encryption, encryptedContent.c);
|
|
285
|
+
const content = parseMessageContent(json);
|
|
286
|
+
const msg = {
|
|
287
|
+
id: messageId,
|
|
288
|
+
seq: messageSeq,
|
|
289
|
+
localId: null,
|
|
290
|
+
content,
|
|
291
|
+
createdAt: update.createdAt
|
|
292
|
+
};
|
|
293
|
+
const existing = this.state.messagesBySession.get(sessionId) ?? [];
|
|
294
|
+
if (!existing.some((m) => m.id === messageId)) {
|
|
295
|
+
existing.push(msg);
|
|
296
|
+
existing.sort((a, b) => a.seq - b.seq);
|
|
297
|
+
this.state.messagesBySession.set(sessionId, existing);
|
|
298
|
+
}
|
|
299
|
+
} catch {
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case "update-session": {
|
|
304
|
+
const { sessionId, metadata, agentState } = update.body;
|
|
305
|
+
const idx = this.state.sessions.findIndex((s) => s.id === sessionId);
|
|
306
|
+
if (idx === -1) break;
|
|
307
|
+
const session = this.state.sessions[idx];
|
|
308
|
+
if (metadata && metadata.version > session.metadataVersion) {
|
|
309
|
+
try {
|
|
310
|
+
const metaData = decodeBase64(metadata.value);
|
|
311
|
+
const decoded = decryptValue(session.encryption, metaData);
|
|
312
|
+
session.metadata = decoded;
|
|
313
|
+
session.metadataVersion = metadata.version;
|
|
314
|
+
} catch {
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (agentState && agentState.version > session.agentStateVersion) {
|
|
318
|
+
try {
|
|
319
|
+
const stateData = decodeBase64(agentState.value);
|
|
320
|
+
const decoded = decryptValue(session.encryption, stateData);
|
|
321
|
+
session.agentState = decoded;
|
|
322
|
+
session.agentStateVersion = agentState.version;
|
|
323
|
+
} catch {
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
this.state.sessions[idx] = session;
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
case "new-session":
|
|
330
|
+
this.refreshSessions().catch((err) => console.error("[Sync] Refresh error:", err));
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
handleEphemeral(data) {
|
|
335
|
+
const event = parseEphemeral(data);
|
|
336
|
+
if (!event || event.type !== "activity") return;
|
|
337
|
+
this.state.activity.set(event.id, {
|
|
338
|
+
isActive: event.active,
|
|
339
|
+
isThinking: event.thinking,
|
|
340
|
+
lastActiveAt: event.activeAt
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
// src/daemon/server.ts
|
|
346
|
+
import Fastify from "fastify";
|
|
347
|
+
async function createDaemonServer(syncEngine) {
|
|
348
|
+
const fastify = Fastify({ logger: false });
|
|
349
|
+
fastify.get("/sessions", async () => {
|
|
350
|
+
const sessions = syncEngine.state.sessions.map((s) => ({
|
|
351
|
+
id: s.id,
|
|
352
|
+
name: s.metadata?.name ?? s.metadata?.path?.split("/").pop() ?? s.id.slice(0, 8),
|
|
353
|
+
path: s.metadata?.path ?? "",
|
|
354
|
+
host: s.metadata?.host ?? "",
|
|
355
|
+
active: s.active,
|
|
356
|
+
activeAt: s.activeAt,
|
|
357
|
+
createdAt: s.createdAt,
|
|
358
|
+
updatedAt: s.updatedAt,
|
|
359
|
+
summary: s.metadata?.summary?.text,
|
|
360
|
+
lifecycleState: s.metadata?.lifecycleState,
|
|
361
|
+
hasPendingPermission: !!(s.agentState?.requests && Object.keys(s.agentState.requests).length > 0),
|
|
362
|
+
pendingRequests: s.agentState?.requests ?? {},
|
|
363
|
+
activity: syncEngine.state.activity.get(s.id) ?? null
|
|
364
|
+
}));
|
|
365
|
+
return { sessions };
|
|
366
|
+
});
|
|
367
|
+
fastify.get("/sessions/:id/messages", async (request) => {
|
|
368
|
+
const messages = await syncEngine.loadMessages(request.params.id);
|
|
369
|
+
return { messages };
|
|
370
|
+
});
|
|
371
|
+
fastify.post("/send-message", async (request) => {
|
|
372
|
+
const { sessionId, text } = request.body;
|
|
373
|
+
const session = syncEngine.state.sessions.find((s) => s.id === sessionId);
|
|
374
|
+
if (!session) return { success: false, error: "Session not found" };
|
|
375
|
+
const content = {
|
|
376
|
+
role: "user",
|
|
377
|
+
content: { type: "text", text },
|
|
378
|
+
meta: { sentFrom: "cli" }
|
|
379
|
+
};
|
|
380
|
+
const encrypted = encryptToBase64(session.encryption, content);
|
|
381
|
+
const socket = syncEngine.getSocket();
|
|
382
|
+
if (!socket) return { success: false, error: "Not connected" };
|
|
383
|
+
socket.sendMessage(sessionId, encrypted);
|
|
384
|
+
return { success: true };
|
|
385
|
+
});
|
|
386
|
+
fastify.post("/approve-permission", async (request) => {
|
|
387
|
+
const { sessionId, requestId, decision } = request.body;
|
|
388
|
+
const session = syncEngine.state.sessions.find((s) => s.id === sessionId);
|
|
389
|
+
if (!session) return { success: false, error: "Session not found" };
|
|
390
|
+
const socket = syncEngine.getSocket();
|
|
391
|
+
if (!socket) return { success: false, error: "Not connected" };
|
|
392
|
+
const params = {
|
|
393
|
+
id: requestId,
|
|
394
|
+
approved: true,
|
|
395
|
+
decision: decision ?? "approved"
|
|
396
|
+
};
|
|
397
|
+
const encrypted = encryptToBase64(session.encryption, params);
|
|
398
|
+
const result = await socket.rpcCall(`${sessionId}:permission`, encrypted);
|
|
399
|
+
return { success: true, result };
|
|
400
|
+
});
|
|
401
|
+
fastify.post("/deny-permission", async (request) => {
|
|
402
|
+
const { sessionId, requestId } = request.body;
|
|
403
|
+
const session = syncEngine.state.sessions.find((s) => s.id === sessionId);
|
|
404
|
+
if (!session) return { success: false, error: "Session not found" };
|
|
405
|
+
const socket = syncEngine.getSocket();
|
|
406
|
+
if (!socket) return { success: false, error: "Not connected" };
|
|
407
|
+
const params = {
|
|
408
|
+
id: requestId,
|
|
409
|
+
approved: false,
|
|
410
|
+
decision: "denied"
|
|
411
|
+
};
|
|
412
|
+
const encrypted = encryptToBase64(session.encryption, params);
|
|
413
|
+
const result = await socket.rpcCall(`${sessionId}:permission`, encrypted);
|
|
414
|
+
return { success: true, result };
|
|
415
|
+
});
|
|
416
|
+
fastify.post("/spawn-session", async (request) => {
|
|
417
|
+
return { success: false, error: "Not implemented \u2014 use Claude Code directly" };
|
|
418
|
+
});
|
|
419
|
+
fastify.post("/stop-session", async (request) => {
|
|
420
|
+
return { success: false, error: "Not implemented" };
|
|
421
|
+
});
|
|
422
|
+
return fastify;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// src/daemon/index.ts
|
|
426
|
+
async function main() {
|
|
427
|
+
console.log("[Daemon] Starting...");
|
|
428
|
+
const creds = await loadCredentials();
|
|
429
|
+
if (!creds) {
|
|
430
|
+
console.error("[Daemon] No credentials found. Run `codesail login` first.");
|
|
431
|
+
process.exit(1);
|
|
432
|
+
}
|
|
433
|
+
const masterSecret = decodeBase64(creds.masterSecret);
|
|
434
|
+
const serverURL = creds.serverURL ?? DEFAULT_SERVER_URL;
|
|
435
|
+
const syncEngine = new SyncEngine(masterSecret, creds.token, serverURL);
|
|
436
|
+
await syncEngine.start();
|
|
437
|
+
console.log("[Daemon] Sync engine started");
|
|
438
|
+
const server = await createDaemonServer(syncEngine);
|
|
439
|
+
const port = await new Promise((resolve, reject) => {
|
|
440
|
+
server.listen({ port: 0, host: "127.0.0.1" }, (err, address) => {
|
|
441
|
+
if (err) return reject(err);
|
|
442
|
+
const url = new URL(address);
|
|
443
|
+
resolve(parseInt(url.port));
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
console.log(`[Daemon] HTTP server listening on port ${port}`);
|
|
447
|
+
await writeDaemonState({ httpPort: port, pid: process.pid });
|
|
448
|
+
console.log("[Daemon] State file written");
|
|
449
|
+
const cleanup = async () => {
|
|
450
|
+
console.log("[Daemon] Shutting down...");
|
|
451
|
+
syncEngine.stop();
|
|
452
|
+
await server.close();
|
|
453
|
+
await removeDaemonState();
|
|
454
|
+
process.exit(0);
|
|
455
|
+
};
|
|
456
|
+
process.on("SIGINT", cleanup);
|
|
457
|
+
process.on("SIGTERM", cleanup);
|
|
458
|
+
console.log("[Daemon] Ready (PID: " + process.pid + ")");
|
|
459
|
+
}
|
|
460
|
+
main().catch((err) => {
|
|
461
|
+
console.error("[Daemon] Fatal error:", err);
|
|
462
|
+
process.exit(1);
|
|
463
|
+
});
|
|
464
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/types/update.ts","../../src/types/message.ts","../../src/daemon/sync.ts","../../src/daemon/server.ts","../../src/daemon/index.ts"],"sourcesContent":["import type { EncryptedMessageContent } from './message.js';\n\n/** Permission request from the agent */\nexport interface PermissionRequest {\n tool: string;\n arguments?: unknown;\n createdAt: number; // epoch ms\n}\n\n/** Completed permission request */\nexport interface CompletedPermissionRequest {\n tool: string;\n arguments?: unknown;\n createdAt: number;\n completedAt: number;\n status: string; // \"canceled\" | \"denied\" | \"approved\"\n reason?: string;\n mode?: string;\n decision?: string; // \"approved\" | \"approved_for_session\" | \"denied\" | \"abort\"\n allowTools?: string[];\n}\n\n/** Agent state for a session */\nexport interface AgentState {\n controlledByUser?: boolean;\n requests?: Record<string, PermissionRequest>;\n completedRequests?: Record<string, CompletedPermissionRequest>;\n}\n\n/** Socket.IO update event payload */\nexport interface UpdatePayload {\n id: string;\n seq: number;\n body: UpdateBody;\n createdAt: number; // epoch ms\n}\n\nexport type UpdateBody =\n | { t: 'new-message'; sessionId: string; messageId: string; messageSeq: number; encryptedContent: EncryptedMessageContent }\n | { t: 'update-session'; sessionId: string; metadata?: VersionedValue; agentState?: VersionedValue }\n | { t: 'update-machine'; machineId: string; [key: string]: unknown }\n | { t: 'new-session'; sessionId: string; [key: string]: unknown }\n | { t: 'unknown' };\n\nexport interface VersionedValue {\n version: number;\n value: string; // base64(encrypted)\n}\n\n/** Ephemeral activity event */\nexport interface EphemeralEvent {\n type: string; // \"activity\"\n id: string; // session ID\n active: boolean;\n activeAt: number;\n thinking: boolean;\n}\n\n/** Parse raw update data from Socket.IO */\nexport function parseUpdate(data: unknown): UpdatePayload | null {\n if (!data || typeof data !== 'object') return null;\n const obj = data as Record<string, unknown>;\n\n const id = obj.id as string;\n const seq = obj.seq as number;\n const createdAt = obj.createdAt as number;\n const body = obj.body as Record<string, unknown> | undefined;\n\n if (!body || typeof body.t !== 'string') return null;\n\n switch (body.t) {\n case 'new-message':\n return {\n id, seq, createdAt,\n body: {\n t: 'new-message',\n sessionId: body.sessionId as string,\n messageId: body.messageId as string,\n messageSeq: body.messageSeq as number,\n encryptedContent: body.encryptedContent as EncryptedMessageContent,\n },\n };\n\n case 'update-session':\n return {\n id, seq, createdAt,\n body: {\n t: 'update-session',\n sessionId: body.sessionId as string,\n metadata: body.metadata as VersionedValue | undefined,\n agentState: body.agentState as VersionedValue | undefined,\n },\n };\n\n case 'update-machine':\n return {\n id, seq, createdAt,\n body: { t: 'update-machine', machineId: body.machineId as string, ...body },\n };\n\n case 'new-session':\n return {\n id, seq, createdAt,\n body: { t: 'new-session', sessionId: body.sessionId as string, ...body },\n };\n\n default:\n return { id, seq, createdAt, body: { t: 'unknown' } };\n }\n}\n\n/** Parse ephemeral event from Socket.IO */\nexport function parseEphemeral(data: unknown): EphemeralEvent | null {\n if (!data || typeof data !== 'object') return null;\n const obj = data as Record<string, unknown>;\n if (obj.type !== 'activity') return null;\n return {\n type: 'activity',\n id: obj.id as string,\n active: obj.active === true,\n activeAt: (obj.activeAt as number) ?? Date.now(),\n thinking: obj.thinking === true,\n };\n}\n","/** Wire format: encrypted message content from server */\nexport interface EncryptedMessageContent {\n c: string; // base64 encrypted content\n t: string; // \"encrypted\"\n}\n\n/** Raw message from server */\nexport interface RawMessage {\n id: string;\n seq: number;\n content: EncryptedMessageContent;\n localId: string | null;\n createdAt: number; // epoch ms\n updatedAt: number;\n}\n\n/** Decrypted message */\nexport interface DecryptedMessage {\n id: string;\n seq: number;\n localId: string | null;\n content: MessageContent | null;\n createdAt: number; // epoch ms\n}\n\n/** Top-level message content after decryption */\nexport type MessageContent =\n | { type: 'user'; role: 'user'; text: string; meta?: MessageMeta }\n | { type: 'agent'; role: 'agent'; content: AgentRecord; meta?: MessageMeta }\n | { type: 'event'; eventType: string; data: Record<string, unknown> };\n\nexport interface MessageMeta {\n sentFrom?: string;\n permissionMode?: string;\n model?: string;\n fallbackModel?: string;\n customSystemPrompt?: string;\n appendSystemPrompt?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n}\n\nexport type AgentRecord =\n | { type: 'output'; data: AgentOutputData }\n | { type: 'event'; data: AgentEventData }\n | { type: 'acp'; provider: string; data: ACPData }\n | { type: 'unknown' };\n\nexport interface AgentOutputData {\n type: string; // \"assistant\" | \"user\" | \"summary\" | \"system\" | \"result\"\n raw: Record<string, unknown>;\n isSidechain: boolean;\n isMeta: boolean;\n uuid?: string;\n messageText?: string;\n}\n\nexport interface AgentEventData {\n type: string;\n raw: Record<string, unknown>;\n}\n\nexport interface ACPData {\n type: string;\n raw: Record<string, unknown>;\n toolName?: string;\n messageText?: string;\n}\n\n/** Parse raw decrypted JSON into MessageContent */\nexport function parseMessageContent(json: unknown): MessageContent | null {\n if (!json || typeof json !== 'object') return null;\n const dict = json as Record<string, unknown>;\n const role = dict.role as string | undefined;\n\n if (role === 'user') {\n const content = dict.content as Record<string, unknown> | undefined;\n if (!content || content.type !== 'text' || typeof content.text !== 'string') return null;\n return {\n type: 'user',\n role: 'user',\n text: content.text,\n meta: dict.meta as MessageMeta | undefined,\n };\n }\n\n if (role === 'agent') {\n const content = dict.content as Record<string, unknown> | undefined;\n if (!content || typeof content.type !== 'string') return null;\n const meta = dict.meta as MessageMeta | undefined;\n\n if (content.type === 'output') {\n const data = content.data as Record<string, unknown> | undefined;\n if (!data || typeof data.type !== 'string') return null;\n const messageText = extractMessageText(data);\n return {\n type: 'agent',\n role: 'agent',\n content: {\n type: 'output',\n data: {\n type: data.type as string,\n raw: data,\n isSidechain: data.isSidechain === true,\n isMeta: data.isMeta === true,\n uuid: data.uuid as string | undefined,\n messageText,\n },\n },\n meta,\n };\n }\n\n if (content.type === 'event') {\n const data = content.data as Record<string, unknown> | undefined;\n if (!data || typeof data.type !== 'string') return null;\n return {\n type: 'event',\n eventType: data.type as string,\n data,\n };\n }\n\n if (content.type === 'acp') {\n const provider = content.provider as string | undefined;\n const data = content.data as Record<string, unknown> | undefined;\n if (!provider || !data || typeof data.type !== 'string') return null;\n return {\n type: 'agent',\n role: 'agent',\n content: {\n type: 'acp',\n provider,\n data: {\n type: data.type as string,\n raw: data,\n toolName: (data.name ?? data.toolName) as string | undefined,\n messageText: (data.message ?? data.text) as string | undefined,\n },\n },\n meta,\n };\n }\n\n return null;\n }\n\n return null;\n}\n\nfunction extractMessageText(data: Record<string, unknown>): string | undefined {\n const message = data.message as Record<string, unknown> | undefined;\n if (!message) return undefined;\n\n if (typeof message.content === 'string') return message.content;\n if (Array.isArray(message.content)) {\n const texts = (message.content as Array<Record<string, unknown>>)\n .filter(item => item.type === 'text' && typeof item.text === 'string')\n .map(item => item.text as string);\n return texts.length > 0 ? texts.join('\\n') : undefined;\n }\n return undefined;\n}\n","import { decodeBase64 } from '../core/crypto/nacl.js';\nimport { resolveSessionEncryption, decryptFromBase64, decryptValue } from '../core/crypto/encryption.js';\nimport type { EncryptionManager } from '../core/crypto/encryption.js';\nimport { createSocketClient, type SocketClient } from '../core/socket.js';\nimport { fetchSessions, fetchMessages } from '../core/api.js';\nimport { parseUpdate, parseEphemeral, type AgentState, type VersionedValue } from '../types/update.js';\nimport { parseMessageContent, type DecryptedMessage } from '../types/message.js';\nimport type { Session, SessionMetadata, RawSession } from '../types/session.js';\n\nexport interface SyncState {\n sessions: Session[];\n messagesBySession: Map<string, DecryptedMessage[]>;\n activity: Map<string, { isActive: boolean; isThinking: boolean; lastActiveAt: number }>;\n}\n\nexport class SyncEngine {\n private masterSecret: Uint8Array;\n private token: string;\n private serverURL: string;\n private socketClient: SocketClient | null = null;\n state: SyncState = {\n sessions: [],\n messagesBySession: new Map(),\n activity: new Map(),\n };\n\n constructor(masterSecret: Uint8Array, token: string, serverURL: string) {\n this.masterSecret = masterSecret;\n this.token = token;\n this.serverURL = serverURL;\n }\n\n async start(): Promise<void> {\n this.socketClient = createSocketClient(this.serverURL, this.token);\n\n this.socketClient.onConnect(() => {\n console.log('[Sync] Socket connected');\n this.refreshSessions().catch(err => console.error('[Sync] Refresh error:', err));\n });\n\n this.socketClient.onDisconnect((reason) => {\n console.log('[Sync] Socket disconnected:', reason);\n });\n\n this.socketClient.onUpdate((data) => this.handleUpdate(data));\n this.socketClient.onEphemeral((data) => this.handleEphemeral(data));\n\n this.socketClient.connect();\n await this.refreshSessions();\n }\n\n stop(): void {\n this.socketClient?.disconnect();\n this.socketClient = null;\n }\n\n getSocket(): SocketClient | null {\n return this.socketClient;\n }\n\n async refreshSessions(): Promise<void> {\n const rawSessions = await fetchSessions(this.token, this.serverURL);\n this.state.sessions = this.processSessions(rawSessions);\n }\n\n private processSessions(rawSessions: RawSession[]): Session[] {\n const results: Session[] = [];\n\n for (const raw of rawSessions) {\n try {\n const encryption = resolveSessionEncryption(raw.dataEncryptionKey, this.masterSecret);\n\n // Decrypt metadata\n let metadata: SessionMetadata | null = null;\n try {\n const metaData = decodeBase64(raw.metadata);\n metadata = decryptValue(encryption, metaData) as SessionMetadata;\n } catch {\n // metadata decryption failed\n }\n\n // Decrypt agent state\n let agentState: AgentState | null = null;\n if (raw.agentState) {\n try {\n const stateData = decodeBase64(raw.agentState);\n agentState = decryptValue(encryption, stateData) as AgentState;\n } catch {\n // agent state decryption failed\n }\n }\n\n results.push({\n id: raw.id,\n seq: raw.seq,\n metadata,\n metadataVersion: raw.metadataVersion,\n agentState,\n agentStateVersion: raw.agentStateVersion,\n encryption,\n active: raw.active ?? true,\n activeAt: raw.activeAt ?? raw.updatedAt,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n dataEncryptionKey: raw.dataEncryptionKey,\n });\n } catch (err) {\n console.error(`[Sync] Failed to process session ${raw.id}:`, err);\n }\n }\n\n return results.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async loadMessages(sessionId: string): Promise<DecryptedMessage[]> {\n const session = this.state.sessions.find(s => s.id === sessionId);\n if (!session) return [];\n\n const rawMessages = await fetchMessages(sessionId, this.token, this.serverURL);\n const decrypted: DecryptedMessage[] = [];\n\n for (const raw of rawMessages) {\n if (raw.content.t !== 'encrypted') continue;\n try {\n const json = decryptFromBase64(session.encryption, raw.content.c);\n const content = parseMessageContent(json);\n decrypted.push({\n id: raw.id,\n seq: raw.seq,\n localId: raw.localId,\n content,\n createdAt: raw.createdAt,\n });\n } catch {\n // Skip messages that fail to decrypt\n }\n }\n\n this.state.messagesBySession.set(sessionId, decrypted);\n return decrypted;\n }\n\n private handleUpdate(data: unknown): void {\n const update = parseUpdate(data);\n if (!update) return;\n\n switch (update.body.t) {\n case 'new-message': {\n const { sessionId, messageId, messageSeq, encryptedContent } = update.body;\n const session = this.state.sessions.find(s => s.id === sessionId);\n if (!session || encryptedContent.t !== 'encrypted') break;\n try {\n const json = decryptFromBase64(session.encryption, encryptedContent.c);\n const content = parseMessageContent(json);\n const msg: DecryptedMessage = {\n id: messageId,\n seq: messageSeq,\n localId: null,\n content,\n createdAt: update.createdAt,\n };\n const existing = this.state.messagesBySession.get(sessionId) ?? [];\n if (!existing.some(m => m.id === messageId)) {\n existing.push(msg);\n existing.sort((a, b) => a.seq - b.seq);\n this.state.messagesBySession.set(sessionId, existing);\n }\n } catch {\n // decrypt failed\n }\n break;\n }\n\n case 'update-session': {\n const { sessionId, metadata, agentState } = update.body;\n const idx = this.state.sessions.findIndex(s => s.id === sessionId);\n if (idx === -1) break;\n const session = this.state.sessions[idx];\n\n if (metadata && metadata.version > session.metadataVersion) {\n try {\n const metaData = decodeBase64(metadata.value);\n const decoded = decryptValue(session.encryption, metaData) as SessionMetadata;\n session.metadata = decoded;\n session.metadataVersion = metadata.version;\n } catch { /* ignore */ }\n }\n\n if (agentState && agentState.version > session.agentStateVersion) {\n try {\n const stateData = decodeBase64(agentState.value);\n const decoded = decryptValue(session.encryption, stateData) as AgentState;\n session.agentState = decoded;\n session.agentStateVersion = agentState.version;\n } catch { /* ignore */ }\n }\n\n this.state.sessions[idx] = session;\n break;\n }\n\n case 'new-session':\n // Refresh all sessions to pick up the new one\n this.refreshSessions().catch(err => console.error('[Sync] Refresh error:', err));\n break;\n }\n }\n\n private handleEphemeral(data: unknown): void {\n const event = parseEphemeral(data);\n if (!event || event.type !== 'activity') return;\n this.state.activity.set(event.id, {\n isActive: event.active,\n isThinking: event.thinking,\n lastActiveAt: event.activeAt,\n });\n }\n}\n","import Fastify from 'fastify';\nimport type { SyncEngine } from './sync.js';\nimport { encryptToBase64 } from '../core/crypto/encryption.js';\n\nexport async function createDaemonServer(syncEngine: SyncEngine) {\n const fastify = Fastify({ logger: false });\n\n // GET /sessions — list decrypted sessions\n fastify.get('/sessions', async () => {\n const sessions = syncEngine.state.sessions.map(s => ({\n id: s.id,\n name: s.metadata?.name ?? s.metadata?.path?.split('/').pop() ?? s.id.slice(0, 8),\n path: s.metadata?.path ?? '',\n host: s.metadata?.host ?? '',\n active: s.active,\n activeAt: s.activeAt,\n createdAt: s.createdAt,\n updatedAt: s.updatedAt,\n summary: s.metadata?.summary?.text,\n lifecycleState: s.metadata?.lifecycleState,\n hasPendingPermission: !!(s.agentState?.requests && Object.keys(s.agentState.requests).length > 0),\n pendingRequests: s.agentState?.requests ?? {},\n activity: syncEngine.state.activity.get(s.id) ?? null,\n }));\n return { sessions };\n });\n\n // GET /sessions/:id/messages — fetch & decrypt messages\n fastify.get<{ Params: { id: string } }>('/sessions/:id/messages', async (request) => {\n const messages = await syncEngine.loadMessages(request.params.id);\n return { messages };\n });\n\n // POST /send-message — send encrypted message to session\n fastify.post<{ Body: { sessionId: string; text: string } }>('/send-message', async (request) => {\n const { sessionId, text } = request.body;\n const session = syncEngine.state.sessions.find(s => s.id === sessionId);\n if (!session) return { success: false, error: 'Session not found' };\n\n const content = {\n role: 'user',\n content: { type: 'text', text },\n meta: { sentFrom: 'cli' },\n };\n\n const encrypted = encryptToBase64(session.encryption, content);\n const socket = syncEngine.getSocket();\n if (!socket) return { success: false, error: 'Not connected' };\n\n socket.sendMessage(sessionId, encrypted);\n return { success: true };\n });\n\n // POST /approve-permission — approve pending permission\n fastify.post<{ Body: { sessionId: string; requestId: string; decision?: string } }>('/approve-permission', async (request) => {\n const { sessionId, requestId, decision } = request.body;\n const session = syncEngine.state.sessions.find(s => s.id === sessionId);\n if (!session) return { success: false, error: 'Session not found' };\n\n const socket = syncEngine.getSocket();\n if (!socket) return { success: false, error: 'Not connected' };\n\n const params = {\n id: requestId,\n approved: true,\n decision: decision ?? 'approved',\n };\n const encrypted = encryptToBase64(session.encryption, params);\n const result = await socket.rpcCall(`${sessionId}:permission`, encrypted);\n return { success: true, result };\n });\n\n // POST /deny-permission — deny pending permission\n fastify.post<{ Body: { sessionId: string; requestId: string } }>('/deny-permission', async (request) => {\n const { sessionId, requestId } = request.body;\n const session = syncEngine.state.sessions.find(s => s.id === sessionId);\n if (!session) return { success: false, error: 'Session not found' };\n\n const socket = syncEngine.getSocket();\n if (!socket) return { success: false, error: 'Not connected' };\n\n const params = {\n id: requestId,\n approved: false,\n decision: 'denied',\n };\n const encrypted = encryptToBase64(session.encryption, params);\n const result = await socket.rpcCall(`${sessionId}:permission`, encrypted);\n return { success: true, result };\n });\n\n // POST /spawn-session — placeholder for daemon-based session spawning\n fastify.post<{ Body: { directory: string } }>('/spawn-session', async (request) => {\n // TODO: implement actual session spawning\n return { success: false, error: 'Not implemented — use Claude Code directly' };\n });\n\n // POST /stop-session — placeholder\n fastify.post<{ Body: { sessionId: string } }>('/stop-session', async (request) => {\n return { success: false, error: 'Not implemented' };\n });\n\n return fastify;\n}\n","import { decodeBase64 } from '../core/crypto/nacl.js';\nimport { DEFAULT_SERVER_URL } from '../core/config.js';\nimport { loadCredentials } from '../storage/credentials.js';\nimport { SyncEngine } from './sync.js';\nimport { createDaemonServer } from './server.js';\nimport { writeDaemonState, removeDaemonState } from './state.js';\n\nasync function main() {\n console.log('[Daemon] Starting...');\n\n const creds = await loadCredentials();\n if (!creds) {\n console.error('[Daemon] No credentials found. Run `codesail login` first.');\n process.exit(1);\n }\n\n const masterSecret = decodeBase64(creds.masterSecret);\n const serverURL = creds.serverURL ?? DEFAULT_SERVER_URL;\n\n // Create sync engine\n const syncEngine = new SyncEngine(masterSecret, creds.token, serverURL);\n await syncEngine.start();\n console.log('[Daemon] Sync engine started');\n\n // Create HTTP server\n const server = await createDaemonServer(syncEngine);\n const port = await new Promise<number>((resolve, reject) => {\n server.listen({ port: 0, host: '127.0.0.1' }, (err, address) => {\n if (err) return reject(err);\n const url = new URL(address);\n resolve(parseInt(url.port));\n });\n });\n\n console.log(`[Daemon] HTTP server listening on port ${port}`);\n\n // Write state file\n await writeDaemonState({ httpPort: port, pid: process.pid });\n console.log('[Daemon] State file written');\n\n // Cleanup on exit\n const cleanup = async () => {\n console.log('[Daemon] Shutting down...');\n syncEngine.stop();\n await server.close();\n await removeDaemonState();\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Keep alive\n console.log('[Daemon] Ready (PID: ' + process.pid + ')');\n}\n\nmain().catch(err => {\n console.error('[Daemon] Fatal error:', err);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decryptFromBase64,
|
|
3
|
+
decryptRaw,
|
|
4
|
+
decryptValue,
|
|
5
|
+
encryptRaw,
|
|
6
|
+
encryptToBase64,
|
|
7
|
+
encryptValue,
|
|
8
|
+
resolveSessionEncryption
|
|
9
|
+
} from "./chunk-LWJDKIJF.js";
|
|
10
|
+
import "./chunk-HG54UP2Y.js";
|
|
11
|
+
export {
|
|
12
|
+
decryptFromBase64,
|
|
13
|
+
decryptRaw,
|
|
14
|
+
decryptValue,
|
|
15
|
+
encryptRaw,
|
|
16
|
+
encryptToBase64,
|
|
17
|
+
encryptValue,
|
|
18
|
+
resolveSessionEncryption
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=encryption-IBHFWEPA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|