@mandible-ai/mandible 0.4.0 → 0.5.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.
@@ -3,19 +3,9 @@ import type { ActionHandler, OutputMapping } from './types.js';
3
3
  export interface OpenHandsConfig<T = Record<string, unknown>> {
4
4
  /**
5
5
  * OpenHands agent server URL.
6
- * Default: 'http://localhost:3000'.
6
+ * Default: 'http://localhost:3001'.
7
7
  */
8
8
  serverUrl?: string;
9
- /**
10
- * Bearer token for V1 API authentication.
11
- * Sent as `Authorization: Bearer {apiKey}` when provided.
12
- */
13
- apiKey?: string;
14
- /**
15
- * Model in "provider/model" format for the OpenHands agent.
16
- * e.g. 'openai/qwen3-coder', 'anthropic/claude-sonnet-4-5-20250929'
17
- */
18
- model?: string;
19
9
  /**
20
10
  * Git repository URL for the sandbox.
21
11
  * Can be a static string or derived from the signal.
@@ -37,6 +27,20 @@ export interface OpenHandsConfig<T = Record<string, unknown>> {
37
27
  * Can be static or derived from the signal.
38
28
  */
39
29
  workingDirectory?: string | ((signal: Signal<T>) => string);
30
+ /**
31
+ * Git branch to check out in the sandbox.
32
+ * Can be static or derived from the signal.
33
+ */
34
+ selectedBranch?: string | ((signal: Signal<T>) => string);
35
+ /**
36
+ * System-level instructions for the OpenHands agent.
37
+ * Sent as `conversation_instructions` in the create body.
38
+ */
39
+ conversationInstructions?: string;
40
+ /**
41
+ * Maximum iterations the agent can take. Default: 50.
42
+ */
43
+ maxIterations?: number;
40
44
  /**
41
45
  * Timeout in ms for the entire conversation. Default: 900_000 (15 min).
42
46
  * CI investigation can take a while — reproducing failures, installing deps, running tests.
@@ -44,7 +48,7 @@ export interface OpenHandsConfig<T = Record<string, unknown>> {
44
48
  timeout?: number;
45
49
  /**
46
50
  * Event callback for observability.
47
- * Called with synthetic events derived from poll status changes.
51
+ * Called with events fetched from the conversation events endpoint.
48
52
  * Errors in this callback are caught and do not crash the agent.
49
53
  */
50
54
  onEvent?: (event: OpenHandsEvent) => void;
@@ -53,7 +57,7 @@ export interface OpenHandsConfig<T = Record<string, unknown>> {
53
57
  /** Auto-withdraw the triggering signal. Default: true. */
54
58
  autoWithdraw?: boolean;
55
59
  }
56
- /** Synthetic event emitted from poll status changes. */
60
+ /** Event from the OpenHands conversation events endpoint. */
57
61
  export interface OpenHandsEvent {
58
62
  id: number;
59
63
  source: 'agent' | 'user' | 'environment';
@@ -68,7 +72,7 @@ export interface OpenHandsEvent {
68
72
  /** Result of an OpenHands agent conversation. */
69
73
  export interface OpenHandsResult {
70
74
  /** Final status of the conversation. */
71
- status: 'finished' | 'error' | 'timeout' | 'stopped' | 'stuck';
75
+ status: 'finished' | 'error' | 'timeout' | 'stopped';
72
76
  /** Summary text from the agent's final message. */
73
77
  text: string;
74
78
  /** Conversation ID for debugging/tracing. */
@@ -79,7 +83,7 @@ export interface OpenHandsResult {
79
83
  events: OpenHandsEvent[];
80
84
  }
81
85
  /**
82
- * Creates an action handler powered by the OpenHands agent server (V1 API).
86
+ * Creates an action handler powered by the OpenHands local self-hosted API.
83
87
  *
84
88
  * OpenHands provides sandboxed terminal access inside Docker containers,
85
89
  * which is ideal for CI investigation tasks that need to:
@@ -88,13 +92,15 @@ export interface OpenHandsResult {
88
92
  * - Install dependencies and run tests
89
93
  * - Propose fixes without affecting the host
90
94
  *
91
- * V1 Lifecycle:
92
- * 1. POST /api/v1/app-conversations — create with initial message
93
- * 2. GET /api/v1/app-conversations/start-taskspoll until READY
94
- * 3. GET /api/v1/app-conversations — poll until terminal state
95
+ * Local API Lifecycle:
96
+ * 1. POST /api/conversations — create conversation
97
+ * 2. POST /api/conversations/{id}/messagesend user prompt
98
+ * 3. GET /api/conversations/{id} — poll until STOPPED
99
+ * 4. GET /api/conversations/{id}/events — fetch agent events
100
+ * 5. DELETE /api/conversations/{id} — cleanup
95
101
  */
96
102
  export declare function withOpenHands<T = Record<string, unknown>>(config: OpenHandsConfig<T>): ActionHandler<T>;
97
- export type OpenHandsErrorCode = 'CONVERSATION_CREATE_FAILED' | 'STARTUP_FAILED' | 'STARTUP_TIMEOUT';
103
+ export type OpenHandsErrorCode = 'CONVERSATION_CREATE_FAILED' | 'MESSAGE_SEND_FAILED' | 'CONNECTION_FAILED' | 'TIMEOUT';
98
104
  export declare class OpenHandsError extends Error {
99
105
  readonly code: OpenHandsErrorCode;
100
106
  constructor(code: OpenHandsErrorCode, message: string);
@@ -1 +1 @@
1
- {"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../../src/providers/openhands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAM9E,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAEtD;;;;;;;;;OASG;IACH,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAE5D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAE1C,qCAAqC;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE1B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/D,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,aAAa,CAAC,CAAC,CAAC,CA6HlB;AAiMD,MAAM,MAAM,kBAAkB,GAC1B,4BAA4B,GAC5B,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EACxC,OAAO,EAAE,MAAM;CAKlB"}
1
+ {"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../../src/providers/openhands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAM9E,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAEtD;;;;;;;;;OASG;IACH,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAE5D;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAE1D;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAE1C,qCAAqC;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE1B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,aAAa,CAAC,CAAC,CAAC,CA4JlB;AAyMD,MAAM,MAAM,kBAAkB,GAC1B,4BAA4B,GAC5B,qBAAqB,GACrB,mBAAmB,GACnB,SAAS,CAAC;AAEd,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EACxC,OAAO,EAAE,MAAM;CAKlB"}
@@ -1,10 +1,10 @@
1
- // PURPOSE: withOpenHands — Sandboxed agentic coding via OpenHands agent server (V1 API).
2
- // PURPOSE: REST client for CI investigation and DevOps tasks in isolated containers.
1
+ // PURPOSE: withOpenHands — Sandboxed agentic coding via OpenHands local self-hosted API.
2
+ // PURPOSE: REST client targeting /api/conversations for CI investigation and DevOps tasks.
3
3
  // ----------------------------------------------------------
4
4
  // Provider factory
5
5
  // ----------------------------------------------------------
6
6
  /**
7
- * Creates an action handler powered by the OpenHands agent server (V1 API).
7
+ * Creates an action handler powered by the OpenHands local self-hosted API.
8
8
  *
9
9
  * OpenHands provides sandboxed terminal access inside Docker containers,
10
10
  * which is ideal for CI investigation tasks that need to:
@@ -13,184 +13,216 @@
13
13
  * - Install dependencies and run tests
14
14
  * - Propose fixes without affecting the host
15
15
  *
16
- * V1 Lifecycle:
17
- * 1. POST /api/v1/app-conversations — create with initial message
18
- * 2. GET /api/v1/app-conversations/start-taskspoll until READY
19
- * 3. GET /api/v1/app-conversations — poll until terminal state
16
+ * Local API Lifecycle:
17
+ * 1. POST /api/conversations — create conversation
18
+ * 2. POST /api/conversations/{id}/messagesend user prompt
19
+ * 3. GET /api/conversations/{id} — poll until STOPPED
20
+ * 4. GET /api/conversations/{id}/events — fetch agent events
21
+ * 5. DELETE /api/conversations/{id} — cleanup
20
22
  */
21
23
  export function withOpenHands(config) {
22
- const { serverUrl = 'http://localhost:3000', apiKey, model, repository, prompt, workingDirectory, timeout = 900_000, onEvent, output, autoWithdraw = true, } = config;
24
+ const { serverUrl = 'http://localhost:3001', repository, prompt, workingDirectory, selectedBranch, conversationInstructions, maxIterations = 50, timeout = 900_000, onEvent, output, autoWithdraw = true, } = config;
23
25
  return async (signal, ctx) => {
24
26
  const startTime = Date.now();
25
27
  const baseUrl = serverUrl.replace(/\/$/, '');
26
- // Build shared headers
27
28
  const headers = {
28
29
  'Content-Type': 'application/json',
29
30
  };
30
- if (apiKey) {
31
- headers['Authorization'] = `Bearer ${apiKey}`;
32
- }
33
- // 1. Resolve prompt
31
+ // Resolve dynamic config fields
34
32
  const resolvedPrompt = typeof prompt === 'function'
35
33
  ? await prompt(signal)
36
34
  : prompt;
37
- // 2. Resolve working directory
38
35
  const cwd = typeof workingDirectory === 'function'
39
36
  ? workingDirectory(signal)
40
37
  : workingDirectory;
41
- // 3. Resolve repository
42
38
  const repo = typeof repository === 'function'
43
39
  ? repository(signal)
44
40
  : repository;
45
- // 4. Create conversation with initial message
41
+ const branch = typeof selectedBranch === 'function'
42
+ ? selectedBranch(signal)
43
+ : selectedBranch;
46
44
  const events = [];
47
- const createBody = {
48
- initial_message: resolvedPrompt,
49
- };
50
- if (repo !== undefined)
51
- createBody.repository = repo;
52
- if (model !== undefined)
53
- createBody.selected_model = model;
54
- if (cwd !== undefined)
55
- createBody.initial_cwd = cwd;
56
- const createRes = await fetchWithTimeout(`${baseUrl}/api/v1/app-conversations`, {
57
- method: 'POST',
58
- headers,
59
- body: JSON.stringify(createBody),
60
- }, 30_000);
61
- if (!createRes.ok) {
62
- const errorText = await createRes.text().catch(() => 'unknown error');
63
- throw new OpenHandsError('CONVERSATION_CREATE_FAILED', `Failed to create OpenHands conversation: ${createRes.status} ${errorText}`);
64
- }
65
- const createData = await createRes.json();
66
- const conversationId = createData.conversation_id;
67
- if (!conversationId) {
68
- throw new OpenHandsError('CONVERSATION_CREATE_FAILED', 'OpenHands returned no conversation ID');
69
- }
70
- ctx.log(`OpenHands conversation ${conversationId} created`);
71
- // 5. Wait for startup
72
- await waitForStartup(baseUrl, conversationId, headers, 60_000, ctx);
73
- // 6. Wait for completion
74
- const result = await waitForCompletion(baseUrl, conversationId, headers, timeout, events, onEvent, ctx);
75
- const durationMs = Date.now() - startTime;
76
- const openHandsResult = {
77
- status: result.status,
78
- text: result.text,
79
- conversationId,
80
- durationMs,
81
- events,
82
- };
83
- ctx.log(`OpenHands ${result.status} in ${durationMs}ms ` +
84
- `(conversation=${conversationId}, events=${events.length})`);
85
- // 7. Deposit output signals
86
- const deposits = resolveOutput(output, openHandsResult, signal);
87
- for (const deposit of deposits) {
88
- await ctx.deposit(deposit.type, deposit.payload ?? { ...openHandsResult }, {
89
- causedBy: [signal.id],
90
- tags: deposit.tags,
91
- ttl: deposit.ttl,
92
- });
45
+ let conversationId;
46
+ try {
47
+ // 1. Create conversation
48
+ const createBody = {
49
+ max_iterations: maxIterations,
50
+ };
51
+ if (repo !== undefined)
52
+ createBody.repository = repo;
53
+ if (resolvedPrompt)
54
+ createBody.initial_user_msg = resolvedPrompt;
55
+ if (branch !== undefined)
56
+ createBody.selected_branch = branch;
57
+ if (conversationInstructions !== undefined)
58
+ createBody.conversation_instructions = conversationInstructions;
59
+ const createRes = await fetchWithTimeout(`${baseUrl}/api/conversations`, { method: 'POST', headers, body: JSON.stringify(createBody) }, 30_000);
60
+ if (!createRes.ok) {
61
+ const errorText = await createRes.text().catch(() => 'unknown error');
62
+ throw new OpenHandsError('CONVERSATION_CREATE_FAILED', `Failed to create OpenHands conversation: ${createRes.status} ${truncate(errorText, 500)}`);
63
+ }
64
+ const createData = await createRes.json();
65
+ conversationId = createData.conversation_id;
66
+ if (!conversationId) {
67
+ throw new OpenHandsError('CONVERSATION_CREATE_FAILED', 'OpenHands returned no conversation ID');
68
+ }
69
+ ctx.log(`OpenHands conversation ${conversationId} created`);
70
+ // 2. Send user prompt as message
71
+ const messageRes = await fetchWithTimeout(`${baseUrl}/api/conversations/${conversationId}/message`, {
72
+ method: 'POST',
73
+ headers,
74
+ body: JSON.stringify({ message: resolvedPrompt }),
75
+ }, 30_000);
76
+ if (!messageRes.ok) {
77
+ const errorText = await messageRes.text().catch(() => 'unknown error');
78
+ throw new OpenHandsError('MESSAGE_SEND_FAILED', `Failed to send message to conversation ${conversationId}: ${messageRes.status} ${truncate(errorText, 500)}`);
79
+ }
80
+ ctx.log(`Message sent to conversation ${conversationId}`);
81
+ // 3. Poll for completion
82
+ const finalStatus = await pollForCompletion(baseUrl, conversationId, headers, timeout, onEvent, events, ctx);
83
+ // 4. Fetch events
84
+ await fetchEvents(baseUrl, conversationId, headers, events, onEvent, ctx);
85
+ const durationMs = Date.now() - startTime;
86
+ // Extract result text from events or conversation data
87
+ const resultText = extractResultText(events, finalStatus);
88
+ const openHandsResult = {
89
+ status: finalStatus,
90
+ text: resultText,
91
+ conversationId,
92
+ durationMs,
93
+ events,
94
+ };
95
+ ctx.log(`OpenHands ${finalStatus} in ${durationMs}ms ` +
96
+ `(conversation=${conversationId}, events=${events.length})`);
97
+ // 5. Deposit output signals
98
+ const deposits = resolveOutput(output, openHandsResult, signal);
99
+ for (const deposit of deposits) {
100
+ await ctx.deposit(deposit.type, deposit.payload ?? { ...openHandsResult }, {
101
+ causedBy: [signal.id],
102
+ tags: deposit.tags,
103
+ ttl: deposit.ttl,
104
+ });
105
+ }
106
+ // 6. Auto-withdraw
107
+ if (autoWithdraw) {
108
+ await ctx.withdraw(signal.id);
109
+ }
93
110
  }
94
- // 8. Auto-withdraw
95
- if (autoWithdraw) {
96
- await ctx.withdraw(signal.id);
111
+ finally {
112
+ // Always cleanup the conversation
113
+ if (conversationId) {
114
+ await fetchWithTimeout(`${baseUrl}/api/conversations/${conversationId}`, { method: 'DELETE', headers }, 10_000).catch(() => { });
115
+ }
97
116
  }
98
117
  };
99
118
  }
100
119
  // ----------------------------------------------------------
101
- // Startup polling
120
+ // Completion polling
102
121
  // ----------------------------------------------------------
103
122
  /**
104
- * Wait for the OpenHands conversation sandbox to be ready.
105
- * Polls the start-tasks endpoint until READY or ERROR.
123
+ * Poll the conversation status until it reaches a terminal state.
124
+ * The local API uses `status` (RUNNING/STOPPED) and `runtime_status`.
106
125
  */
107
- async function waitForStartup(baseUrl, conversationId, headers, startupTimeout, ctx) {
108
- const deadline = Date.now() + startupTimeout;
109
- const pollInterval = 2_000;
126
+ async function pollForCompletion(baseUrl, conversationId, headers, timeout, onEvent, events, ctx) {
127
+ const deadline = Date.now() + timeout;
128
+ const pollInterval = 3_000;
129
+ let lastStatus = '';
110
130
  while (Date.now() < deadline) {
111
- const res = await fetchWithTimeout(`${baseUrl}/api/v1/app-conversations/start-tasks?ids=${encodeURIComponent(conversationId)}`, { method: 'GET', headers }, 10_000).catch(() => null);
131
+ const res = await fetchWithTimeout(`${baseUrl}/api/conversations/${conversationId}`, { method: 'GET', headers }, 10_000).catch(() => null);
112
132
  if (res?.ok) {
113
- const data = await res.json().catch(() => ({}));
114
- const tasks = data.tasks;
115
- if (tasks && tasks.length > 0) {
116
- const task = tasks[0];
117
- const status = task.status;
118
- if (status === 'READY') {
119
- return;
120
- }
121
- if (status === 'ERROR') {
122
- throw new OpenHandsError('STARTUP_FAILED', `OpenHands startup failed for conversation ${conversationId}`);
133
+ const data = await res.json().catch((err) => {
134
+ ctx.log(`Warning: failed to parse poll response: ${err.message}`, 'warn');
135
+ return {};
136
+ });
137
+ const status = data.status;
138
+ const runtimeStatus = data.runtime_status;
139
+ // Emit synthetic event on status change
140
+ const currentStatus = `${status}:${runtimeStatus}`;
141
+ if (currentStatus !== lastStatus) {
142
+ lastStatus = currentStatus;
143
+ const event = {
144
+ id: events.length + 1,
145
+ source: 'environment',
146
+ observation: 'status_change',
147
+ message: `status=${status} runtime_status=${runtimeStatus}`,
148
+ timestamp: new Date().toISOString(),
149
+ };
150
+ events.push(event);
151
+ if (onEvent) {
152
+ try {
153
+ onEvent(event);
154
+ }
155
+ catch { /* swallow callback errors */ }
123
156
  }
124
157
  }
158
+ // STOPPED is the terminal state for the local API
159
+ if (status === 'STOPPED') {
160
+ return 'finished';
161
+ }
125
162
  }
126
163
  await sleep(pollInterval);
127
164
  }
128
- throw new OpenHandsError('STARTUP_TIMEOUT', `OpenHands startup timed out after ${startupTimeout}ms for conversation ${conversationId}`);
165
+ return 'timeout';
129
166
  }
130
167
  // ----------------------------------------------------------
131
- // Completion polling
168
+ // Events fetching
132
169
  // ----------------------------------------------------------
133
170
  /**
134
- * Wait for the OpenHands conversation to reach a terminal state.
135
- * Polls the conversations endpoint and emits synthetic events on status changes.
171
+ * Fetch all events from the conversation events endpoint.
136
172
  */
137
- async function waitForCompletion(baseUrl, conversationId, headers, timeout, events, onEvent, ctx) {
138
- const deadline = Date.now() + timeout;
139
- const pollInterval = 5_000;
140
- let lastStatus = '';
141
- while (Date.now() < deadline) {
142
- const statusRes = await fetchWithTimeout(`${baseUrl}/api/v1/app-conversations?ids=${encodeURIComponent(conversationId)}`, { method: 'GET', headers }, 10_000).catch(() => null);
143
- if (statusRes?.ok) {
144
- const statusData = await statusRes.json().catch((err) => {
145
- ctx.log(`Warning: failed to parse poll response: ${err.message}`, 'warn');
146
- return {};
147
- });
148
- const conversations = statusData.conversations;
149
- if (conversations && conversations.length > 0) {
150
- const conv = conversations[0];
151
- const executionStatus = conv.execution_status;
152
- const sandboxStatus = conv.sandbox_status;
153
- const lastMessage = conv.last_message;
154
- // Emit synthetic event on status change
155
- const currentStatus = `${executionStatus}:${sandboxStatus}`;
156
- if (currentStatus !== lastStatus) {
157
- lastStatus = currentStatus;
158
- const event = {
159
- id: events.length + 1,
160
- source: 'environment',
161
- observation: 'status_change',
162
- message: `execution=${executionStatus} sandbox=${sandboxStatus}`,
163
- timestamp: new Date().toISOString(),
164
- };
165
- events.push(event);
166
- if (onEvent) {
167
- try {
168
- onEvent(event);
169
- }
170
- catch { /* swallow callback errors */ }
171
- }
172
- }
173
- // Check terminal states
174
- if (executionStatus === 'FINISHED') {
175
- return { status: 'finished', text: lastMessage ?? '' };
176
- }
177
- if (executionStatus === 'ERROR') {
178
- return { status: 'error', text: lastMessage ?? 'Agent encountered an error' };
179
- }
180
- if (executionStatus === 'STUCK') {
181
- return { status: 'stuck', text: lastMessage ?? 'Agent is stuck' };
182
- }
183
- if (sandboxStatus === 'ERROR') {
184
- return { status: 'error', text: lastMessage ?? 'Sandbox error' };
185
- }
186
- if (executionStatus === 'PAUSED' && sandboxStatus === 'STOPPED') {
187
- return { status: 'stopped', text: lastMessage ?? 'Agent was stopped' };
188
- }
173
+ async function fetchEvents(baseUrl, conversationId, headers, events, onEvent, ctx) {
174
+ const res = await fetchWithTimeout(`${baseUrl}/api/conversations/${conversationId}/events`, { method: 'GET', headers }, 30_000).catch(() => null);
175
+ if (!res?.ok) {
176
+ ctx.log(`Warning: failed to fetch events for conversation ${conversationId}`, 'warn');
177
+ return;
178
+ }
179
+ const data = await res.json().catch(() => []);
180
+ for (let i = 0; i < data.length; i++) {
181
+ const raw = data[i];
182
+ const event = {
183
+ id: events.length + 1,
184
+ source: raw.source ?? 'agent',
185
+ action: raw.action,
186
+ observation: raw.observation,
187
+ message: raw.message,
188
+ args: raw.args,
189
+ content: raw.content,
190
+ extras: raw.extras,
191
+ timestamp: raw.timestamp,
192
+ };
193
+ events.push(event);
194
+ if (onEvent) {
195
+ try {
196
+ onEvent(event);
189
197
  }
198
+ catch { /* swallow callback errors */ }
190
199
  }
191
- await sleep(pollInterval);
192
200
  }
193
- return { status: 'timeout', text: 'Agent timed out' };
201
+ }
202
+ // ----------------------------------------------------------
203
+ // Result text extraction
204
+ // ----------------------------------------------------------
205
+ /**
206
+ * Extract the best result text from the collected events.
207
+ * Falls back to a status-based message.
208
+ */
209
+ function extractResultText(events, status) {
210
+ // Walk events in reverse looking for the last agent message
211
+ for (let i = events.length - 1; i >= 0; i--) {
212
+ const event = events[i];
213
+ if (event.source === 'agent' && event.message) {
214
+ return event.message;
215
+ }
216
+ if (event.source === 'agent' && event.content) {
217
+ return event.content;
218
+ }
219
+ }
220
+ // Fallback
221
+ if (status === 'timeout')
222
+ return 'Agent timed out';
223
+ if (status === 'error')
224
+ return 'Agent encountered an error';
225
+ return '';
194
226
  }
195
227
  // ----------------------------------------------------------
196
228
  // Helpers
@@ -205,8 +237,14 @@ async function fetchWithTimeout(url, init, timeoutMs) {
205
237
  function sleep(ms) {
206
238
  return new Promise(resolve => setTimeout(resolve, ms));
207
239
  }
240
+ /** Truncate a string to a max length. */
241
+ function truncate(str, maxLen) {
242
+ if (str.length <= maxLen)
243
+ return str;
244
+ return str.slice(0, maxLen) + '...';
245
+ }
208
246
  // ----------------------------------------------------------
209
- // Output mapping (same 3-pattern as withOpenCode/withClaudeCode)
247
+ // Output mapping (same 3-pattern as withClaudeCode/withBash)
210
248
  // ----------------------------------------------------------
211
249
  function resolveOutput(output, result, signal) {
212
250
  if (!output) {
@@ -1 +1 @@
1
- {"version":3,"file":"openhands.js","sourceRoot":"","sources":["../../../src/providers/openhands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openhands.js","sourceRoot":"","sources":["../../../src/providers/openhands.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mandible-ai/mandible",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Universal stigmergy framework for autonomous agent coordination — like ant colonies using pheromone trails",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",