@action-llama/action-llama 0.26.9 → 0.26.11
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/agents/bash-prefix.d.ts +1 -1
- package/dist/agents/bash-prefix.js +2 -2
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +12 -16
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/credential-setup.d.ts +1 -0
- package/dist/agents/credential-setup.d.ts.map +1 -1
- package/dist/agents/credential-setup.js +21 -0
- package/dist/agents/credential-setup.js.map +1 -1
- package/dist/agents/harness/claude-cli-harness.d.ts +15 -0
- package/dist/agents/harness/claude-cli-harness.d.ts.map +1 -0
- package/dist/agents/harness/claude-cli-harness.js +229 -0
- package/dist/agents/harness/claude-cli-harness.js.map +1 -0
- package/dist/agents/harness/consumer.d.ts +15 -0
- package/dist/agents/harness/consumer.d.ts.map +1 -0
- package/dist/agents/harness/consumer.js +115 -0
- package/dist/agents/harness/consumer.js.map +1 -0
- package/dist/agents/harness/factory.d.ts +9 -0
- package/dist/agents/harness/factory.d.ts.map +1 -0
- package/dist/agents/harness/factory.js +25 -0
- package/dist/agents/harness/factory.js.map +1 -0
- package/dist/agents/harness/index.d.ts +9 -0
- package/dist/agents/harness/index.d.ts.map +1 -0
- package/dist/agents/harness/index.js +5 -0
- package/dist/agents/harness/index.js.map +1 -0
- package/dist/agents/harness/pi-harness.d.ts +18 -0
- package/dist/agents/harness/pi-harness.d.ts.map +1 -0
- package/dist/agents/harness/pi-harness.js +203 -0
- package/dist/agents/harness/pi-harness.js.map +1 -0
- package/dist/agents/harness/types.d.ts +54 -0
- package/dist/agents/harness/types.d.ts.map +1 -0
- package/dist/agents/harness/types.js +2 -0
- package/dist/{chat → agents/harness}/types.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/run-agent.d.ts.map +1 -1
- package/dist/cli/commands/run-agent.js +12 -9
- package/dist/cli/commands/run-agent.js.map +1 -1
- package/dist/cli/commands/webhook.js +1 -5
- package/dist/cli/commands/webhook.js.map +1 -1
- package/dist/cli/main.js +0 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/control/routes/log-summary.d.ts.map +1 -1
- package/dist/control/routes/log-summary.js +26 -15
- package/dist/control/routes/log-summary.js.map +1 -1
- package/dist/control/routes/stats.d.ts.map +1 -1
- package/dist/control/routes/stats.js +1 -4
- package/dist/control/routes/stats.js.map +1 -1
- package/dist/events/cron-setup.d.ts +4 -0
- package/dist/events/cron-setup.d.ts.map +1 -1
- package/dist/events/cron-setup.js +10 -1
- package/dist/events/cron-setup.js.map +1 -1
- package/dist/events/webhook-setup.d.ts.map +1 -1
- package/dist/events/webhook-setup.js +16 -1
- package/dist/events/webhook-setup.js.map +1 -1
- package/dist/execution/dispatch-policy.d.ts +3 -3
- package/dist/execution/dispatch-policy.d.ts.map +1 -1
- package/dist/execution/dispatch-policy.js +4 -5
- package/dist/execution/dispatch-policy.js.map +1 -1
- package/dist/execution/execution.d.ts.map +1 -1
- package/dist/execution/execution.js +15 -7
- package/dist/execution/execution.js.map +1 -1
- package/dist/execution/lock-store.d.ts +4 -2
- package/dist/execution/lock-store.d.ts.map +1 -1
- package/dist/execution/lock-store.js +6 -8
- package/dist/execution/lock-store.js.map +1 -1
- package/dist/frontend/assets/index-CLzpDcLm.css +2 -0
- package/dist/frontend/assets/index-Dx2aJ_Db.js +16 -0
- package/dist/frontend/assets/index-Dx2aJ_Db.js.map +1 -0
- package/dist/frontend/index.html +2 -2
- package/dist/gateway/frontend.d.ts +2 -2
- package/dist/gateway/frontend.d.ts.map +1 -1
- package/dist/gateway/frontend.js +2 -4
- package/dist/gateway/frontend.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +3 -29
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/middleware/auth.d.ts +1 -1
- package/dist/gateway/middleware/auth.d.ts.map +1 -1
- package/dist/gateway/middleware/auth.js +2 -3
- package/dist/gateway/middleware/auth.js.map +1 -1
- package/dist/gateway/types.d.ts +0 -11
- package/dist/gateway/types.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.d.ts +0 -3
- package/dist/scheduler/gateway-setup.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.js +1 -43
- package/dist/scheduler/gateway-setup.js.map +1 -1
- package/dist/scheduler/index.js +5 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/shared/config/load-agent.d.ts.map +1 -1
- package/dist/shared/config/load-agent.js +10 -0
- package/dist/shared/config/load-agent.js.map +1 -1
- package/dist/shared/config/load-project.d.ts.map +1 -1
- package/dist/shared/config/load-project.js +8 -0
- package/dist/shared/config/load-project.js.map +1 -1
- package/dist/shared/config/types.d.ts +7 -1
- package/dist/shared/config/types.d.ts.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +0 -4
- package/dist/tui/App.js.map +1 -1
- package/dist/webhooks/types.d.ts +1 -0
- package/dist/webhooks/types.d.ts.map +1 -1
- package/docker/Dockerfile +2 -1
- package/package.json +1 -1
- package/dist/agents/chat-entry.d.ts +0 -9
- package/dist/agents/chat-entry.d.ts.map +0 -1
- package/dist/agents/chat-entry.js +0 -165
- package/dist/agents/chat-entry.js.map +0 -1
- package/dist/agents/session-factory.d.ts +0 -13
- package/dist/agents/session-factory.d.ts.map +0 -1
- package/dist/agents/session-factory.js +0 -28
- package/dist/agents/session-factory.js.map +0 -1
- package/dist/chat/container-launcher.d.ts +0 -38
- package/dist/chat/container-launcher.d.ts.map +0 -1
- package/dist/chat/container-launcher.js +0 -120
- package/dist/chat/container-launcher.js.map +0 -1
- package/dist/chat/event-mapper.d.ts +0 -27
- package/dist/chat/event-mapper.d.ts.map +0 -1
- package/dist/chat/event-mapper.js +0 -56
- package/dist/chat/event-mapper.js.map +0 -1
- package/dist/chat/ink-adapter.d.ts +0 -9
- package/dist/chat/ink-adapter.d.ts.map +0 -1
- package/dist/chat/ink-adapter.js +0 -120
- package/dist/chat/ink-adapter.js.map +0 -1
- package/dist/chat/local-transport.d.ts +0 -28
- package/dist/chat/local-transport.d.ts.map +0 -1
- package/dist/chat/local-transport.js +0 -68
- package/dist/chat/local-transport.js.map +0 -1
- package/dist/chat/remote-transport.d.ts +0 -30
- package/dist/chat/remote-transport.d.ts.map +0 -1
- package/dist/chat/remote-transport.js +0 -110
- package/dist/chat/remote-transport.js.map +0 -1
- package/dist/chat/routes.d.ts +0 -10
- package/dist/chat/routes.d.ts.map +0 -1
- package/dist/chat/routes.js +0 -94
- package/dist/chat/routes.js.map +0 -1
- package/dist/chat/session-manager.d.ts +0 -22
- package/dist/chat/session-manager.d.ts.map +0 -1
- package/dist/chat/session-manager.js +0 -77
- package/dist/chat/session-manager.js.map +0 -1
- package/dist/chat/transport.d.ts +0 -15
- package/dist/chat/transport.d.ts.map +0 -1
- package/dist/chat/transport.js +0 -5
- package/dist/chat/transport.js.map +0 -1
- package/dist/chat/types.d.ts +0 -51
- package/dist/chat/types.d.ts.map +0 -1
- package/dist/chat/types.js +0 -7
- package/dist/chat/validation.d.ts +0 -30
- package/dist/chat/validation.d.ts.map +0 -1
- package/dist/chat/validation.js +0 -79
- package/dist/chat/validation.js.map +0 -1
- package/dist/chat/ws-handler.d.ts +0 -32
- package/dist/chat/ws-handler.d.ts.map +0 -1
- package/dist/chat/ws-handler.js +0 -234
- package/dist/chat/ws-handler.js.map +0 -1
- package/dist/cli/commands/chat.d.ts +0 -7
- package/dist/cli/commands/chat.d.ts.map +0 -1
- package/dist/cli/commands/chat.js +0 -436
- package/dist/cli/commands/chat.js.map +0 -1
- package/dist/frontend/assets/index-5bHrqZ3-.css +0 -2
- package/dist/frontend/assets/index-Cp6JsW1Y.js +0 -16
- package/dist/frontend/assets/index-Cp6JsW1Y.js.map +0 -1
- package/dist/gateway/routes/chat.d.ts +0 -32
- package/dist/gateway/routes/chat.d.ts.map +0 -1
- package/dist/gateway/routes/chat.js +0 -24
- package/dist/gateway/routes/chat.js.map +0 -1
package/dist/chat/routes.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* REST API routes for chat session management.
|
|
3
|
-
*/
|
|
4
|
-
export function registerChatApiRoutes(app, sessionManager, launchCallback, stopCallback, logger) {
|
|
5
|
-
// Create a new chat session and launch a container (idempotent per agent)
|
|
6
|
-
app.post("/api/chat/sessions", async (c) => {
|
|
7
|
-
const body = await c.req.json().catch(() => ({}));
|
|
8
|
-
const agentName = body.agentName;
|
|
9
|
-
if (!agentName || typeof agentName !== "string") {
|
|
10
|
-
return c.json({ error: "agentName is required" }, 400);
|
|
11
|
-
}
|
|
12
|
-
// Return existing session for this agent if one exists (idempotent)
|
|
13
|
-
const existing = sessionManager.getSessionByAgent(agentName);
|
|
14
|
-
if (existing) {
|
|
15
|
-
logger?.info({ sessionId: existing.sessionId, agentName }, "returning existing chat session");
|
|
16
|
-
return c.json({ sessionId: existing.sessionId, created: false });
|
|
17
|
-
}
|
|
18
|
-
if (!sessionManager.canCreateSession()) {
|
|
19
|
-
return c.json({ error: "Chat session limit reached" }, 429);
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
const session = sessionManager.createSession(agentName);
|
|
23
|
-
logger?.info({ sessionId: session.sessionId, agentName }, "chat session created");
|
|
24
|
-
// Launch container asynchronously
|
|
25
|
-
launchCallback(agentName, session.sessionId).catch((err) => {
|
|
26
|
-
logger?.error({ sessionId: session.sessionId, err: err.message }, "failed to launch chat container");
|
|
27
|
-
sessionManager.removeSession(session.sessionId);
|
|
28
|
-
});
|
|
29
|
-
return c.json({ sessionId: session.sessionId, created: true });
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
return c.json({ error: err.message }, 500);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
// Clear chat context: stop old container (releases locks), create new session and container
|
|
36
|
-
app.post("/api/chat/sessions/:sessionId/clear", async (c) => {
|
|
37
|
-
const sessionId = c.req.param("sessionId");
|
|
38
|
-
const session = sessionManager.getSession(sessionId);
|
|
39
|
-
if (!session) {
|
|
40
|
-
return c.json({ error: "Session not found" }, 404);
|
|
41
|
-
}
|
|
42
|
-
const agentName = session.agentName;
|
|
43
|
-
// Stop old container (this releases locks via unregisterContainer)
|
|
44
|
-
try {
|
|
45
|
-
await stopCallback(sessionId);
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
logger?.warn({ sessionId, err: err.message }, "error stopping chat container during clear");
|
|
49
|
-
}
|
|
50
|
-
sessionManager.removeSession(sessionId);
|
|
51
|
-
// Create new session for the same agent
|
|
52
|
-
try {
|
|
53
|
-
const newSession = sessionManager.createSession(agentName);
|
|
54
|
-
logger?.info({ oldSessionId: sessionId, newSessionId: newSession.sessionId, agentName }, "chat context cleared");
|
|
55
|
-
launchCallback(agentName, newSession.sessionId).catch((err) => {
|
|
56
|
-
logger?.error({ sessionId: newSession.sessionId, err: err.message }, "failed to launch chat container after clear");
|
|
57
|
-
sessionManager.removeSession(newSession.sessionId);
|
|
58
|
-
});
|
|
59
|
-
return c.json({ sessionId: newSession.sessionId });
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
return c.json({ error: err.message }, 500);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
// Delete a chat session and stop its container
|
|
66
|
-
app.delete("/api/chat/sessions/:sessionId", async (c) => {
|
|
67
|
-
const sessionId = c.req.param("sessionId");
|
|
68
|
-
const session = sessionManager.getSession(sessionId);
|
|
69
|
-
if (!session) {
|
|
70
|
-
return c.json({ error: "Session not found" }, 404);
|
|
71
|
-
}
|
|
72
|
-
try {
|
|
73
|
-
await stopCallback(sessionId);
|
|
74
|
-
}
|
|
75
|
-
catch (err) {
|
|
76
|
-
logger?.warn({ sessionId, err: err.message }, "error stopping chat container");
|
|
77
|
-
}
|
|
78
|
-
sessionManager.removeSession(sessionId);
|
|
79
|
-
logger?.info({ sessionId }, "chat session deleted");
|
|
80
|
-
return c.json({ success: true });
|
|
81
|
-
});
|
|
82
|
-
// List active chat sessions
|
|
83
|
-
app.get("/api/chat/sessions", (c) => {
|
|
84
|
-
const sessions = sessionManager.listSessions().map((s) => ({
|
|
85
|
-
sessionId: s.sessionId,
|
|
86
|
-
agentName: s.agentName,
|
|
87
|
-
containerName: s.containerName,
|
|
88
|
-
createdAt: s.createdAt.toISOString(),
|
|
89
|
-
lastActivityAt: s.lastActivityAt.toISOString(),
|
|
90
|
-
}));
|
|
91
|
-
return c.json({ sessions });
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=routes.js.map
|
package/dist/chat/routes.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/chat/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages active chat sessions with cap enforcement and idle tracking.
|
|
3
|
-
*/
|
|
4
|
-
import type { ChatSession } from "./types.js";
|
|
5
|
-
export declare class ChatSessionManager {
|
|
6
|
-
private sessions;
|
|
7
|
-
private maxSessions;
|
|
8
|
-
constructor(maxSessions?: number);
|
|
9
|
-
canCreateSession(): boolean;
|
|
10
|
-
createSession(agentName: string): ChatSession;
|
|
11
|
-
getSession(sessionId: string): ChatSession | undefined;
|
|
12
|
-
removeSession(sessionId: string): boolean;
|
|
13
|
-
touchSession(sessionId: string): void;
|
|
14
|
-
setContainerName(sessionId: string, containerName: string): void;
|
|
15
|
-
setShutdownSecret(sessionId: string, secret: string): void;
|
|
16
|
-
getSessionByAgent(agentName: string): ChatSession | undefined;
|
|
17
|
-
/** Returns sessions that have been idle longer than the given timeout. */
|
|
18
|
-
getIdleSessions(timeoutMs: number): ChatSession[];
|
|
19
|
-
listSessions(): ChatSession[];
|
|
20
|
-
get size(): number;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/chat/session-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAIhC,gBAAgB,IAAI,OAAO;IAI3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW;IAc7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAItD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIzC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOrC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAOhE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO1D,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAO7D,0EAA0E;IAC1E,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAWjD,YAAY,IAAI,WAAW,EAAE;IAI7B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages active chat sessions with cap enforcement and idle tracking.
|
|
3
|
-
*/
|
|
4
|
-
import { randomUUID } from "crypto";
|
|
5
|
-
const DEFAULT_MAX_SESSIONS = 5;
|
|
6
|
-
export class ChatSessionManager {
|
|
7
|
-
sessions = new Map();
|
|
8
|
-
maxSessions;
|
|
9
|
-
constructor(maxSessions) {
|
|
10
|
-
this.maxSessions = maxSessions ?? DEFAULT_MAX_SESSIONS;
|
|
11
|
-
}
|
|
12
|
-
canCreateSession() {
|
|
13
|
-
return this.sessions.size < this.maxSessions;
|
|
14
|
-
}
|
|
15
|
-
createSession(agentName) {
|
|
16
|
-
if (!this.canCreateSession()) {
|
|
17
|
-
throw new Error(`Chat session limit reached (max ${this.maxSessions})`);
|
|
18
|
-
}
|
|
19
|
-
const session = {
|
|
20
|
-
sessionId: randomUUID(),
|
|
21
|
-
agentName,
|
|
22
|
-
createdAt: new Date(),
|
|
23
|
-
lastActivityAt: new Date(),
|
|
24
|
-
};
|
|
25
|
-
this.sessions.set(session.sessionId, session);
|
|
26
|
-
return session;
|
|
27
|
-
}
|
|
28
|
-
getSession(sessionId) {
|
|
29
|
-
return this.sessions.get(sessionId);
|
|
30
|
-
}
|
|
31
|
-
removeSession(sessionId) {
|
|
32
|
-
return this.sessions.delete(sessionId);
|
|
33
|
-
}
|
|
34
|
-
touchSession(sessionId) {
|
|
35
|
-
const session = this.sessions.get(sessionId);
|
|
36
|
-
if (session) {
|
|
37
|
-
session.lastActivityAt = new Date();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
setContainerName(sessionId, containerName) {
|
|
41
|
-
const session = this.sessions.get(sessionId);
|
|
42
|
-
if (session) {
|
|
43
|
-
session.containerName = containerName;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
setShutdownSecret(sessionId, secret) {
|
|
47
|
-
const session = this.sessions.get(sessionId);
|
|
48
|
-
if (session) {
|
|
49
|
-
session.shutdownSecret = secret;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
getSessionByAgent(agentName) {
|
|
53
|
-
for (const session of this.sessions.values()) {
|
|
54
|
-
if (session.agentName === agentName)
|
|
55
|
-
return session;
|
|
56
|
-
}
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
/** Returns sessions that have been idle longer than the given timeout. */
|
|
60
|
-
getIdleSessions(timeoutMs) {
|
|
61
|
-
const cutoff = Date.now() - timeoutMs;
|
|
62
|
-
const idle = [];
|
|
63
|
-
for (const session of this.sessions.values()) {
|
|
64
|
-
if (session.lastActivityAt.getTime() < cutoff) {
|
|
65
|
-
idle.push(session);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return idle;
|
|
69
|
-
}
|
|
70
|
-
listSessions() {
|
|
71
|
-
return [...this.sessions.values()];
|
|
72
|
-
}
|
|
73
|
-
get size() {
|
|
74
|
-
return this.sessions.size;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=session-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/chat/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/chat/transport.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChatTransport abstraction — shared interface for local and remote chat.
|
|
3
|
-
*/
|
|
4
|
-
import type { ChatInbound, ChatOutbound } from "./types.js";
|
|
5
|
-
export interface ChatTransport {
|
|
6
|
-
/** Send an inbound message to the agent. */
|
|
7
|
-
send(msg: ChatInbound): void;
|
|
8
|
-
/** Subscribe to outbound messages from the agent. Returns an unsubscribe function. */
|
|
9
|
-
onMessage(handler: (msg: ChatOutbound) => void): () => void;
|
|
10
|
-
/** Close the transport and clean up resources. */
|
|
11
|
-
close(): Promise<void>;
|
|
12
|
-
/** Whether the transport is currently connected. */
|
|
13
|
-
readonly connected: boolean;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/chat/transport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,sFAAsF;IACtF,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAE5D,kDAAkD;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B"}
|
package/dist/chat/transport.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/chat/transport.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/chat/types.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chat protocol types for bidirectional real-time agent communication.
|
|
3
|
-
*
|
|
4
|
-
* Used by both browser WebSocket connections and container-side chat entries.
|
|
5
|
-
*/
|
|
6
|
-
export interface UserMessage {
|
|
7
|
-
type: "user_message";
|
|
8
|
-
text: string;
|
|
9
|
-
}
|
|
10
|
-
export interface CancelMessage {
|
|
11
|
-
type: "cancel";
|
|
12
|
-
}
|
|
13
|
-
export interface ShutdownMessage {
|
|
14
|
-
type: "shutdown";
|
|
15
|
-
}
|
|
16
|
-
export type ChatInbound = UserMessage | CancelMessage | ShutdownMessage;
|
|
17
|
-
export interface AssistantMessage {
|
|
18
|
-
type: "assistant_message";
|
|
19
|
-
text: string;
|
|
20
|
-
done: boolean;
|
|
21
|
-
}
|
|
22
|
-
export interface ToolStart {
|
|
23
|
-
type: "tool_start";
|
|
24
|
-
toolCallId: string;
|
|
25
|
-
tool: string;
|
|
26
|
-
input: string;
|
|
27
|
-
}
|
|
28
|
-
export interface ToolResult {
|
|
29
|
-
type: "tool_result";
|
|
30
|
-
toolCallId: string;
|
|
31
|
-
tool: string;
|
|
32
|
-
output: string;
|
|
33
|
-
error?: boolean;
|
|
34
|
-
}
|
|
35
|
-
export interface ChatError {
|
|
36
|
-
type: "error";
|
|
37
|
-
message: string;
|
|
38
|
-
}
|
|
39
|
-
export interface Heartbeat {
|
|
40
|
-
type: "heartbeat";
|
|
41
|
-
}
|
|
42
|
-
export type ChatOutbound = AssistantMessage | ToolStart | ToolResult | ChatError | Heartbeat;
|
|
43
|
-
export interface ChatSession {
|
|
44
|
-
sessionId: string;
|
|
45
|
-
agentName: string;
|
|
46
|
-
containerName?: string;
|
|
47
|
-
shutdownSecret?: string;
|
|
48
|
-
createdAt: Date;
|
|
49
|
-
lastActivityAt: Date;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/chat/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,eAAe,CAAC;AAIxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAId,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;CACtB"}
|
package/dist/chat/types.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Message validation and rate limiting for the chat protocol.
|
|
3
|
-
*/
|
|
4
|
-
export interface ValidationResult {
|
|
5
|
-
valid: boolean;
|
|
6
|
-
error?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Validate an inbound chat message.
|
|
10
|
-
*/
|
|
11
|
-
export declare function validateInbound(raw: string): ValidationResult;
|
|
12
|
-
/**
|
|
13
|
-
* Validate an outbound chat message.
|
|
14
|
-
*/
|
|
15
|
-
export declare function validateOutbound(raw: string): ValidationResult;
|
|
16
|
-
/**
|
|
17
|
-
* Token bucket rate limiter for chat messages.
|
|
18
|
-
*/
|
|
19
|
-
export declare class RateLimiter {
|
|
20
|
-
private tokens;
|
|
21
|
-
private lastRefill;
|
|
22
|
-
private readonly maxTokens;
|
|
23
|
-
private readonly refillRate;
|
|
24
|
-
constructor(maxTokens?: number, refillRatePerSecond?: number);
|
|
25
|
-
/**
|
|
26
|
-
* Try to consume a token. Returns true if allowed, false if rate-limited.
|
|
27
|
-
*/
|
|
28
|
-
consume(): boolean;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/chat/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAuB7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAiB9D;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,SAAS,SAAK,EAAE,mBAAmB,SAAK;IAOpD;;OAEG;IACH,OAAO,IAAI,OAAO;CAYnB"}
|
package/dist/chat/validation.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Message validation and rate limiting for the chat protocol.
|
|
3
|
-
*/
|
|
4
|
-
const MAX_MESSAGE_SIZE = 64 * 1024; // 64KB
|
|
5
|
-
const INBOUND_TYPES = new Set(["user_message", "cancel", "shutdown"]);
|
|
6
|
-
const OUTBOUND_TYPES = new Set(["assistant_message", "tool_start", "tool_result", "error", "heartbeat"]);
|
|
7
|
-
/**
|
|
8
|
-
* Validate an inbound chat message.
|
|
9
|
-
*/
|
|
10
|
-
export function validateInbound(raw) {
|
|
11
|
-
if (raw.length > MAX_MESSAGE_SIZE) {
|
|
12
|
-
return { valid: false, error: `Message exceeds ${MAX_MESSAGE_SIZE} byte limit` };
|
|
13
|
-
}
|
|
14
|
-
let msg;
|
|
15
|
-
try {
|
|
16
|
-
msg = JSON.parse(raw);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return { valid: false, error: "Invalid JSON" };
|
|
20
|
-
}
|
|
21
|
-
if (!msg || typeof msg !== "object" || !INBOUND_TYPES.has(msg.type)) {
|
|
22
|
-
return { valid: false, error: `Invalid message type: ${msg?.type}` };
|
|
23
|
-
}
|
|
24
|
-
if (msg.type === "user_message") {
|
|
25
|
-
if (typeof msg.text !== "string" || msg.text.length === 0) {
|
|
26
|
-
return { valid: false, error: "user_message requires non-empty text" };
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return { valid: true };
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Validate an outbound chat message.
|
|
33
|
-
*/
|
|
34
|
-
export function validateOutbound(raw) {
|
|
35
|
-
if (raw.length > MAX_MESSAGE_SIZE) {
|
|
36
|
-
return { valid: false, error: `Message exceeds ${MAX_MESSAGE_SIZE} byte limit` };
|
|
37
|
-
}
|
|
38
|
-
let msg;
|
|
39
|
-
try {
|
|
40
|
-
msg = JSON.parse(raw);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return { valid: false, error: "Invalid JSON" };
|
|
44
|
-
}
|
|
45
|
-
if (!msg || typeof msg !== "object" || !OUTBOUND_TYPES.has(msg.type)) {
|
|
46
|
-
return { valid: false, error: `Invalid message type: ${msg?.type}` };
|
|
47
|
-
}
|
|
48
|
-
return { valid: true };
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Token bucket rate limiter for chat messages.
|
|
52
|
-
*/
|
|
53
|
-
export class RateLimiter {
|
|
54
|
-
tokens;
|
|
55
|
-
lastRefill;
|
|
56
|
-
maxTokens;
|
|
57
|
-
refillRate;
|
|
58
|
-
constructor(maxTokens = 10, refillRatePerSecond = 10) {
|
|
59
|
-
this.maxTokens = maxTokens;
|
|
60
|
-
this.tokens = maxTokens;
|
|
61
|
-
this.refillRate = refillRatePerSecond;
|
|
62
|
-
this.lastRefill = Date.now();
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Try to consume a token. Returns true if allowed, false if rate-limited.
|
|
66
|
-
*/
|
|
67
|
-
consume() {
|
|
68
|
-
const now = Date.now();
|
|
69
|
-
const elapsed = (now - this.lastRefill) / 1000;
|
|
70
|
-
this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate);
|
|
71
|
-
this.lastRefill = now;
|
|
72
|
-
if (this.tokens >= 1) {
|
|
73
|
-
this.tokens -= 1;
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/chat/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket handler for chat — bridges browser ↔ container per session.
|
|
3
|
-
*
|
|
4
|
-
* Two WS paths:
|
|
5
|
-
* /chat/ws/:sessionId — browser connects here (auth via header/cookie)
|
|
6
|
-
* /chat/container/:sessionId — container connects here (auth via first-message token)
|
|
7
|
-
*/
|
|
8
|
-
import type { Server } from "http";
|
|
9
|
-
import { WebSocket } from "ws";
|
|
10
|
-
import { type ApiKeySource } from "../control/auth.js";
|
|
11
|
-
import type { ChatSessionManager } from "./session-manager.js";
|
|
12
|
-
import { RateLimiter } from "./validation.js";
|
|
13
|
-
import type { SessionStore } from "../control/session-store.js";
|
|
14
|
-
import type { Logger } from "../shared/logger.js";
|
|
15
|
-
interface BrowserConnection {
|
|
16
|
-
ws: WebSocket;
|
|
17
|
-
rateLimiter: RateLimiter;
|
|
18
|
-
}
|
|
19
|
-
interface ContainerConnection {
|
|
20
|
-
ws: WebSocket;
|
|
21
|
-
authenticated: boolean;
|
|
22
|
-
}
|
|
23
|
-
export interface ChatWebSocketState {
|
|
24
|
-
browserConnections: Map<string, BrowserConnection>;
|
|
25
|
-
containerConnections: Map<string, ContainerConnection>;
|
|
26
|
-
cleanupInterval: ReturnType<typeof setInterval>;
|
|
27
|
-
/** Callback to stop a chat container by session. */
|
|
28
|
-
stopContainer?: (sessionId: string) => Promise<void>;
|
|
29
|
-
}
|
|
30
|
-
export declare function attachChatWebSocket(server: Server, sessionManager: ChatSessionManager, apiKey: ApiKeySource, sessionStore?: SessionStore, logger?: Logger): ChatWebSocketState;
|
|
31
|
-
export {};
|
|
32
|
-
//# sourceMappingURL=ws-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../src/chat/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAmB,SAAS,EAAgB,MAAM,IAAI,CAAC;AAC9D,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAqC,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,UAAU,iBAAiB;IACzB,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,UAAU,mBAAmB;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACnD,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACvD,eAAe,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAChD,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,kBAAkB,EAClC,MAAM,EAAE,YAAY,EACpB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,CA0NpB"}
|