@adhdev/daemon-core 0.9.82-rc.93 → 0.9.82-rc.94
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/cli-adapters/provider-cli-adapter.d.ts +8 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +8 -0
- package/dist/index.js +149 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +149 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +158 -9
- package/src/cli-adapters/provider-cli-shared.ts +8 -0
- package/src/commands/chat-commands.ts +1 -1
- package/src/commands/cli-manager.ts +5 -13
package/dist/index.mjs
CHANGED
|
@@ -4640,6 +4640,9 @@ var init_provider_cli_adapter = __esm({
|
|
|
4640
4640
|
idleFinishCandidate = null;
|
|
4641
4641
|
finishRetryTimer = null;
|
|
4642
4642
|
finishRetryCount = 0;
|
|
4643
|
+
pendingOutboundQueue = [];
|
|
4644
|
+
pendingOutboundFlushTimer = null;
|
|
4645
|
+
pendingOutboundFlushInFlight = false;
|
|
4643
4646
|
// Resize redraw suppression
|
|
4644
4647
|
resizeSuppressUntil = 0;
|
|
4645
4648
|
// Debug: status transition history
|
|
@@ -5660,6 +5663,7 @@ ${lastSnapshot}`;
|
|
|
5660
5663
|
this.activeModal = null;
|
|
5661
5664
|
this.setStatus("idle", "response_finished");
|
|
5662
5665
|
this.onStatusChange?.();
|
|
5666
|
+
this.schedulePendingOutboundFlush();
|
|
5663
5667
|
}
|
|
5664
5668
|
maybeCommitVisibleIdleTranscript(session, parsedMessages) {
|
|
5665
5669
|
const allowImmediateScriptIdleCommit = this.provider.allowInputDuringGeneration === true;
|
|
@@ -5680,6 +5684,7 @@ ${lastSnapshot}`;
|
|
|
5680
5684
|
this.activeModal = null;
|
|
5681
5685
|
this.setStatus("idle", "script_idle_commit");
|
|
5682
5686
|
this.onStatusChange?.();
|
|
5687
|
+
this.schedulePendingOutboundFlush();
|
|
5683
5688
|
this.recordTrace("script_idle_commit", {
|
|
5684
5689
|
messageCount: parsedMessages.length,
|
|
5685
5690
|
lastAssistant: summarizeCliTraceText(visibleAssistant.content, 320)
|
|
@@ -5862,6 +5867,14 @@ ${lastSnapshot}`;
|
|
|
5862
5867
|
messages: [],
|
|
5863
5868
|
workingDir: this.workingDir,
|
|
5864
5869
|
activeModal: effectiveModal,
|
|
5870
|
+
pendingOutboundCount: this.pendingOutboundQueue.length,
|
|
5871
|
+
pendingOutboundMessages: this.pendingOutboundQueue.map((message) => ({
|
|
5872
|
+
id: message.id,
|
|
5873
|
+
role: message.role,
|
|
5874
|
+
content: message.content,
|
|
5875
|
+
queuedAt: message.queuedAt,
|
|
5876
|
+
source: message.source
|
|
5877
|
+
})),
|
|
5865
5878
|
errorMessage: this.parseErrorMessage || void 0,
|
|
5866
5879
|
errorReason: this.parseErrorMessage ? "parse_error" : void 0,
|
|
5867
5880
|
...bufferState ? { bufferState } : {}
|
|
@@ -6158,6 +6171,90 @@ ${lastSnapshot}`;
|
|
|
6158
6171
|
), 50);
|
|
6159
6172
|
}
|
|
6160
6173
|
async sendMessage(text) {
|
|
6174
|
+
await this.sendMessageNow(text, true);
|
|
6175
|
+
}
|
|
6176
|
+
enqueuePendingOutboundMessage(text, reason) {
|
|
6177
|
+
const content = String(text || "");
|
|
6178
|
+
const duplicate = this.pendingOutboundQueue.some((message2) => message2.content === content);
|
|
6179
|
+
if (duplicate) {
|
|
6180
|
+
this.recordTrace("send_message_queued_duplicate_suppressed", {
|
|
6181
|
+
reason,
|
|
6182
|
+
queueLength: this.pendingOutboundQueue.length,
|
|
6183
|
+
text: summarizeCliTraceText(content, 500)
|
|
6184
|
+
});
|
|
6185
|
+
return;
|
|
6186
|
+
}
|
|
6187
|
+
const queuedAt = Date.now();
|
|
6188
|
+
const message = {
|
|
6189
|
+
id: `${queuedAt}:${this.pendingOutboundQueue.length}:${Math.random().toString(36).slice(2, 10)}`,
|
|
6190
|
+
role: "user",
|
|
6191
|
+
content,
|
|
6192
|
+
queuedAt,
|
|
6193
|
+
source: "sendMessage"
|
|
6194
|
+
};
|
|
6195
|
+
this.pendingOutboundQueue.push(message);
|
|
6196
|
+
this.recordTrace("send_message_queued", {
|
|
6197
|
+
reason,
|
|
6198
|
+
queueLength: this.pendingOutboundQueue.length,
|
|
6199
|
+
queuedAt,
|
|
6200
|
+
text: summarizeCliTraceText(content, 500)
|
|
6201
|
+
});
|
|
6202
|
+
LOG.info("CLI", `[${this.cliType}] queued outbound message while busy (${reason}); queue=${this.pendingOutboundQueue.length}`);
|
|
6203
|
+
this.onStatusChange?.();
|
|
6204
|
+
}
|
|
6205
|
+
shouldQueuePendingOutboundMessage(parsedStatusBeforeSend = null) {
|
|
6206
|
+
if (this.provider.allowInputDuringGeneration === true) return null;
|
|
6207
|
+
if (this.hasActionableApproval()) return null;
|
|
6208
|
+
const parsedSessionStatus = typeof parsedStatusBeforeSend?.status === "string" ? String(parsedStatusBeforeSend.status) : "";
|
|
6209
|
+
if (parsedSessionStatus === "idle" && this.parsedStatusHasFinalAssistantMessage(parsedStatusBeforeSend)) return null;
|
|
6210
|
+
if (this.currentStatus === "generating") return "current_status_generating";
|
|
6211
|
+
if (parsedSessionStatus === "generating" || parsedSessionStatus === "long_generating") {
|
|
6212
|
+
const parsedModal = parsedStatusBeforeSend?.activeModal ?? parsedStatusBeforeSend?.modal ?? null;
|
|
6213
|
+
const parsedHasActionableModal = Boolean(
|
|
6214
|
+
parsedModal && Array.isArray(parsedModal.buttons) && parsedModal.buttons.some((candidate) => typeof candidate === "string" && candidate.trim())
|
|
6215
|
+
);
|
|
6216
|
+
const terminalLooksIdle = this.currentStatus === "idle" && this.runDetectStatus(this.recentOutputBuffer) === "idle" && !this.isWaitingForResponse && !this.currentTurnScope && !this.hasActionableApproval() && !parsedHasActionableModal;
|
|
6217
|
+
return terminalLooksIdle ? null : `parsed_status_${parsedSessionStatus}`;
|
|
6218
|
+
}
|
|
6219
|
+
if (this.isWaitingForResponse && this.currentTurnScope) return "active_turn_in_progress";
|
|
6220
|
+
return null;
|
|
6221
|
+
}
|
|
6222
|
+
schedulePendingOutboundFlush(delayMs = 0) {
|
|
6223
|
+
if (this.pendingOutboundFlushTimer) clearTimeout(this.pendingOutboundFlushTimer);
|
|
6224
|
+
this.pendingOutboundFlushTimer = setTimeout(() => {
|
|
6225
|
+
this.pendingOutboundFlushTimer = null;
|
|
6226
|
+
void this.flushPendingOutboundQueue();
|
|
6227
|
+
}, Math.max(0, delayMs));
|
|
6228
|
+
}
|
|
6229
|
+
async flushPendingOutboundQueue() {
|
|
6230
|
+
if (this.pendingOutboundFlushInFlight || this.pendingOutboundQueue.length === 0) return;
|
|
6231
|
+
if (this.currentStatus !== "idle" || this.isWaitingForResponse || this.hasActionableApproval()) return;
|
|
6232
|
+
this.pendingOutboundFlushInFlight = true;
|
|
6233
|
+
try {
|
|
6234
|
+
while (this.pendingOutboundQueue.length > 0) {
|
|
6235
|
+
if (this.currentStatus !== "idle" || this.isWaitingForResponse || this.hasActionableApproval()) break;
|
|
6236
|
+
const next = this.pendingOutboundQueue[0];
|
|
6237
|
+
this.recordTrace("send_message_queue_flush", {
|
|
6238
|
+
id: next.id,
|
|
6239
|
+
queuedAt: next.queuedAt,
|
|
6240
|
+
queueLength: this.pendingOutboundQueue.length,
|
|
6241
|
+
text: summarizeCliTraceText(next.content, 500)
|
|
6242
|
+
});
|
|
6243
|
+
try {
|
|
6244
|
+
await this.sendMessageNow(next.content, false);
|
|
6245
|
+
this.pendingOutboundQueue.shift();
|
|
6246
|
+
this.onStatusChange?.();
|
|
6247
|
+
} catch (error) {
|
|
6248
|
+
LOG.warn("CLI", `[${this.cliType}] queued outbound flush failed: ${error?.message || error}`);
|
|
6249
|
+
this.schedulePendingOutboundFlush(1e3);
|
|
6250
|
+
break;
|
|
6251
|
+
}
|
|
6252
|
+
}
|
|
6253
|
+
} finally {
|
|
6254
|
+
this.pendingOutboundFlushInFlight = false;
|
|
6255
|
+
}
|
|
6256
|
+
}
|
|
6257
|
+
async sendMessageNow(text, allowQueue) {
|
|
6161
6258
|
if (!this.ptyProcess) throw new Error(`${this.cliName} is not running`);
|
|
6162
6259
|
const allowInputDuringGeneration = this.provider.allowInputDuringGeneration === true;
|
|
6163
6260
|
const allowInterventionPrompt = allowInputDuringGeneration && this.isWaitingForResponse && !this.hasActionableApproval();
|
|
@@ -6168,6 +6265,18 @@ ${lastSnapshot}`;
|
|
|
6168
6265
|
await new Promise((resolve16) => setTimeout(resolve16, 50));
|
|
6169
6266
|
}
|
|
6170
6267
|
}
|
|
6268
|
+
const parsedStatusBeforeSend = !allowInputDuringGeneration ? (() => {
|
|
6269
|
+
try {
|
|
6270
|
+
return this.getScriptParsedStatus?.() || null;
|
|
6271
|
+
} catch {
|
|
6272
|
+
return null;
|
|
6273
|
+
}
|
|
6274
|
+
})() : null;
|
|
6275
|
+
const queueReason = this.shouldQueuePendingOutboundMessage(parsedStatusBeforeSend);
|
|
6276
|
+
if (allowQueue && queueReason) {
|
|
6277
|
+
this.enqueuePendingOutboundMessage(text, queueReason);
|
|
6278
|
+
return;
|
|
6279
|
+
}
|
|
6171
6280
|
if (!allowInterventionPrompt) {
|
|
6172
6281
|
await this.waitForInteractivePrompt();
|
|
6173
6282
|
}
|
|
@@ -6180,13 +6289,6 @@ ${lastSnapshot}`;
|
|
|
6180
6289
|
}
|
|
6181
6290
|
}
|
|
6182
6291
|
if (!this.ready) throw new Error(`${this.cliName} not ready (status: ${this.currentStatus})`);
|
|
6183
|
-
const parsedStatusBeforeSend = !allowInputDuringGeneration ? (() => {
|
|
6184
|
-
try {
|
|
6185
|
-
return this.getScriptParsedStatus?.() || null;
|
|
6186
|
-
} catch {
|
|
6187
|
-
return null;
|
|
6188
|
-
}
|
|
6189
|
-
})() : null;
|
|
6190
6292
|
const parsedSessionStatus = typeof parsedStatusBeforeSend?.status === "string" ? String(parsedStatusBeforeSend.status) : "";
|
|
6191
6293
|
if (!allowInputDuringGeneration && (parsedSessionStatus === "generating" || parsedSessionStatus === "long_generating")) {
|
|
6192
6294
|
const parsedModal = parsedStatusBeforeSend?.activeModal ?? parsedStatusBeforeSend?.modal ?? null;
|
|
@@ -6195,11 +6297,19 @@ ${lastSnapshot}`;
|
|
|
6195
6297
|
);
|
|
6196
6298
|
const terminalLooksIdle = this.currentStatus === "idle" && this.runDetectStatus(this.recentOutputBuffer) === "idle" && !this.isWaitingForResponse && !this.currentTurnScope && !this.hasActionableApproval() && !parsedHasActionableModal;
|
|
6197
6299
|
if (!terminalLooksIdle) {
|
|
6300
|
+
if (allowQueue) {
|
|
6301
|
+
this.enqueuePendingOutboundMessage(text, `parsed_status_${parsedSessionStatus}`);
|
|
6302
|
+
return;
|
|
6303
|
+
}
|
|
6198
6304
|
throw new Error(`${this.cliName} is still processing the previous prompt`);
|
|
6199
6305
|
}
|
|
6200
6306
|
}
|
|
6201
6307
|
if (this.isWaitingForResponse && !allowInputDuringGeneration) {
|
|
6202
6308
|
if (!this.clearStaleIdleResponseGuard("send_message_guard") && !this.clearParsedIdleResponseGuard("send_message_parsed_idle_guard", parsedStatusBeforeSend)) {
|
|
6309
|
+
if (allowQueue) {
|
|
6310
|
+
this.enqueuePendingOutboundMessage(text, "waiting_for_response");
|
|
6311
|
+
return;
|
|
6312
|
+
}
|
|
6203
6313
|
throw new Error(`${this.cliName} is still processing the previous prompt`);
|
|
6204
6314
|
}
|
|
6205
6315
|
}
|
|
@@ -6434,6 +6544,12 @@ ${lastSnapshot}`;
|
|
|
6434
6544
|
this.pendingTerminalQueryTail = "";
|
|
6435
6545
|
this.ptyOutputChunks = [];
|
|
6436
6546
|
this.finishRetryCount = 0;
|
|
6547
|
+
if (this.pendingOutboundFlushTimer) {
|
|
6548
|
+
clearTimeout(this.pendingOutboundFlushTimer);
|
|
6549
|
+
this.pendingOutboundFlushTimer = null;
|
|
6550
|
+
}
|
|
6551
|
+
this.pendingOutboundQueue = [];
|
|
6552
|
+
this.pendingOutboundFlushInFlight = false;
|
|
6437
6553
|
if (this.ptyProcess) {
|
|
6438
6554
|
this.ptyProcess.write("");
|
|
6439
6555
|
setTimeout(() => {
|
|
@@ -6457,6 +6573,12 @@ ${lastSnapshot}`;
|
|
|
6457
6573
|
this.pendingTerminalQueryTail = "";
|
|
6458
6574
|
this.ptyOutputChunks = [];
|
|
6459
6575
|
this.finishRetryCount = 0;
|
|
6576
|
+
if (this.pendingOutboundFlushTimer) {
|
|
6577
|
+
clearTimeout(this.pendingOutboundFlushTimer);
|
|
6578
|
+
this.pendingOutboundFlushTimer = null;
|
|
6579
|
+
}
|
|
6580
|
+
this.pendingOutboundQueue = [];
|
|
6581
|
+
this.pendingOutboundFlushInFlight = false;
|
|
6460
6582
|
if (this.ptyProcess) {
|
|
6461
6583
|
try {
|
|
6462
6584
|
if (typeof this.ptyProcess.detach === "function") {
|
|
@@ -6496,6 +6618,12 @@ ${lastSnapshot}`;
|
|
|
6496
6618
|
this.finishRetryTimer = null;
|
|
6497
6619
|
}
|
|
6498
6620
|
this.finishRetryCount = 0;
|
|
6621
|
+
if (this.pendingOutboundFlushTimer) {
|
|
6622
|
+
clearTimeout(this.pendingOutboundFlushTimer);
|
|
6623
|
+
this.pendingOutboundFlushTimer = null;
|
|
6624
|
+
}
|
|
6625
|
+
this.pendingOutboundQueue = [];
|
|
6626
|
+
this.pendingOutboundFlushInFlight = false;
|
|
6499
6627
|
this.resetTerminalScreen();
|
|
6500
6628
|
this.ptyProcess?.clearBuffer?.();
|
|
6501
6629
|
this.onStatusChange?.();
|
|
@@ -6622,6 +6750,14 @@ ${lastSnapshot}`;
|
|
|
6622
6750
|
rawBufferPreview: this.accumulatedRawBuffer.slice(-1e3),
|
|
6623
6751
|
sanitizedRawPreview: sanitizeTerminalText(this.accumulatedRawBuffer).slice(-1e3),
|
|
6624
6752
|
responseBuffer: this.responseBuffer.slice(-1e3),
|
|
6753
|
+
pendingOutboundQueue: this.pendingOutboundQueue.map((message) => ({
|
|
6754
|
+
id: message.id,
|
|
6755
|
+
role: message.role,
|
|
6756
|
+
content: message.content,
|
|
6757
|
+
queuedAt: message.queuedAt,
|
|
6758
|
+
source: message.source
|
|
6759
|
+
})),
|
|
6760
|
+
pendingOutboundCount: this.pendingOutboundQueue.length,
|
|
6625
6761
|
lastOutputAt: this.lastOutputAt,
|
|
6626
6762
|
lastNonEmptyOutputAt: this.lastNonEmptyOutputAt,
|
|
6627
6763
|
lastScreenChangeAt: this.lastScreenChangeAt,
|
|
@@ -15729,7 +15865,7 @@ var RECENT_SEND_WINDOW_MS = 1200;
|
|
|
15729
15865
|
var READ_CHAT_PROVIDER_EVAL_TIMEOUT_MS = 25e3;
|
|
15730
15866
|
var HERMES_CLI_STARTING_SEND_SETTLE_MS = 2e3;
|
|
15731
15867
|
var CLI_NATIVE_HISTORY_FRESH_MS = 5 * 6e4;
|
|
15732
|
-
var CLI_NATIVE_TRANSCRIPT_PROVIDERS = /* @__PURE__ */ new Set(["codex-cli", "claude-cli"]);
|
|
15868
|
+
var CLI_NATIVE_TRANSCRIPT_PROVIDERS = /* @__PURE__ */ new Set(["codex-cli", "claude-cli", "hermes-cli"]);
|
|
15733
15869
|
var recentSendByTarget = /* @__PURE__ */ new Map();
|
|
15734
15870
|
function getCurrentProviderType(h, fallback = "") {
|
|
15735
15871
|
return h.currentSession?.providerType || h.currentProviderType || fallback;
|
|
@@ -22614,18 +22750,6 @@ Run 'adhdev doctor' for detailed diagnostics.`
|
|
|
22614
22750
|
} else if (currentStatus === "starting") {
|
|
22615
22751
|
currentStatus = getEffectiveAgentSendStatus(adapter);
|
|
22616
22752
|
}
|
|
22617
|
-
if (BUSY_AGENT_STATUSES.has(currentStatus)) {
|
|
22618
|
-
return {
|
|
22619
|
-
success: false,
|
|
22620
|
-
code: "agent_runtime_busy",
|
|
22621
|
-
reason: "agent_runtime_busy",
|
|
22622
|
-
retryable: true,
|
|
22623
|
-
retryRecommended: true,
|
|
22624
|
-
status: currentStatus,
|
|
22625
|
-
targetSessionId: args?.targetSessionId,
|
|
22626
|
-
error: `CLI agent '${agentType}' is currently ${currentStatus}; retry after the current turn finishes.`
|
|
22627
|
-
};
|
|
22628
|
-
}
|
|
22629
22753
|
const input = normalizeInputEnvelope(args?.input ? { input: args.input } : args);
|
|
22630
22754
|
const provider = this.providerLoader.resolve(agentType) || this.providerLoader.getMeta(agentType);
|
|
22631
22755
|
if (provider?.category === "acp") {
|
|
@@ -22636,7 +22760,11 @@ Run 'adhdev doctor' for detailed diagnostics.`
|
|
|
22636
22760
|
const message = input.textFallback;
|
|
22637
22761
|
if (!message) throw new Error("message required for send_chat");
|
|
22638
22762
|
await adapter.sendMessage(message);
|
|
22639
|
-
return {
|
|
22763
|
+
return {
|
|
22764
|
+
success: true,
|
|
22765
|
+
status: BUSY_AGENT_STATUSES.has(currentStatus) ? currentStatus : "generating",
|
|
22766
|
+
...BUSY_AGENT_STATUSES.has(currentStatus) ? { queued: true, queuedReason: "agent_runtime_busy" } : {}
|
|
22767
|
+
};
|
|
22640
22768
|
} else if (action === "clear_history") {
|
|
22641
22769
|
if (typeof adapter.clearHistory === "function") adapter.clearHistory();
|
|
22642
22770
|
return { success: true, cleared: true };
|