happy-imou-cloud 2.1.49 → 2.1.51

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.
Files changed (55) hide show
  1. package/dist/AcpBackend-CqO3D07V.mjs +2619 -0
  2. package/dist/AcpBackend-XPiTd6ph.cjs +2621 -0
  3. package/dist/{BaseReasoningProcessor-Dn9NcoHz.cjs → BaseReasoningProcessor-BD9tiwep.cjs} +1 -144
  4. package/dist/{BaseReasoningProcessor-CAVeOdyo.mjs → BaseReasoningProcessor-CjlayL2f.mjs} +2 -144
  5. package/dist/ConversationHistory-Bl2doTA-.cjs +780 -0
  6. package/dist/ConversationHistory-CI5bBfuA.mjs +771 -0
  7. package/dist/{ProviderSelectionHandler-BJJc7qOR.cjs → ProviderSelectionHandler-C7GE5QjX.cjs} +6 -6
  8. package/dist/{ProviderSelectionHandler-DIYidT13.mjs → ProviderSelectionHandler-uQ8jzdzr.mjs} +2 -2
  9. package/dist/RuntimeShell-BDt42io_.mjs +252 -0
  10. package/dist/RuntimeShell-D_Te12wq.cjs +258 -0
  11. package/dist/bootstrapManagedProviderSession-Bln-TwyB.cjs +147 -0
  12. package/dist/bootstrapManagedProviderSession-D2Z6YU3n.mjs +145 -0
  13. package/dist/claude-BKNT-2fG.cjs +1080 -0
  14. package/dist/claude-CnN5WCWj.mjs +1073 -0
  15. package/dist/codex-DLGP8WF6.mjs +577 -0
  16. package/dist/codex-Fv2eali8.cjs +582 -0
  17. package/dist/{command-VcH4hbhi.cjs → command-BWPlJyCN.cjs} +16 -8
  18. package/dist/{command-CzfRRhVe.mjs → command-CELwsYoG.mjs} +15 -7
  19. package/dist/config-CFL0Gkqt.cjs +184 -0
  20. package/dist/config-ChSPe7p9.mjs +174 -0
  21. package/dist/createDefaultRuntimeShell-BXu3vCvT.cjs +33 -0
  22. package/dist/createDefaultRuntimeShell-DOg6g3-G.mjs +31 -0
  23. package/dist/cursor-Blq1cHdr.cjs +91 -0
  24. package/dist/cursor-CwPNSy_A.mjs +88 -0
  25. package/dist/future-Dq4Ha1Dn.cjs +24 -0
  26. package/dist/future-xRdLl3vf.mjs +22 -0
  27. package/dist/{index-xa1kwZoj.cjs → index-B_JYgMUS.cjs} +189 -5352
  28. package/dist/{index-7Z93BoVn.mjs → index-CX-F_fuk.mjs} +177 -5331
  29. package/dist/index.cjs +2 -2
  30. package/dist/index.mjs +2 -2
  31. package/dist/installFatalProcessHandlers-0vaw9MAz.mjs +55 -0
  32. package/dist/installFatalProcessHandlers-CyURn5Bp.cjs +57 -0
  33. package/dist/launch-BoCCEd5p.mjs +63 -0
  34. package/dist/launch-wZA5BcvS.cjs +66 -0
  35. package/dist/lib.cjs +2 -3
  36. package/dist/lib.d.cts +20 -17
  37. package/dist/lib.d.mts +20 -17
  38. package/dist/lib.mjs +1 -2
  39. package/dist/resolveCommand-B3BGyBE2.mjs +189 -0
  40. package/dist/resolveCommand-DYMd9PNC.cjs +193 -0
  41. package/dist/{runClaude-zCwRhpOw.mjs → runClaude-Be0myF9k.mjs} +8 -5
  42. package/dist/{runClaude-BBGNmGj6.cjs → runClaude-DZJt5er7.cjs} +46 -43
  43. package/dist/{runCodex-BbgLVjb9.mjs → runCodex-BSnyN4m7.mjs} +226 -117
  44. package/dist/{runCodex-jUU6U2tZ.cjs → runCodex-DTCcGRue.cjs} +269 -160
  45. package/dist/runCursor-Bn1PuwJy.cjs +506 -0
  46. package/dist/runCursor-M6dQ6bGF.mjs +504 -0
  47. package/dist/{runGemini-DcwNsudA.mjs → runGemini-BNm4vYKA.mjs} +279 -5
  48. package/dist/{runGemini-C0NT8MHK.cjs → runGemini-Bn3lFhz6.cjs} +309 -35
  49. package/dist/{registerKillSessionHandler-DLDg2EES.mjs → sessionControl-1bT_7OI6.mjs} +1643 -2405
  50. package/dist/{registerKillSessionHandler-CfCya6si.cjs → sessionControl-flKnQrx0.cjs} +1647 -2417
  51. package/dist/{api-DnqaNvyV.mjs → types-B5vtxa38.mjs} +55 -5
  52. package/dist/{api-D7nAeZi7.cjs → types-CttABk32.cjs} +55 -4
  53. package/package.json +2 -2
  54. package/dist/types-CiliQpqS.mjs +0 -52
  55. package/dist/types-DVk3crez.cjs +0 -54
@@ -0,0 +1,504 @@
1
+ import { c as createCursorBackend } from './cursor-CwPNSy_A.mjs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { l as logger, b as connectionState, A as ApiClient, h as hashObject, d as AssistantMessageStream } from './types-B5vtxa38.mjs';
4
+ import { B as BasePermissionHandler, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as registerKillSessionHandler, c as resolveHappyOrgQueuedTurn, s as syncControlledByUserState, d as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, f as finalizeHappyOrgTurnWithBusinessAck, h as forwardAgentMessageToProviderSession } from './sessionControl-1bT_7OI6.mjs';
5
+ import { r as readManagedSessionTag, a as resolveManagedSessionTag, s as stopCaffeinate, b as closeProviderSession } from './index-CX-F_fuk.mjs';
6
+ import { b as bootstrapManagedProviderSession } from './bootstrapManagedProviderSession-D2Z6YU3n.mjs';
7
+ import { i as installFatalProcessHandlers } from './installFatalProcessHandlers-0vaw9MAz.mjs';
8
+ import { R as RuntimeShell } from './RuntimeShell-BDt42io_.mjs';
9
+ import './AcpBackend-CqO3D07V.mjs';
10
+ import 'cross-spawn';
11
+ import '@agentclientprotocol/sdk';
12
+ import 'ps-list';
13
+ import './resolveCommand-B3BGyBE2.mjs';
14
+ import 'node:fs';
15
+ import 'node:path';
16
+ import 'axios';
17
+ import 'chalk';
18
+ import 'fs';
19
+ import 'node:os';
20
+ import 'zod';
21
+ import 'node:events';
22
+ import 'node:fs/promises';
23
+ import 'socket.io-client';
24
+ import 'tweetnacl';
25
+ import 'fs/promises';
26
+ import 'crypto';
27
+ import 'path';
28
+ import 'node:child_process';
29
+ import 'expo-server-sdk';
30
+ import 'os';
31
+ import 'qrcode-terminal';
32
+ import 'node:module';
33
+ import 'open';
34
+ import 'react';
35
+ import 'ink';
36
+ import 'child_process';
37
+ import 'url';
38
+ import 'fastify';
39
+ import 'fastify-type-provider-zod';
40
+ import 'node:readline';
41
+ import 'http';
42
+ import 'util';
43
+ import 'node:url';
44
+
45
+ const ACP_PERMISSION_MODES$1 = [
46
+ "default",
47
+ "read-only",
48
+ "safe-yolo",
49
+ "yolo"
50
+ ];
51
+ function isAcpPermissionMode$1(value) {
52
+ return ACP_PERMISSION_MODES$1.includes(value);
53
+ }
54
+ class ManagedAcpPermissionHandler extends BasePermissionHandler {
55
+ constructor(session, logPrefix) {
56
+ super(session);
57
+ this.logPrefix = logPrefix;
58
+ }
59
+ currentPermissionMode = "default";
60
+ getLogPrefix() {
61
+ return this.logPrefix;
62
+ }
63
+ setPermissionMode(mode) {
64
+ this.currentPermissionMode = isAcpPermissionMode$1(mode) ? mode : "default";
65
+ logger.debug(`${this.getLogPrefix()} Permission mode set to: ${this.currentPermissionMode}`);
66
+ }
67
+ async handleToolCall(toolCallId, toolName, input) {
68
+ if (this.shouldAutoApprove(toolName, toolCallId)) {
69
+ logger.debug(`${this.getLogPrefix()} Auto-approving tool ${toolName} (${toolCallId}) in ${this.currentPermissionMode} mode`);
70
+ this.session.updateAgentState((currentState) => ({
71
+ ...currentState,
72
+ completedRequests: {
73
+ ...currentState.completedRequests,
74
+ [toolCallId]: {
75
+ tool: toolName,
76
+ arguments: input,
77
+ createdAt: Date.now(),
78
+ completedAt: Date.now(),
79
+ status: "approved",
80
+ decision: this.currentPermissionMode === "yolo" ? "approved_for_session" : "approved"
81
+ }
82
+ }
83
+ }));
84
+ return {
85
+ decision: this.currentPermissionMode === "yolo" ? "approved_for_session" : "approved"
86
+ };
87
+ }
88
+ return this.registerPendingRequest(
89
+ toolCallId,
90
+ toolName,
91
+ input,
92
+ ` in ${this.currentPermissionMode} mode`
93
+ );
94
+ }
95
+ shouldAutoApprove(toolName, toolCallId) {
96
+ const normalizedToolName = toolName.toLowerCase();
97
+ const normalizedToolCallId = toolCallId.toLowerCase();
98
+ const alwaysAutoApprove = ["reasoning", "think", "save_memory"];
99
+ if (alwaysAutoApprove.some((name) => normalizedToolName.includes(name)) || normalizedToolCallId.includes("save_memory")) {
100
+ return true;
101
+ }
102
+ switch (this.currentPermissionMode) {
103
+ case "yolo":
104
+ return true;
105
+ case "safe-yolo":
106
+ case "read-only": {
107
+ const readTools = [
108
+ "read",
109
+ "list",
110
+ "ls",
111
+ "view",
112
+ "cat",
113
+ "grep",
114
+ "search",
115
+ "glob",
116
+ "find",
117
+ "inspect",
118
+ "stat",
119
+ "tree"
120
+ ];
121
+ return readTools.some((name) => normalizedToolName.includes(name));
122
+ }
123
+ case "default":
124
+ default:
125
+ return false;
126
+ }
127
+ }
128
+ }
129
+
130
+ const ACP_PERMISSION_MODES = ["default", "read-only", "safe-yolo", "yolo"];
131
+ function isAcpPermissionMode(value) {
132
+ return typeof value === "string" && ACP_PERMISSION_MODES.includes(value);
133
+ }
134
+ function normalizePermissionMode(value, fallback) {
135
+ return isAcpPermissionMode(value) ? value : fallback;
136
+ }
137
+ function formatRuntimeError(error, providerLabel) {
138
+ if (error instanceof Error) {
139
+ return error.message || `${providerLabel} runtime failed`;
140
+ }
141
+ if (typeof error === "string") {
142
+ return error || `${providerLabel} runtime failed`;
143
+ }
144
+ try {
145
+ const serialized = JSON.stringify(error);
146
+ return serialized && serialized !== "{}" ? serialized : `${providerLabel} runtime failed`;
147
+ } catch {
148
+ return `${providerLabel} runtime failed`;
149
+ }
150
+ }
151
+ async function runManagedAcpProvider(opts) {
152
+ const provider = opts.provider;
153
+ const providerLabel = opts.providerLabel;
154
+ const managedSessionTag = opts.startedBy === "daemon" ? readManagedSessionTag() : null;
155
+ const sessionTag = managedSessionTag ?? resolveManagedSessionTag(
156
+ opts.startedBy === "daemon" ? process.env : {}
157
+ );
158
+ const requestedStartingMode = opts.startingMode ?? (opts.startedBy === "daemon" ? "remote" : "local");
159
+ connectionState.setBackend(providerLabel);
160
+ if (opts.startedBy === "daemon" && requestedStartingMode === "local") {
161
+ throw new Error(`Daemon-spawned ${providerLabel} sessions cannot use local mode.`);
162
+ }
163
+ const api = await ApiClient.create(opts.credentials);
164
+ let machineId;
165
+ try {
166
+ machineId = await ensureManagedProviderMachine({
167
+ api,
168
+ missingMachineIdMessage: "[START] No machine ID found in settings."
169
+ });
170
+ } catch (error) {
171
+ if (error instanceof MissingMachineIdError) {
172
+ console.error(error.message);
173
+ process.exit(1);
174
+ }
175
+ throw error;
176
+ }
177
+ let sessionClient;
178
+ let permissionHandler;
179
+ let runtimeHandle = null;
180
+ let unsubscribeRuntimeMessages = null;
181
+ let accumulatedResponse = "";
182
+ let currentPermissionMode = "default";
183
+ let taskStartedSent = false;
184
+ let turnAbortedSent = false;
185
+ let turnInFlight = false;
186
+ let shouldExit = false;
187
+ let cleanupStarted = false;
188
+ const abortController = new AbortController();
189
+ const assistantMessageStream = new AssistantMessageStream();
190
+ const messageQueue = new MessageQueue2((mode) => hashObject(mode));
191
+ let startupRolePrompt = null;
192
+ const { metadata, session: initialSession, reconnectionHandle, happyOrgStartupBinding } = await bootstrapManagedProviderSession({
193
+ api,
194
+ sessionTag,
195
+ flavor: provider,
196
+ machineId,
197
+ startedBy: opts.startedBy,
198
+ authFallbackLogMessage: `[${providerLabel}] Falling back to offline session stub after authentication failure`,
199
+ reconcileMetadataOnAttach: managedSessionTag !== null,
200
+ onSessionSwap: (newSession) => {
201
+ sessionClient = newSession;
202
+ permissionHandler.updateSession(newSession);
203
+ void syncControlledByUserState(newSession, false);
204
+ }
205
+ });
206
+ sessionClient = initialSession;
207
+ permissionHandler = new ManagedAcpPermissionHandler(sessionClient, `[${providerLabel}]`);
208
+ startupRolePrompt = happyOrgStartupBinding?.identityPrompt ?? null;
209
+ const sendAgentMessage = (body) => {
210
+ sessionClient.sendAgentMessage(provider, body);
211
+ };
212
+ const sendTaskStarted = () => {
213
+ if (taskStartedSent) {
214
+ return;
215
+ }
216
+ sendAgentMessage({
217
+ type: "task_started",
218
+ id: randomUUID()
219
+ });
220
+ taskStartedSent = true;
221
+ };
222
+ const sendTurnAborted = () => {
223
+ if (turnAbortedSent) {
224
+ return;
225
+ }
226
+ sendAgentMessage({
227
+ type: "turn_aborted",
228
+ id: randomUUID()
229
+ });
230
+ turnAbortedSent = true;
231
+ };
232
+ const commitAssistantStream = (text) => {
233
+ if (!assistantMessageStream.hasActive() && text.length === 0) {
234
+ return;
235
+ }
236
+ sendAgentMessage({
237
+ type: "message",
238
+ message: text,
239
+ ...assistantMessageStream.commit()
240
+ });
241
+ };
242
+ const abortAssistantStream = () => {
243
+ if (!assistantMessageStream.hasActive()) {
244
+ return;
245
+ }
246
+ sendAgentMessage({
247
+ type: "message",
248
+ message: "",
249
+ ...assistantMessageStream.abort()
250
+ });
251
+ };
252
+ const handleRuntimeMessage = (msg) => {
253
+ if (msg.type === "model-output") {
254
+ const delta = msg.textDelta ?? msg.fullText ?? "";
255
+ if (!delta) {
256
+ return;
257
+ }
258
+ accumulatedResponse += delta;
259
+ sendAgentMessage({
260
+ type: "message",
261
+ message: delta,
262
+ ...assistantMessageStream.delta()
263
+ });
264
+ return;
265
+ }
266
+ if (msg.type === "status") {
267
+ const detail = msg.detail ? String(msg.detail) : "";
268
+ logger.debug(`[${provider}] Status changed: ${msg.status}${detail ? ` - ${detail}` : ""}`);
269
+ if (msg.status === "running") {
270
+ turnInFlight = true;
271
+ sendTaskStarted();
272
+ sessionClient.keepAlive(true, "remote");
273
+ return;
274
+ }
275
+ if (msg.status === "error") {
276
+ sendTurnAborted();
277
+ abortAssistantStream();
278
+ sendAgentMessage({
279
+ type: "message",
280
+ message: detail ? `Error: ${detail}` : `${providerLabel} runtime error`
281
+ });
282
+ sessionClient.keepAlive(false, "remote");
283
+ return;
284
+ }
285
+ if (msg.status === "idle" || msg.status === "stopped") {
286
+ sessionClient.keepAlive(false, "remote");
287
+ }
288
+ return;
289
+ }
290
+ if (msg.type === "event" && msg.name === "thinking") {
291
+ const payload = msg.payload && typeof msg.payload === "object" ? msg.payload : null;
292
+ const text = typeof payload?.text === "string" ? payload.text : "";
293
+ if (text) {
294
+ sendAgentMessage({
295
+ type: "thinking",
296
+ text,
297
+ id: randomUUID()
298
+ });
299
+ }
300
+ return;
301
+ }
302
+ forwardAgentMessageToProviderSession(msg, {
303
+ provider,
304
+ send: (body) => sendAgentMessage(body)
305
+ });
306
+ };
307
+ const ensureRuntimeHandle = async () => {
308
+ if (runtimeHandle) {
309
+ return runtimeHandle;
310
+ }
311
+ const shell = new RuntimeShell();
312
+ const handle = await shell.launch({
313
+ provider,
314
+ cwd: metadata.path,
315
+ createBackend: (factoryOpts) => opts.createBackend({
316
+ ...factoryOpts,
317
+ permissionHandler
318
+ })
319
+ });
320
+ runtimeHandle = handle;
321
+ unsubscribeRuntimeMessages?.();
322
+ unsubscribeRuntimeMessages = handle.onMessage(handleRuntimeMessage);
323
+ return handle;
324
+ };
325
+ const disposeRuntimeHandle = async () => {
326
+ unsubscribeRuntimeMessages?.();
327
+ unsubscribeRuntimeMessages = null;
328
+ const handle = runtimeHandle;
329
+ runtimeHandle = null;
330
+ if (!handle) {
331
+ return;
332
+ }
333
+ try {
334
+ await handle.dispose();
335
+ } catch (error) {
336
+ logger.debug(`[${provider}] Error disposing runtime handle`, error);
337
+ }
338
+ };
339
+ const closeAll = async (closeOptions = { archiveOnClose: true }) => {
340
+ if (cleanupStarted) {
341
+ return;
342
+ }
343
+ cleanupStarted = true;
344
+ messageQueue.close();
345
+ abortController.abort();
346
+ reconnectionHandle?.cancel();
347
+ await disposeRuntimeHandle();
348
+ stopCaffeinate();
349
+ await closeProviderSession(sessionClient, closeOptions);
350
+ };
351
+ registerKillSessionHandler(sessionClient.rpcHandlerManager, async () => {
352
+ shouldExit = true;
353
+ messageQueue.close();
354
+ abortController.abort();
355
+ try {
356
+ await runtimeHandle?.cancel();
357
+ } catch (error) {
358
+ logger.debug(`[${provider}] Error cancelling runtime from killSession`, error);
359
+ }
360
+ });
361
+ sessionClient.onUserMessage((message) => {
362
+ const happyOrgResult = resolveHappyOrgQueuedTurn({
363
+ metadata: sessionClient.getMetadataSnapshot?.() ?? metadata,
364
+ message,
365
+ sessionId: sessionClient.sessionId
366
+ });
367
+ if (happyOrgResult.nextMetadata) {
368
+ sessionClient.updateMetadata(() => happyOrgResult.nextMetadata);
369
+ }
370
+ if (happyOrgResult.blocked) {
371
+ if (happyOrgResult.statusMessage) {
372
+ sessionClient.sendSessionEvent({ type: "message", message: happyOrgResult.statusMessage });
373
+ }
374
+ return;
375
+ }
376
+ currentPermissionMode = normalizePermissionMode(message.meta?.permissionMode, currentPermissionMode);
377
+ const originalUserMessage = message.content.text;
378
+ const queuedText = message.meta?.appendSystemPrompt ? `${message.meta.appendSystemPrompt}
379
+
380
+ ${originalUserMessage}` : originalUserMessage;
381
+ messageQueue.push(queuedText, {
382
+ permissionMode: currentPermissionMode,
383
+ originalUserMessage,
384
+ happyOrg: happyOrgResult.queuedTurn
385
+ });
386
+ });
387
+ if (opts.initialPrompt) {
388
+ messageQueue.push(opts.initialPrompt, {
389
+ permissionMode: "default",
390
+ originalUserMessage: opts.initialPrompt,
391
+ happyOrg: null
392
+ });
393
+ }
394
+ sessionClient.sendSessionEvent({ type: "ready" });
395
+ await syncControlledByUserState(sessionClient, false);
396
+ const keepAliveInterval = setInterval(() => {
397
+ sessionClient.keepAlive(turnInFlight, "remote");
398
+ }, 2e3);
399
+ const disposeFatalProcessHandlers = installFatalProcessHandlers({
400
+ label: provider,
401
+ cleanup: async ({ event, error }) => {
402
+ await closeAll({
403
+ archiveOnClose: true,
404
+ archiveReason: `Fatal ${event}: ${error.message}`
405
+ });
406
+ }
407
+ });
408
+ try {
409
+ while (!shouldExit) {
410
+ const queued = await messageQueue.waitForMessagesAndGetAsString(abortController.signal);
411
+ if (!queued) {
412
+ break;
413
+ }
414
+ currentPermissionMode = normalizePermissionMode(queued.mode.permissionMode, currentPermissionMode);
415
+ permissionHandler.setPermissionMode(currentPermissionMode);
416
+ accumulatedResponse = "";
417
+ taskStartedSent = false;
418
+ turnAbortedSent = false;
419
+ turnInFlight = true;
420
+ let turnStatus = "task_complete";
421
+ try {
422
+ const handle = await ensureRuntimeHandle();
423
+ let promptToSend = queued.message;
424
+ if (queued.mode.happyOrg) {
425
+ promptToSend = buildHappyOrgTurnPrompt(promptToSend, queued.mode.happyOrg);
426
+ }
427
+ if (startupRolePrompt) {
428
+ promptToSend = `${startupRolePrompt}
429
+
430
+ ${promptToSend}`;
431
+ startupRolePrompt = null;
432
+ }
433
+ await handle.sendPrompt(promptToSend);
434
+ await waitForResponseCompleteWithAbort(handle.backend, abortController.signal);
435
+ } catch (error) {
436
+ const isAbortError = error instanceof Error && error.name === "AbortError";
437
+ turnStatus = "turn_aborted";
438
+ sendTurnAborted();
439
+ abortAssistantStream();
440
+ if (!isAbortError) {
441
+ const errorMessage = formatRuntimeError(error, providerLabel);
442
+ logger.debug(`[${provider}] Error in managed provider loop`, error);
443
+ sendAgentMessage({
444
+ type: "message",
445
+ message: errorMessage
446
+ });
447
+ }
448
+ } finally {
449
+ turnInFlight = false;
450
+ permissionHandler.reset();
451
+ const finalizedTurn = await finalizeHappyOrgTurnWithBusinessAck({
452
+ metadata: sessionClient.getMetadataSnapshot?.() ?? metadata,
453
+ queuedTurn: queued.mode.happyOrg,
454
+ responseText: accumulatedResponse,
455
+ turnStatus,
456
+ submitDispatchAck: async (submission) => {
457
+ await api.submitOrganizationDispatchBusinessAck(submission);
458
+ }
459
+ });
460
+ if (finalizedTurn.nextMetadata) {
461
+ sessionClient.updateMetadata(() => finalizedTurn.nextMetadata);
462
+ }
463
+ if (finalizedTurn.report) {
464
+ sendAgentMessage({
465
+ type: "turn-report",
466
+ id: randomUUID(),
467
+ report: finalizedTurn.report
468
+ });
469
+ }
470
+ if (finalizedTurn.terminateMessage) {
471
+ sessionClient.sendSessionEvent({ type: "message", message: finalizedTurn.terminateMessage });
472
+ }
473
+ if ((finalizedTurn.dispatchAck.outcome === "invalid" || finalizedTurn.dispatchAck.outcome === "error") && finalizedTurn.dispatchAck.diagnostic) {
474
+ sessionClient.sendSessionEvent({ type: "message", message: finalizedTurn.dispatchAck.diagnostic });
475
+ }
476
+ commitAssistantStream(finalizedTurn.cleanedText);
477
+ sendAgentMessage({
478
+ type: "task_complete",
479
+ id: randomUUID()
480
+ });
481
+ sessionClient.keepAlive(false, "remote");
482
+ sessionClient.sendSessionEvent({ type: "ready" });
483
+ }
484
+ }
485
+ } finally {
486
+ disposeFatalProcessHandlers();
487
+ clearInterval(keepAliveInterval);
488
+ await closeAll({ archiveOnClose: true });
489
+ }
490
+ }
491
+
492
+ async function runCursor(opts) {
493
+ await runManagedAcpProvider({
494
+ provider: "cursor",
495
+ providerLabel: "Cursor",
496
+ credentials: opts.credentials,
497
+ startedBy: opts.startedBy,
498
+ startingMode: opts.startingMode,
499
+ initialPrompt: opts.initialPrompt,
500
+ createBackend: (factoryOpts) => createCursorBackend(factoryOpts).backend
501
+ });
502
+ }
503
+
504
+ export { runCursor };