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.
- package/dist/AcpBackend-CqO3D07V.mjs +2619 -0
- package/dist/AcpBackend-XPiTd6ph.cjs +2621 -0
- package/dist/{BaseReasoningProcessor-Dn9NcoHz.cjs → BaseReasoningProcessor-BD9tiwep.cjs} +1 -144
- package/dist/{BaseReasoningProcessor-CAVeOdyo.mjs → BaseReasoningProcessor-CjlayL2f.mjs} +2 -144
- package/dist/ConversationHistory-Bl2doTA-.cjs +780 -0
- package/dist/ConversationHistory-CI5bBfuA.mjs +771 -0
- package/dist/{ProviderSelectionHandler-BJJc7qOR.cjs → ProviderSelectionHandler-C7GE5QjX.cjs} +6 -6
- package/dist/{ProviderSelectionHandler-DIYidT13.mjs → ProviderSelectionHandler-uQ8jzdzr.mjs} +2 -2
- package/dist/RuntimeShell-BDt42io_.mjs +252 -0
- package/dist/RuntimeShell-D_Te12wq.cjs +258 -0
- package/dist/bootstrapManagedProviderSession-Bln-TwyB.cjs +147 -0
- package/dist/bootstrapManagedProviderSession-D2Z6YU3n.mjs +145 -0
- package/dist/claude-BKNT-2fG.cjs +1080 -0
- package/dist/claude-CnN5WCWj.mjs +1073 -0
- package/dist/codex-DLGP8WF6.mjs +577 -0
- package/dist/codex-Fv2eali8.cjs +582 -0
- package/dist/{command-VcH4hbhi.cjs → command-BWPlJyCN.cjs} +16 -8
- package/dist/{command-CzfRRhVe.mjs → command-CELwsYoG.mjs} +15 -7
- package/dist/config-CFL0Gkqt.cjs +184 -0
- package/dist/config-ChSPe7p9.mjs +174 -0
- package/dist/createDefaultRuntimeShell-BXu3vCvT.cjs +33 -0
- package/dist/createDefaultRuntimeShell-DOg6g3-G.mjs +31 -0
- package/dist/cursor-Blq1cHdr.cjs +91 -0
- package/dist/cursor-CwPNSy_A.mjs +88 -0
- package/dist/future-Dq4Ha1Dn.cjs +24 -0
- package/dist/future-xRdLl3vf.mjs +22 -0
- package/dist/{index-xa1kwZoj.cjs → index-B_JYgMUS.cjs} +189 -5352
- package/dist/{index-7Z93BoVn.mjs → index-CX-F_fuk.mjs} +177 -5331
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/installFatalProcessHandlers-0vaw9MAz.mjs +55 -0
- package/dist/installFatalProcessHandlers-CyURn5Bp.cjs +57 -0
- package/dist/launch-BoCCEd5p.mjs +63 -0
- package/dist/launch-wZA5BcvS.cjs +66 -0
- package/dist/lib.cjs +2 -3
- package/dist/lib.d.cts +20 -17
- package/dist/lib.d.mts +20 -17
- package/dist/lib.mjs +1 -2
- package/dist/resolveCommand-B3BGyBE2.mjs +189 -0
- package/dist/resolveCommand-DYMd9PNC.cjs +193 -0
- package/dist/{runClaude-zCwRhpOw.mjs → runClaude-Be0myF9k.mjs} +8 -5
- package/dist/{runClaude-BBGNmGj6.cjs → runClaude-DZJt5er7.cjs} +46 -43
- package/dist/{runCodex-BbgLVjb9.mjs → runCodex-BSnyN4m7.mjs} +226 -117
- package/dist/{runCodex-jUU6U2tZ.cjs → runCodex-DTCcGRue.cjs} +269 -160
- package/dist/runCursor-Bn1PuwJy.cjs +506 -0
- package/dist/runCursor-M6dQ6bGF.mjs +504 -0
- package/dist/{runGemini-DcwNsudA.mjs → runGemini-BNm4vYKA.mjs} +279 -5
- package/dist/{runGemini-C0NT8MHK.cjs → runGemini-Bn3lFhz6.cjs} +309 -35
- package/dist/{registerKillSessionHandler-DLDg2EES.mjs → sessionControl-1bT_7OI6.mjs} +1643 -2405
- package/dist/{registerKillSessionHandler-CfCya6si.cjs → sessionControl-flKnQrx0.cjs} +1647 -2417
- package/dist/{api-DnqaNvyV.mjs → types-B5vtxa38.mjs} +55 -5
- package/dist/{api-D7nAeZi7.cjs → types-CttABk32.cjs} +55 -4
- package/package.json +2 -2
- package/dist/types-CiliQpqS.mjs +0 -52
- 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 };
|