@agent-link/server 0.1.40 → 0.1.42
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/context.d.ts +0 -3
- package/dist/context.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ws-agent.js +3 -35
- package/dist/ws-agent.js.map +1 -1
- package/dist/ws-client.js +2 -17
- package/dist/ws-client.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +4 -4
- package/web/modules/connection.js +1 -78
- package/web/modules/sidebar.js +3 -13
- package/web/style.css +2 -1
package/dist/context.d.ts
CHANGED
|
@@ -9,9 +9,6 @@ export interface AgentSession {
|
|
|
9
9
|
sessionKey: Uint8Array | null;
|
|
10
10
|
connectedAt: Date;
|
|
11
11
|
isAlive: boolean;
|
|
12
|
-
claudeSessionId: string | null;
|
|
13
|
-
processing: boolean;
|
|
14
|
-
messageBuffer: Record<string, unknown>[];
|
|
15
12
|
}
|
|
16
13
|
export interface WebClient {
|
|
17
14
|
ws: WebSocket;
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAuBrC,yCAAyC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -77,7 +77,7 @@ setInterval(() => {
|
|
|
77
77
|
if (!agent.isAlive) {
|
|
78
78
|
console.log(`[Heartbeat] Agent ${agent.name} timed out`);
|
|
79
79
|
agent.ws.terminate();
|
|
80
|
-
|
|
80
|
+
return;
|
|
81
81
|
}
|
|
82
82
|
agent.isAlive = false;
|
|
83
83
|
agent.ws.ping();
|
|
@@ -86,7 +86,7 @@ setInterval(() => {
|
|
|
86
86
|
if (!client.isAlive) {
|
|
87
87
|
client.ws.terminate();
|
|
88
88
|
webClients.delete(clientId);
|
|
89
|
-
|
|
89
|
+
return;
|
|
90
90
|
}
|
|
91
91
|
client.isAlive = false;
|
|
92
92
|
client.ws.ping();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ws-agent.js
CHANGED
|
@@ -22,9 +22,6 @@ export function handleAgentConnection(ws, req) {
|
|
|
22
22
|
sessionKey,
|
|
23
23
|
connectedAt: new Date(),
|
|
24
24
|
isAlive: true,
|
|
25
|
-
claudeSessionId: null,
|
|
26
|
-
processing: false,
|
|
27
|
-
messageBuffer: [],
|
|
28
25
|
};
|
|
29
26
|
agents.set(agentId, agent);
|
|
30
27
|
sessionToAgent.set(sessionId, agentId);
|
|
@@ -75,42 +72,13 @@ async function handleAgentMessage(agentId, raw) {
|
|
|
75
72
|
// Intercept workdir_changed to keep server state in sync
|
|
76
73
|
if (msg.type === 'workdir_changed' && typeof msg.workDir === 'string') {
|
|
77
74
|
agent.workDir = msg.workDir;
|
|
78
|
-
agent.claudeSessionId = null;
|
|
79
|
-
agent.processing = false;
|
|
80
|
-
agent.messageBuffer = [];
|
|
81
75
|
console.log(`[Agent] ${agent.name} changed workDir to: ${msg.workDir}`);
|
|
82
76
|
}
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
agent.claudeSessionId = msg.claudeSessionId;
|
|
86
|
-
}
|
|
87
|
-
// Track processing state
|
|
88
|
-
if (msg.type === 'turn_completed' || msg.type === 'execution_cancelled') {
|
|
89
|
-
agent.processing = false;
|
|
90
|
-
}
|
|
91
|
-
// Only mark as processing for actual content output, not the final result signal
|
|
92
|
-
if (msg.type === 'claude_output' && msg.data) {
|
|
93
|
-
const data = msg.data;
|
|
94
|
-
if (data.type !== 'result') {
|
|
95
|
-
agent.processing = true;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// Forward to connected web clients, or buffer if none are connected
|
|
99
|
-
let forwarded = false;
|
|
77
|
+
// Forward agent messages to all web clients connected to this session
|
|
78
|
+
// Re-encrypt with each client's own session key
|
|
100
79
|
for (const [, client] of webClients) {
|
|
101
80
|
if (client.sessionId === agent.sessionId && client.ws.readyState === WebSocket.OPEN) {
|
|
102
|
-
|
|
103
|
-
await encryptAndSend(client.ws, msg, client.sessionKey);
|
|
104
|
-
forwarded = true;
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
console.error(`[Agent] Failed to forward ${msg.type} to client ${client.clientId.slice(0, 8)}: ${err.message}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (!forwarded) {
|
|
112
|
-
if (agent.messageBuffer.length < 2000) {
|
|
113
|
-
agent.messageBuffer.push(msg);
|
|
81
|
+
encryptAndSend(client.ws, msg, client.sessionKey);
|
|
114
82
|
}
|
|
115
83
|
}
|
|
116
84
|
}
|
package/dist/ws-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,GAAoB;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAExD,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,MAAM,KAAK,GAAiB;QAC1B,EAAE;QACF,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,SAAS;QACT,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,GAAoB;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAExD,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,MAAM,KAAK,GAAiB;QAC1B,EAAE;QACF,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,SAAS;QACT,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,OAAO,eAAe,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1H,0EAA0E;IAC1E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,IAAI,EAAE,YAAY;QAClB,OAAO;QACP,SAAS;QACT,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;KAClC,CAAC,CAAC,CAAC;IAEJ,gFAAgF;IAChF,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9E,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE;gBACxB,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC5C,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;QAC1D,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvB,kDAAkD;QAClD,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9E,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACjB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,GAAW;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,yDAAyD;IACzD,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACtE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,sEAAsE;IACtE,gDAAgD;IAChD,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACpF,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/ws-client.js
CHANGED
|
@@ -34,24 +34,9 @@ export function handleWebConnection(ws, req) {
|
|
|
34
34
|
name: agent.name,
|
|
35
35
|
hostname: agent.hostname,
|
|
36
36
|
workDir: agent.workDir,
|
|
37
|
-
claudeSessionId: agent.claudeSessionId,
|
|
38
|
-
processing: agent.processing,
|
|
39
37
|
} : null,
|
|
40
38
|
}));
|
|
41
39
|
console.log(`[Web] Client ${clientId.slice(0, 8)} connected to session ${sessionId}, agent: ${agent ? agent.name : 'none'}`);
|
|
42
|
-
// Flush buffered messages that arrived while no web client was connected
|
|
43
|
-
// Send as a single batch to avoid per-message encryption overhead on the client
|
|
44
|
-
if (agent && agent.messageBuffer.length > 0) {
|
|
45
|
-
console.log(`[Web] Flushing ${agent.messageBuffer.length} buffered messages to ${clientId.slice(0, 8)}`);
|
|
46
|
-
const buffered = agent.messageBuffer;
|
|
47
|
-
agent.messageBuffer = [];
|
|
48
|
-
encryptAndSend(client.ws, {
|
|
49
|
-
type: 'buffered_messages',
|
|
50
|
-
messages: buffered,
|
|
51
|
-
}, client.sessionKey).catch(err => {
|
|
52
|
-
console.error(`[Web] Failed to flush buffered messages to ${clientId.slice(0, 8)}:`, err.message);
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
40
|
ws.on('message', (data) => {
|
|
56
41
|
handleWebMessage(clientId, data.toString());
|
|
57
42
|
});
|
|
@@ -76,10 +61,10 @@ async function handleWebMessage(clientId, raw) {
|
|
|
76
61
|
const agentId = sessionToAgent.get(client.sessionId);
|
|
77
62
|
const agent = agentId ? agents.get(agentId) : undefined;
|
|
78
63
|
if (!agent || agent.ws.readyState !== WebSocket.OPEN) {
|
|
79
|
-
|
|
64
|
+
encryptAndSend(client.ws, { type: 'error', message: 'Agent not connected' }, client.sessionKey);
|
|
80
65
|
return;
|
|
81
66
|
}
|
|
82
67
|
// Forward web client message to agent, encrypted with agent's session key
|
|
83
|
-
|
|
68
|
+
encryptAndSend(agent.ws, msg, agent.sessionKey);
|
|
84
69
|
}
|
|
85
70
|
//# sourceMappingURL=ws-client.js.map
|
package/dist/ws-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,GAEX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,mBAAmB,CAAC,EAAa,EAAE,GAAoB;IACrE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAE9B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACzE,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,MAAM,MAAM,GAAc;QACxB,EAAE;QACF,QAAQ;QACR,SAAS;QACT,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEjC,qFAAqF;IACrF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ;QACR,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;QACjC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -124,7 +124,7 @@ const App = {
|
|
|
124
124
|
|
|
125
125
|
const sidebar = createSidebar({
|
|
126
126
|
wsSend: (msg) => _wsSend(msg),
|
|
127
|
-
messages, isProcessing,
|
|
127
|
+
messages, isProcessing, sidebarOpen,
|
|
128
128
|
historySessions, currentClaudeSessionId, needsResume,
|
|
129
129
|
loadingSessions, loadingHistory, workDir, visibleLimit,
|
|
130
130
|
folderPickerOpen, folderPickerPath, folderPickerEntries,
|
|
@@ -134,7 +134,7 @@ const App = {
|
|
|
134
134
|
const { connect, wsSend, closeWs } = createConnection({
|
|
135
135
|
status, agentName, hostname, workDir, sessionId, error,
|
|
136
136
|
messages, isProcessing, isCompacting, visibleLimit,
|
|
137
|
-
historySessions, currentClaudeSessionId,
|
|
137
|
+
historySessions, currentClaudeSessionId, loadingSessions, loadingHistory,
|
|
138
138
|
folderPickerLoading, folderPickerEntries, folderPickerPath,
|
|
139
139
|
streaming, sidebar, scrollToBottom,
|
|
140
140
|
});
|
|
@@ -316,7 +316,7 @@ const App = {
|
|
|
316
316
|
</div>
|
|
317
317
|
<div class="sidebar-workdir-header">
|
|
318
318
|
<div class="sidebar-workdir-label">Working Directory</div>
|
|
319
|
-
<button class="sidebar-change-dir-btn" @click="openFolderPicker" title="Change working directory">
|
|
319
|
+
<button class="sidebar-change-dir-btn" @click="openFolderPicker" title="Change working directory" :disabled="isProcessing">
|
|
320
320
|
<svg viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>
|
|
321
321
|
</button>
|
|
322
322
|
</div>
|
|
@@ -332,7 +332,7 @@ const App = {
|
|
|
332
332
|
</button>
|
|
333
333
|
</div>
|
|
334
334
|
|
|
335
|
-
<button class="new-conversation-btn" @click="newConversation">
|
|
335
|
+
<button class="new-conversation-btn" @click="newConversation" :disabled="isProcessing">
|
|
336
336
|
<svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>
|
|
337
337
|
New conversation
|
|
338
338
|
</button>
|
|
@@ -14,7 +14,7 @@ export function createConnection(deps) {
|
|
|
14
14
|
const {
|
|
15
15
|
status, agentName, hostname, workDir, sessionId, error,
|
|
16
16
|
messages, isProcessing, isCompacting, visibleLimit,
|
|
17
|
-
historySessions, currentClaudeSessionId,
|
|
17
|
+
historySessions, currentClaudeSessionId, loadingSessions, loadingHistory,
|
|
18
18
|
folderPickerLoading, folderPickerEntries, folderPickerPath,
|
|
19
19
|
streaming, sidebar,
|
|
20
20
|
scrollToBottom,
|
|
@@ -141,15 +141,6 @@ export function createConnection(deps) {
|
|
|
141
141
|
agentName.value = msg.agent.name;
|
|
142
142
|
hostname.value = msg.agent.hostname || '';
|
|
143
143
|
workDir.value = msg.agent.workDir;
|
|
144
|
-
// Restore processing state (e.g. page refresh mid-turn)
|
|
145
|
-
if (msg.agent.processing) {
|
|
146
|
-
isProcessing.value = true;
|
|
147
|
-
}
|
|
148
|
-
// Restore active Claude session so next message resumes it
|
|
149
|
-
if (msg.agent.claudeSessionId) {
|
|
150
|
-
currentClaudeSessionId.value = msg.agent.claudeSessionId;
|
|
151
|
-
needsResume.value = true;
|
|
152
|
-
}
|
|
153
144
|
const savedDir = localStorage.getItem('agentlink-workdir');
|
|
154
145
|
if (savedDir && savedDir !== msg.agent.workDir) {
|
|
155
146
|
wsSend({ type: 'change_workdir', workDir: savedDir });
|
|
@@ -238,74 +229,9 @@ export function createConnection(deps) {
|
|
|
238
229
|
timestamp: new Date(),
|
|
239
230
|
});
|
|
240
231
|
scrollToBottom();
|
|
241
|
-
} else if (msg.type === 'buffered_messages' && Array.isArray(msg.messages)) {
|
|
242
|
-
// Replay buffered messages instantly (no streaming animation)
|
|
243
|
-
let textAcc = '';
|
|
244
|
-
const toolBatch = [];
|
|
245
|
-
for (const m of msg.messages) {
|
|
246
|
-
if (m.type === 'session_started' && m.claudeSessionId) {
|
|
247
|
-
currentClaudeSessionId.value = m.claudeSessionId;
|
|
248
|
-
} else if (m.type === 'claude_output' && m.data) {
|
|
249
|
-
const data = m.data;
|
|
250
|
-
if (data.type === 'content_block_delta' && data.delta) {
|
|
251
|
-
textAcc += data.delta;
|
|
252
|
-
} else if (data.type === 'tool_use' && data.tools) {
|
|
253
|
-
// Flush accumulated text before tools
|
|
254
|
-
if (textAcc) {
|
|
255
|
-
streaming.flushReveal();
|
|
256
|
-
finalizeStreamingMsg(scheduleHighlight);
|
|
257
|
-
messages.value.push({
|
|
258
|
-
id: streaming.nextId(), role: 'assistant',
|
|
259
|
-
content: textAcc, timestamp: new Date(),
|
|
260
|
-
});
|
|
261
|
-
textAcc = '';
|
|
262
|
-
}
|
|
263
|
-
for (const tool of data.tools) {
|
|
264
|
-
messages.value.push({
|
|
265
|
-
id: streaming.nextId(), role: 'tool',
|
|
266
|
-
toolId: tool.id, toolName: tool.name || 'unknown',
|
|
267
|
-
toolInput: tool.input ? JSON.stringify(tool.input, null, 2) : '',
|
|
268
|
-
hasResult: false, expanded: (tool.name === 'Edit' || tool.name === 'TodoWrite'), timestamp: new Date(),
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
} else if (data.type === 'user' && data.tool_use_result) {
|
|
272
|
-
const result = data.tool_use_result;
|
|
273
|
-
const results = Array.isArray(result) ? result : [result];
|
|
274
|
-
for (const r of results) {
|
|
275
|
-
const toolMsg = [...messages.value].reverse().find(
|
|
276
|
-
m2 => m2.role === 'tool' && m2.toolId === r.tool_use_id
|
|
277
|
-
);
|
|
278
|
-
if (toolMsg) {
|
|
279
|
-
toolMsg.toolOutput = typeof r.content === 'string'
|
|
280
|
-
? r.content : JSON.stringify(r.content, null, 2);
|
|
281
|
-
toolMsg.hasResult = true;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
} else if (m.type === 'turn_completed' || m.type === 'execution_cancelled') {
|
|
286
|
-
isProcessing.value = false;
|
|
287
|
-
isCompacting.value = false;
|
|
288
|
-
} else if (m.type === 'context_compaction') {
|
|
289
|
-
if (m.status === 'completed') isCompacting.value = false;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
// Flush remaining text
|
|
293
|
-
if (textAcc) {
|
|
294
|
-
streaming.flushReveal();
|
|
295
|
-
finalizeStreamingMsg(scheduleHighlight);
|
|
296
|
-
messages.value.push({
|
|
297
|
-
id: streaming.nextId(), role: 'assistant',
|
|
298
|
-
content: textAcc, timestamp: new Date(),
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
// Finalize so subsequent real-time messages create fresh streaming entries
|
|
302
|
-
finalizeStreamingMsg(scheduleHighlight);
|
|
303
|
-
scrollToBottom();
|
|
304
232
|
} else if (msg.type === 'sessions_list') {
|
|
305
233
|
historySessions.value = msg.sessions || [];
|
|
306
234
|
loadingSessions.value = false;
|
|
307
|
-
} else if (msg.type === 'session_started') {
|
|
308
|
-
currentClaudeSessionId.value = msg.claudeSessionId;
|
|
309
235
|
} else if (msg.type === 'conversation_resumed') {
|
|
310
236
|
currentClaudeSessionId.value = msg.claudeSessionId;
|
|
311
237
|
if (msg.history && Array.isArray(msg.history)) {
|
|
@@ -384,9 +310,6 @@ export function createConnection(deps) {
|
|
|
384
310
|
const wasConnected = status.value === 'Connected' || status.value === 'Connecting...';
|
|
385
311
|
isProcessing.value = false;
|
|
386
312
|
isCompacting.value = false;
|
|
387
|
-
// Finalize any in-flight streaming message so reconnect starts clean
|
|
388
|
-
streaming.flushReveal();
|
|
389
|
-
finalizeStreamingMsg(scheduleHighlight);
|
|
390
313
|
|
|
391
314
|
if (wasConnected || reconnectAttempts > 0) {
|
|
392
315
|
scheduleReconnect(scheduleHighlight);
|
package/web/modules/sidebar.js
CHANGED
|
@@ -7,7 +7,6 @@ const { computed } = Vue;
|
|
|
7
7
|
* @param {Function} deps.wsSend
|
|
8
8
|
* @param {import('vue').Ref} deps.messages
|
|
9
9
|
* @param {import('vue').Ref} deps.isProcessing
|
|
10
|
-
* @param {import('vue').Ref} deps.isCompacting
|
|
11
10
|
* @param {import('vue').Ref} deps.sidebarOpen
|
|
12
11
|
* @param {import('vue').Ref} deps.historySessions
|
|
13
12
|
* @param {import('vue').Ref} deps.currentClaudeSessionId
|
|
@@ -25,7 +24,7 @@ const { computed } = Vue;
|
|
|
25
24
|
*/
|
|
26
25
|
export function createSidebar(deps) {
|
|
27
26
|
const {
|
|
28
|
-
wsSend, messages, isProcessing,
|
|
27
|
+
wsSend, messages, isProcessing, sidebarOpen,
|
|
29
28
|
historySessions, currentClaudeSessionId, needsResume,
|
|
30
29
|
loadingSessions, loadingHistory, workDir, visibleLimit,
|
|
31
30
|
folderPickerOpen, folderPickerPath, folderPickerEntries,
|
|
@@ -40,12 +39,7 @@ export function createSidebar(deps) {
|
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
function resumeSession(session) {
|
|
43
|
-
if (
|
|
44
|
-
if (isProcessing.value || isCompacting.value) {
|
|
45
|
-
wsSend({ type: 'cancel_execution' });
|
|
46
|
-
isProcessing.value = false;
|
|
47
|
-
isCompacting.value = false;
|
|
48
|
-
}
|
|
42
|
+
if (isProcessing.value) return;
|
|
49
43
|
if (window.innerWidth <= 768) sidebarOpen.value = false;
|
|
50
44
|
messages.value = [];
|
|
51
45
|
visibleLimit.value = 50;
|
|
@@ -64,11 +58,7 @@ export function createSidebar(deps) {
|
|
|
64
58
|
}
|
|
65
59
|
|
|
66
60
|
function newConversation() {
|
|
67
|
-
if (isProcessing.value
|
|
68
|
-
wsSend({ type: 'cancel_execution' });
|
|
69
|
-
isProcessing.value = false;
|
|
70
|
-
isCompacting.value = false;
|
|
71
|
-
}
|
|
61
|
+
if (isProcessing.value) return;
|
|
72
62
|
if (window.innerWidth <= 768) sidebarOpen.value = false;
|
|
73
63
|
messages.value = [];
|
|
74
64
|
visibleLimit.value = 50;
|
package/web/style.css
CHANGED
|
@@ -1289,6 +1289,7 @@ body {
|
|
|
1289
1289
|
flex-shrink: 0;
|
|
1290
1290
|
padding: 0 1.5rem 1rem;
|
|
1291
1291
|
background: transparent;
|
|
1292
|
+
position: relative;
|
|
1292
1293
|
}
|
|
1293
1294
|
|
|
1294
1295
|
.input-card {
|
|
@@ -1809,7 +1810,7 @@ body {
|
|
|
1809
1810
|
|
|
1810
1811
|
/* Message area */
|
|
1811
1812
|
.message-list {
|
|
1812
|
-
padding: 0.75rem 0.75rem 0.
|
|
1813
|
+
padding: 0.75rem 0.75rem 0.5rem;
|
|
1813
1814
|
}
|
|
1814
1815
|
|
|
1815
1816
|
.message-list-inner {
|