@aiden-ade/sandbox-agent 0.1.5 → 0.1.7

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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,mFAAmF;AACnF,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACvC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,sBAAsB,CAAC;AAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC;AACnE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;AAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACtC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,SAAS,CAAC;AAE7E,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,yHAAyH,CAAC,CAAC;IACzI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAE7H,UAAU,CAAC;IACT,KAAK;IACL,SAAS;IACT,MAAM;IACN,YAAY;IACZ,IAAI;IACJ,WAAW;IACX,WAAW;IACX,IAAI;IACJ,KAAK;IACL,iBAAiB;IACjB,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "@aiden/agent-core";
2
+ //# sourceMappingURL=runtime-backends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-backends.d.ts","sourceRoot":"","sources":["../src/runtime-backends.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "@aiden/agent-core";
2
+ //# sourceMappingURL=runtime-backends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-backends.js","sourceRoot":"","sources":["../src/runtime-backends.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface SandboxConfig {
2
+ wsUrl: string;
3
+ sessionId: string;
4
+ taskId: string;
5
+ sessionToken: string;
6
+ task: string;
7
+ projectPath: string;
8
+ backendKind?: string;
9
+ mode?: string;
10
+ model?: string;
11
+ providerSessionId?: string;
12
+ maxIterations?: number;
13
+ }
14
+ export declare function runSandbox(config: SandboxConfig): Promise<void>;
15
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JrE"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Sandbox mode: connects to WS server, runs CoreAgent in a multi-turn loop.
3
+ * Runs INSIDE the E2B sandbox.
4
+ */
5
+ import { CoreAgent } from "./core-agent.js";
6
+ import { WebPresenter } from "./web-presenter.js";
7
+ import { WSClient } from "./ws-client.js";
8
+ import { AGENT_VERSION } from "./version.js";
9
+ export async function runSandbox(config) {
10
+ let currentTask = config.task;
11
+ let currentImages = [];
12
+ let stopped = false;
13
+ let pendingMessageResolve = null;
14
+ /** Queue for user messages that arrive while the agent is still running. */
15
+ const messageQueue = [];
16
+ let currentAgent = null;
17
+ console.info("[sandbox] Connecting to WS server", { wsUrl: config.wsUrl, sessionId: config.sessionId });
18
+ const wsClient = new WSClient(config.wsUrl, config.sessionId, config.taskId, config.sessionToken, {
19
+ onUserMessage: (payload) => {
20
+ if (pendingMessageResolve) {
21
+ const resolve = pendingMessageResolve;
22
+ pendingMessageResolve = null;
23
+ resolve(payload);
24
+ }
25
+ else {
26
+ // Agent subprocess is still running (continuation mode keeps it alive after
27
+ // query_complete is sent). Queue the message and abort the subprocess so
28
+ // agent.run() returns quickly and the loop can process the queued message.
29
+ messageQueue.push(payload);
30
+ if (messageQueue.length === 1 && currentAgent) {
31
+ console.info("[sandbox] User message queued — aborting continuation for quick response");
32
+ currentAgent.abort();
33
+ }
34
+ else if (messageQueue.length > 1) {
35
+ console.warn("[sandbox] User message queued (multiple pending)", { queueLength: messageQueue.length });
36
+ }
37
+ }
38
+ },
39
+ onStop: () => {
40
+ console.info("[sandbox] Stop signal received");
41
+ if (currentAgent)
42
+ currentAgent.abort();
43
+ },
44
+ onToolResponse: (toolId, response) => {
45
+ if (currentAgent) {
46
+ const sent = currentAgent.sendToolResponse(toolId, response);
47
+ if (!sent) {
48
+ console.warn("[sandbox] Failed to deliver tool_response to agent stdin", { toolId });
49
+ }
50
+ }
51
+ else {
52
+ console.warn("[sandbox] No active agent for tool_response", { toolId });
53
+ }
54
+ },
55
+ onConnect: () => console.info("[sandbox] WS connected"),
56
+ onDisconnect: (reason) => console.info(`[sandbox] WS disconnected: ${reason}`),
57
+ }, AGENT_VERSION);
58
+ try {
59
+ await wsClient.waitForConnection();
60
+ }
61
+ catch (error) {
62
+ console.error("[sandbox] Failed to connect to WS server:", error.message);
63
+ process.exit(1);
64
+ }
65
+ const presenter = new WebPresenter(wsClient, config.sessionId);
66
+ presenter.setSuppressSessionLifecycle(true);
67
+ let lastProviderSessionId = config.providerSessionId;
68
+ let activeBackendKind = config.backendKind || "claude_cli";
69
+ let activeModel = config.model;
70
+ let activeMode = config.mode || "agent";
71
+ while (!stopped) {
72
+ // Reset the duplicate-completion guard before each new agent turn.
73
+ presenter.resetForNewTurn();
74
+ if (currentTask?.trim()) {
75
+ const agent = new CoreAgent(presenter, {
76
+ backendKind: activeBackendKind,
77
+ });
78
+ currentAgent = agent;
79
+ let result;
80
+ try {
81
+ result = await agent.run({
82
+ task: currentTask,
83
+ maxIterations: config.maxIterations || 50,
84
+ projectPath: config.projectPath,
85
+ cwd: config.projectPath,
86
+ backendKind: activeBackendKind,
87
+ mode: activeMode,
88
+ selectedModel: activeModel,
89
+ providerSessionId: lastProviderSessionId ?? undefined,
90
+ images: currentImages.length > 0
91
+ ? currentImages.map((img) => ({
92
+ id: img.id,
93
+ data: img.data,
94
+ mimeType: img.mimeType,
95
+ filename: img.filename,
96
+ width: 0,
97
+ height: 0,
98
+ }))
99
+ : undefined,
100
+ });
101
+ }
102
+ catch (error) {
103
+ const errorMessage = error instanceof Error ? error.message : String(error);
104
+ console.error("[sandbox] Agent run failed:", errorMessage);
105
+ result = { success: false, summary: "Agent run failed", filesModified: [], planFilesCreated: [], iterations: 0, error: errorMessage };
106
+ }
107
+ currentAgent = null;
108
+ if (result?.providerSessionId) {
109
+ lastProviderSessionId = result.providerSessionId;
110
+ }
111
+ if (stopped)
112
+ break;
113
+ }
114
+ // Drain any messages that arrived while the agent was running (e.g. during
115
+ // continuation mode where the subprocess stays alive after query_complete).
116
+ if (messageQueue.length > 0) {
117
+ const nextPayload = messageQueue.shift();
118
+ currentTask = nextPayload.text;
119
+ currentImages = nextPayload.images ?? [];
120
+ if (nextPayload.providerSessionId)
121
+ lastProviderSessionId = nextPayload.providerSessionId;
122
+ if (nextPayload.backendKind)
123
+ activeBackendKind = nextPayload.backendKind;
124
+ if (nextPayload.selectedModel)
125
+ activeModel = nextPayload.selectedModel;
126
+ if (nextPayload.mode)
127
+ activeMode = nextPayload.mode;
128
+ continue;
129
+ }
130
+ // Wait for next user message (includes providerSessionId and backendKind when available)
131
+ const nextPayload = await new Promise((resolve) => {
132
+ pendingMessageResolve = resolve;
133
+ });
134
+ if (nextPayload === null || stopped) {
135
+ break;
136
+ }
137
+ currentTask = nextPayload.text;
138
+ currentImages = nextPayload.images ?? [];
139
+ if (nextPayload.providerSessionId) {
140
+ lastProviderSessionId = nextPayload.providerSessionId;
141
+ }
142
+ if (nextPayload.backendKind) {
143
+ activeBackendKind = nextPayload.backendKind;
144
+ }
145
+ if (nextPayload.selectedModel) {
146
+ activeModel = nextPayload.selectedModel;
147
+ }
148
+ if (nextPayload.mode) {
149
+ activeMode = nextPayload.mode;
150
+ }
151
+ }
152
+ presenter.setSuppressSessionLifecycle(false);
153
+ wsClient.close();
154
+ }
155
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-exports from the canonical shared agent types.
3
+ * Single source of truth: packages/shared/src/agent/types.ts
4
+ */
5
+ export * from "@aiden/shared/agent";
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,qBAAqB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-exports from the canonical shared agent types.
3
+ * Single source of truth: packages/shared/src/agent/types.ts
4
+ */
5
+ export * from "@aiden/shared/agent";
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const AGENT_VERSION = "0.1.6";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const AGENT_VERSION = "0.1.6";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { WSClient } from "./ws-client.js";
2
+ import type { AgentConfig, AgentResult, ExitPlanModeInput, UsageUpdate } from "./types.js";
3
+ import type { AgentPresenter } from "./types.js";
4
+ export declare class WebPresenter implements AgentPresenter {
5
+ private wsClient;
6
+ private conversationId;
7
+ private suppressSessionLifecycle;
8
+ /**
9
+ * Guards against duplicate query_complete events in continuation mode.
10
+ * Claude CLI calls onComplete early (when result event fires) then again when
11
+ * the subprocess exits. The second call must be suppressed so the browser
12
+ * does not receive a duplicate (or error) query_complete.
13
+ */
14
+ private turnCompleteSent;
15
+ constructor(wsClient: WSClient, conversationId: string);
16
+ setSuppressSessionLifecycle(suppress: boolean): void;
17
+ onStart(config: AgentConfig): void;
18
+ onLog(message: string): void;
19
+ onAssistantText(text: string): void;
20
+ onThinking(text: string): void;
21
+ onToolUse(tool: string, input: unknown, toolId: string): void;
22
+ onToolResult(toolId: string, content: string, isError?: boolean): void;
23
+ onTurnComplete(content: unknown[]): void;
24
+ onUsageUpdate(usage: UsageUpdate): void;
25
+ onAskUser(id: string, questions: unknown[]): void;
26
+ onTodoWrite(todos: unknown[]): void;
27
+ onExitPlanMode(id: string, input: ExitPlanModeInput, planFilePath?: string): void;
28
+ onCheckpoint(id: string): void;
29
+ onActivity(status: string): void;
30
+ onOpenBrowserTab(browserId: string, url?: string): void;
31
+ recordRawTranscript(): void;
32
+ onError(message: string, _isAgentError?: boolean): void;
33
+ onComplete(result: AgentResult): void;
34
+ /** Reset the turn-complete flag before starting a new agent turn. */
35
+ resetForNewTurn(): void;
36
+ /**
37
+ * Manually emit session lifecycle events and close.
38
+ * Called after the multi-turn loop exits.
39
+ */
40
+ emitSessionEnd(result: AgentResult): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=web-presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-presenter.d.ts","sourceRoot":"","sources":["../src/web-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAc,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,wBAAwB,CAAS;IACzC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAS;gBAErB,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM;IAKtD,2BAA2B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIpD,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIlC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI7D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAUtE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI;IAIxC,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIvC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI;IAIjD,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAInC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAIjF,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD,mBAAmB,IAAI,IAAI;IAI3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI;IAQvD,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA0BrC,qEAAqE;IACrE,eAAe,IAAI,IAAI;IAIvB;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAQzD"}
@@ -0,0 +1,120 @@
1
+ export class WebPresenter {
2
+ wsClient;
3
+ conversationId;
4
+ suppressSessionLifecycle = false;
5
+ /**
6
+ * Guards against duplicate query_complete events in continuation mode.
7
+ * Claude CLI calls onComplete early (when result event fires) then again when
8
+ * the subprocess exits. The second call must be suppressed so the browser
9
+ * does not receive a duplicate (or error) query_complete.
10
+ */
11
+ turnCompleteSent = false;
12
+ constructor(wsClient, conversationId) {
13
+ this.wsClient = wsClient;
14
+ this.conversationId = conversationId;
15
+ }
16
+ setSuppressSessionLifecycle(suppress) {
17
+ this.suppressSessionLifecycle = suppress;
18
+ }
19
+ onStart(config) {
20
+ this.wsClient.emitEvent({ type: "start", task: config.task, ts: Date.now() });
21
+ }
22
+ onLog(message) {
23
+ console.error(message);
24
+ }
25
+ onAssistantText(text) {
26
+ this.wsClient.emitEvent({ type: "text", text, ts: Date.now() });
27
+ }
28
+ onThinking(text) {
29
+ this.wsClient.emitEvent({ type: "thinking", text, ts: Date.now() });
30
+ }
31
+ onToolUse(tool, input, toolId) {
32
+ this.wsClient.emitEvent({ type: "tool_use", id: toolId, name: tool, input, ts: Date.now() });
33
+ }
34
+ onToolResult(toolId, content, isError) {
35
+ this.wsClient.emitEvent({
36
+ type: "tool_result",
37
+ id: toolId,
38
+ content,
39
+ ts: Date.now(),
40
+ ...(isError ? { is_error: true } : {}),
41
+ });
42
+ }
43
+ onTurnComplete(content) {
44
+ this.wsClient.emitEvent({ type: "turn_complete", content, ts: Date.now() });
45
+ }
46
+ onUsageUpdate(usage) {
47
+ this.wsClient.emitEvent({ type: "usage", usage });
48
+ }
49
+ onAskUser(id, questions) {
50
+ this.wsClient.emitEvent({ type: "ask_user", id, questions });
51
+ }
52
+ onTodoWrite(todos) {
53
+ this.wsClient.emitEvent({ type: "todo_write", todos });
54
+ }
55
+ onExitPlanMode(id, input, planFilePath) {
56
+ this.wsClient.emitEvent({ type: "exit_plan_mode", id, input, ...(planFilePath ? { planFilePath } : {}) });
57
+ }
58
+ onCheckpoint(id) {
59
+ this.wsClient.emitEvent({ type: "checkpoint", id });
60
+ }
61
+ onActivity(status) {
62
+ this.wsClient.emitEvent({ type: "activity", status, ts: Date.now() });
63
+ }
64
+ onOpenBrowserTab(browserId, url) {
65
+ this.wsClient.emitEvent({ type: "open_browser_tab", browserId, ...(url ? { url } : {}) });
66
+ }
67
+ recordRawTranscript() {
68
+ // No-op for sandbox — raw transcripts stay in the container
69
+ }
70
+ onError(message, _isAgentError) {
71
+ this.wsClient.emitEvent({ type: "error", message });
72
+ if (!this.suppressSessionLifecycle) {
73
+ this.wsClient.emitEvent({ type: "session_error", error: message });
74
+ this.wsClient.close();
75
+ }
76
+ }
77
+ onComplete(result) {
78
+ if (this.suppressSessionLifecycle) {
79
+ // Multi-turn mode: guard against duplicate onComplete calls.
80
+ // In continuation mode (allowContinuation=true in runtime-backends), the CLI
81
+ // backend calls onComplete early when the result event fires, then calls it
82
+ // again when the subprocess exits (or is aborted). Suppress the second call
83
+ // so the browser never receives a duplicate — or error — query_complete.
84
+ if (this.turnCompleteSent) {
85
+ this.turnCompleteSent = false; // reset for next turn
86
+ return;
87
+ }
88
+ this.turnCompleteSent = true;
89
+ this.wsClient.emitEvent({ type: "query_complete", result, ts: Date.now() });
90
+ return;
91
+ }
92
+ // Single-turn mode: send query_complete + session lifecycle event and close
93
+ this.wsClient.emitEvent({ type: "query_complete", result, ts: Date.now() });
94
+ if (result.success) {
95
+ this.wsClient.emitEvent({ type: "session_complete", result });
96
+ }
97
+ else {
98
+ this.wsClient.emitEvent({ type: "session_error", error: result.error || "Unknown error" });
99
+ }
100
+ this.wsClient.close();
101
+ }
102
+ /** Reset the turn-complete flag before starting a new agent turn. */
103
+ resetForNewTurn() {
104
+ this.turnCompleteSent = false;
105
+ }
106
+ /**
107
+ * Manually emit session lifecycle events and close.
108
+ * Called after the multi-turn loop exits.
109
+ */
110
+ async emitSessionEnd(result) {
111
+ if (result.success) {
112
+ this.wsClient.emitEvent({ type: "session_complete", result });
113
+ }
114
+ else {
115
+ this.wsClient.emitEvent({ type: "session_error", error: result.error || "Unknown error" });
116
+ }
117
+ this.wsClient.close();
118
+ }
119
+ }
120
+ //# sourceMappingURL=web-presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-presenter.js","sourceRoot":"","sources":["../src/web-presenter.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,YAAY;IACf,QAAQ,CAAW;IACnB,cAAc,CAAS;IACvB,wBAAwB,GAAG,KAAK,CAAC;IACzC;;;;;OAKG;IACK,gBAAgB,GAAG,KAAK,CAAC;IAEjC,YAAY,QAAkB,EAAE,cAAsB;QACpD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,2BAA2B,CAAC,QAAiB;QAC3C,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,KAAc,EAAE,MAAc;QACpD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,YAAY,CAAC,MAAc,EAAE,OAAe,EAAE,OAAiB;QAC7D,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACtB,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,MAAM;YACV,OAAO;YACP,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAAkB;QAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,aAAa,CAAC,KAAkB;QAC9B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,SAAoB;QACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW,CAAC,KAAgB;QAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,cAAc,CAAC,EAAU,EAAE,KAAwB,EAAE,YAAqB;QACxE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,GAAY;QAC9C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,mBAAmB;QACjB,4DAA4D;IAC9D,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,aAAuB;QAC9C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAmB;QAC5B,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,6DAA6D;YAC7D,6EAA6E;YAC7E,4EAA4E;YAC5E,4EAA4E;YAC5E,yEAAyE;YACzE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,sBAAsB;gBACrD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,qEAAqE;IACrE,eAAe;QACb,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,MAAmB;QACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import type { AgentEvent } from "./types.js";
2
+ export interface ResolvedImage {
3
+ id: string;
4
+ data: string;
5
+ mimeType: string;
6
+ filename: string;
7
+ }
8
+ export interface UserMessagePayload {
9
+ text: string;
10
+ images?: ResolvedImage[];
11
+ providerSessionId?: string;
12
+ backendKind?: string;
13
+ selectedModel?: string;
14
+ mode?: string;
15
+ }
16
+ export interface WSClientCallbacks {
17
+ onUserMessage: (payload: UserMessagePayload) => void;
18
+ onStop: () => void;
19
+ onToolResponse?: (toolId: string, response: string) => void;
20
+ onConnect?: () => void;
21
+ onDisconnect?: (reason: string) => void;
22
+ }
23
+ export declare class WSClient {
24
+ private socket;
25
+ constructor(wsUrl: string, sessionId: string, // conversationId
26
+ taskId: string, token: string, // sandboxSessionToken
27
+ callbacks: WSClientCallbacks, agentVersion?: string);
28
+ emitEvent(event: AgentEvent): void;
29
+ waitForConnection(timeoutMs?: number): Promise<void>;
30
+ get connected(): boolean;
31
+ close(): void;
32
+ private setupListeners;
33
+ }
34
+ //# 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;AAE7C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,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,iBAAiB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,IAAI,SAAS,IAAI,OAAO,CAAkC;IAC1D,KAAK,IAAI,IAAI;IAEb,OAAO,CAAC,cAAc;CAuBvB"}
@@ -0,0 +1,61 @@
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
+ waitForConnection(timeoutMs = 15000) {
25
+ return new Promise((resolve, reject) => {
26
+ if (this.socket.connected) {
27
+ resolve();
28
+ return;
29
+ }
30
+ const timeout = setTimeout(() => reject(new Error(`WSClient connection timeout after ${timeoutMs}ms`)), timeoutMs);
31
+ this.socket.once("connect", () => { clearTimeout(timeout); resolve(); });
32
+ this.socket.once("connect_error", (err) => { clearTimeout(timeout); reject(new Error(`WSClient connection failed: ${err.message}`)); });
33
+ });
34
+ }
35
+ get connected() { return this.socket.connected; }
36
+ close() { this.socket.disconnect(); }
37
+ setupListeners(callbacks) {
38
+ this.socket.on("connect", () => { console.debug("[WSClient] Connected to WS server"); callbacks.onConnect?.(); });
39
+ this.socket.on("disconnect", (reason) => { console.debug(`[WSClient] Disconnected: ${reason}`); callbacks.onDisconnect?.(reason); });
40
+ this.socket.on("connect_error", (error) => { console.warn(`[WSClient] Connection error: ${error.message}`); });
41
+ this.socket.on("user_message", (data, ack) => {
42
+ ack?.({ ok: true });
43
+ callbacks.onUserMessage({
44
+ text: data.text,
45
+ images: data.images,
46
+ providerSessionId: data.providerSessionId,
47
+ backendKind: data.backendKind,
48
+ selectedModel: data.selectedModel,
49
+ mode: data.mode,
50
+ });
51
+ });
52
+ this.socket.on("stop", () => { callbacks.onStop(); });
53
+ this.socket.on("tool_response", (data) => {
54
+ if (data?.toolId && typeof data.response === "string") {
55
+ callbacks.onToolResponse?.(data.toolId, data.response);
56
+ }
57
+ });
58
+ this.socket.on("error", (data) => { console.error(`[WSClient] Server error: ${data.message} (${data.code})`); });
59
+ }
60
+ }
61
+ //# 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,29 +1,27 @@
1
1
  {
2
2
  "name": "@aiden-ade/sandbox-agent",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "aiden-agent": "./dist/index.cjs"
7
7
  },
8
- "files": [
9
- "dist/"
10
- ],
8
+ "files": ["dist/"],
11
9
  "publishConfig": {
12
10
  "access": "public"
13
11
  },
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "dev": "tsx src/index.ts",
15
+ "type-check": "tsc --noEmit"
16
+ },
14
17
  "dependencies": {},
15
18
  "devDependencies": {
19
+ "@aiden/agent-core": "workspace:*",
20
+ "@aiden/shared": "workspace:*",
16
21
  "socket.io-client": "^4.8.0",
17
22
  "@types/node": "^22.0.0",
18
23
  "tsup": "^8.5.1",
19
24
  "tsx": "^4.19.0",
20
- "typescript": "~5.9.3",
21
- "@aiden/agent-core": "0.1.0",
22
- "@aiden/shared": "0.1.0"
23
- },
24
- "scripts": {
25
- "build": "tsup",
26
- "dev": "tsx src/index.ts",
27
- "type-check": "tsc --noEmit"
25
+ "typescript": "~5.9.3"
28
26
  }
29
- }
27
+ }