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