@aiden-ade/sandbox-agent 0.1.4 → 0.1.6

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.
@@ -0,0 +1,73 @@
1
+ export class WebPresenter {
2
+ wsClient;
3
+ conversationId;
4
+ suppressSessionLifecycle = false;
5
+ constructor(wsClient, conversationId) {
6
+ this.wsClient = wsClient;
7
+ this.conversationId = conversationId;
8
+ }
9
+ setSuppressSessionLifecycle(suppress) {
10
+ this.suppressSessionLifecycle = suppress;
11
+ }
12
+ onStart(config) {
13
+ this.wsClient.emitEvent({ type: "start", task: config.task, ts: Date.now() });
14
+ }
15
+ onLog(message) {
16
+ console.error(message);
17
+ }
18
+ onAssistantText(text) {
19
+ this.wsClient.emitEvent({ type: "text", text, ts: Date.now() });
20
+ }
21
+ onThinking(text) {
22
+ this.wsClient.emitEvent({ type: "thinking", text, ts: Date.now() });
23
+ }
24
+ onToolUse(tool, input, toolId) {
25
+ this.wsClient.emitEvent({ type: "tool_use", id: toolId, name: tool, input, ts: Date.now() });
26
+ }
27
+ onToolResult(toolId, content) {
28
+ this.wsClient.emitEvent({ type: "tool_result", id: toolId, content, ts: Date.now() });
29
+ }
30
+ onTurnComplete(content) {
31
+ this.wsClient.emitEvent({ type: "turn_complete", content, ts: Date.now() });
32
+ }
33
+ onUsageUpdate(usage) {
34
+ this.wsClient.emitEvent({ type: "usage", usage });
35
+ }
36
+ onError(message, _isAgentError) {
37
+ this.wsClient.emitEvent({ type: "error", message });
38
+ if (!this.suppressSessionLifecycle) {
39
+ this.wsClient.emitEvent({ type: "session_error", error: message });
40
+ this.wsClient.close();
41
+ }
42
+ }
43
+ onComplete(result) {
44
+ // Always send query_complete so the server persists query content
45
+ this.wsClient.emitEvent({ type: "query_complete", result, ts: Date.now() });
46
+ // In multi-turn mode (suppressSessionLifecycle=true), skip session lifecycle
47
+ if (this.suppressSessionLifecycle) {
48
+ return;
49
+ }
50
+ // Single-turn mode: also send session lifecycle event and close
51
+ if (result.success) {
52
+ this.wsClient.emitEvent({ type: "session_complete", result });
53
+ }
54
+ else {
55
+ this.wsClient.emitEvent({ type: "session_error", error: result.error || "Unknown error" });
56
+ }
57
+ this.wsClient.close();
58
+ }
59
+ /**
60
+ * Manually emit session lifecycle events and close.
61
+ * Called after the multi-turn loop exits.
62
+ */
63
+ async emitSessionEnd(result) {
64
+ if (result.success) {
65
+ this.wsClient.emitEvent({ type: "session_complete", result });
66
+ }
67
+ else {
68
+ this.wsClient.emitEvent({ type: "session_error", error: result.error || "Unknown error" });
69
+ }
70
+ this.wsClient.close();
71
+ }
72
+ }
73
+ //# sourceMappingURL=web-presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-presenter.js","sourceRoot":"","sources":["../src/web-presenter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { AgentEvent } from "./types.js";
2
+ import type { UpdatePayload } from "./updater.js";
3
+ export interface UserMessagePayload {
4
+ text: string;
5
+ providerSessionId?: string;
6
+ }
7
+ export interface WSClientCallbacks {
8
+ onUserMessage: (payload: UserMessagePayload) => void;
9
+ onStop: () => void;
10
+ onUpdateAgent?: (payload: UpdatePayload) => void;
11
+ onConnect?: () => void;
12
+ onDisconnect?: (reason: string) => void;
13
+ }
14
+ export declare class WSClient {
15
+ private socket;
16
+ constructor(wsUrl: string, sessionId: string, // conversationId
17
+ taskId: string, token: string, // sandboxSessionToken
18
+ callbacks: WSClientCallbacks, agentVersion?: string);
19
+ emitEvent(event: AgentEvent): void;
20
+ /** Signal the WS relay that this agent is about to update (not crashing). */
21
+ emitUpdating(): void;
22
+ waitForConnection(timeoutMs?: number): Promise<void>;
23
+ get connected(): boolean;
24
+ close(): void;
25
+ private setupListeners;
26
+ }
27
+ //# sourceMappingURL=ws-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client.d.ts","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;gBAGrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAK,iBAAiB;IACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAS,sBAAsB;IAC5C,SAAS,EAAE,iBAAiB,EAC5B,YAAY,CAAC,EAAE,MAAM;IAiBvB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIlC,6EAA6E;IAC7E,YAAY,IAAI,IAAI;IAIpB,iBAAiB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,IAAI,SAAS,IAAI,OAAO,CAAkC;IAC1D,KAAK,IAAI,IAAI;IAEb,OAAO,CAAC,cAAc;CAcvB"}
@@ -0,0 +1,56 @@
1
+ import { io } from "socket.io-client";
2
+ export class WSClient {
3
+ socket;
4
+ constructor(wsUrl, sessionId, // conversationId
5
+ taskId, token, // sandboxSessionToken
6
+ callbacks, agentVersion) {
7
+ this.socket = io(wsUrl, {
8
+ query: { type: "agent", sessionId, taskId, agentVersion: agentVersion ?? "" },
9
+ auth: { token },
10
+ transports: ["websocket"],
11
+ reconnection: true,
12
+ reconnectionAttempts: Infinity,
13
+ reconnectionDelay: 1000,
14
+ reconnectionDelayMax: 5000,
15
+ timeout: 20_000,
16
+ upgrade: false,
17
+ extraHeaders: { "ngrok-skip-browser-warning": "1" },
18
+ });
19
+ this.setupListeners(callbacks);
20
+ }
21
+ emitEvent(event) {
22
+ this.socket.emit("agent_event", event);
23
+ }
24
+ /** Signal the WS relay that this agent is about to update (not crashing). */
25
+ emitUpdating() {
26
+ this.socket.emit("agent_updating");
27
+ }
28
+ waitForConnection(timeoutMs = 15000) {
29
+ return new Promise((resolve, reject) => {
30
+ if (this.socket.connected) {
31
+ resolve();
32
+ return;
33
+ }
34
+ const timeout = setTimeout(() => reject(new Error(`WSClient connection timeout after ${timeoutMs}ms`)), timeoutMs);
35
+ this.socket.once("connect", () => { clearTimeout(timeout); resolve(); });
36
+ this.socket.once("connect_error", (err) => { clearTimeout(timeout); reject(new Error(`WSClient connection failed: ${err.message}`)); });
37
+ });
38
+ }
39
+ get connected() { return this.socket.connected; }
40
+ close() { this.socket.disconnect(); }
41
+ setupListeners(callbacks) {
42
+ this.socket.on("connect", () => { console.debug("[WSClient] Connected to WS server"); callbacks.onConnect?.(); });
43
+ this.socket.on("disconnect", (reason) => { console.debug(`[WSClient] Disconnected: ${reason}`); callbacks.onDisconnect?.(reason); });
44
+ this.socket.on("connect_error", (error) => { console.warn(`[WSClient] Connection error: ${error.message}`); });
45
+ this.socket.on("user_message", (data) => {
46
+ callbacks.onUserMessage({ text: data.text, providerSessionId: data.providerSessionId });
47
+ });
48
+ this.socket.on("stop", () => { callbacks.onStop(); });
49
+ this.socket.on("update_agent", (data) => {
50
+ console.info("[WSClient] Received update_agent:", data);
51
+ callbacks.onUpdateAgent?.(data);
52
+ });
53
+ this.socket.on("error", (data) => { console.error(`[WSClient] Server error: ${data.message} (${data.code})`); });
54
+ }
55
+ }
56
+ //# sourceMappingURL=ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiden-ade/sandbox-agent",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "aiden-agent": "./dist/index.cjs"
@@ -11,16 +11,15 @@
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
14
- "dependencies": {
15
- "socket.io-client": "^4.8.0",
16
- "@aiden/agent-core": "0.1.0",
17
- "@aiden/shared": "0.1.0"
18
- },
14
+ "dependencies": {},
19
15
  "devDependencies": {
16
+ "socket.io-client": "^4.8.0",
20
17
  "@types/node": "^22.0.0",
21
18
  "tsup": "^8.5.1",
22
19
  "tsx": "^4.19.0",
23
- "typescript": "~5.9.3"
20
+ "typescript": "~5.9.3",
21
+ "@aiden/agent-core": "0.1.0",
22
+ "@aiden/shared": "0.1.0"
24
23
  },
25
24
  "scripts": {
26
25
  "build": "tsup",