@sideboard-ai/core 0.1.318 → 0.1.319
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/{abletime-KWOBUL46.js → abletime-DVYO4IVS.js} +5 -3
- package/dist/{abletime-TKAFNXCM.js → abletime-L3ODNTBT.js} +5 -3
- package/dist/{abletime-oauth-S4AXA4WR.js → abletime-oauth-2VWQCXGT.js} +2 -2
- package/dist/{abletime-oauth-IUIAGLFJ.js → abletime-oauth-6DTX7LB7.js} +2 -2
- package/dist/{abletime-rest-ORBELZQO.js → abletime-rest-7NICZYOC.js} +2 -2
- package/dist/{abletime-rest-RWN4EPY3.js → abletime-rest-PYQM234B.js} +2 -2
- package/dist/{chunk-XOZNEAWF.js → chunk-5OM7UCTQ.js} +2 -2
- package/dist/{chunk-2HOZMSKQ.js → chunk-AUJ4XB6H.js} +1 -1
- package/dist/{chunk-VZAJVX36.js → chunk-JD7CC6SW.js} +1 -1
- package/dist/{chunk-7ADEYEMH.js → chunk-LXBZQP2Q.js} +4 -4
- package/dist/{chunk-BXTISNKW.js → chunk-OO3R6CS2.js} +216 -64
- package/dist/{chunk-I5CLCWUK.js → chunk-QPLQXWND.js} +8 -4
- package/dist/{chunk-23ZUL2EX.js → chunk-U2N32EA6.js} +216 -64
- package/dist/{chunk-W5QZWAUB.js → chunk-WLZHRNE6.js} +8 -4
- package/dist/{chunk-7SCVGGF6.js → chunk-ZM43NTJJ.js} +4 -4
- package/dist/index.cjs +272 -73
- package/dist/index.d.cts +27 -9
- package/dist/index.d.ts +27 -9
- package/dist/index.js +34 -11
- package/dist/mcp/run-stdio.cjs +240 -63
- package/dist/mcp/run-stdio.js +4 -4
- package/dist/{orchestrator-N54V3B76.js → orchestrator-H3DSZ5RM.js} +1 -1
- package/dist/{orchestrator-2SXK4U65.js → orchestrator-NCA4LSCC.js} +1 -1
- package/package.json +1 -1
|
@@ -2989,7 +2989,7 @@ async function createThread(input, _onSetupLine) {
|
|
|
2989
2989
|
let sourceIsFork = false;
|
|
2990
2990
|
if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
|
|
2991
2991
|
if (isAbleTimeConnected() && getIssueSource() === "abletime") {
|
|
2992
|
-
const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-
|
|
2992
|
+
const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-DVYO4IVS.js");
|
|
2993
2993
|
const task = await ensureAbleTimeTask({
|
|
2994
2994
|
title: title?.trim() || "Untitled work",
|
|
2995
2995
|
description: input.prompt?.trim() || void 0
|
|
@@ -5710,6 +5710,36 @@ function expandComposerPrompt(worktreePath, prompt, opts) {
|
|
|
5710
5710
|
};
|
|
5711
5711
|
}
|
|
5712
5712
|
|
|
5713
|
+
// src/composer/agent-has-replied.ts
|
|
5714
|
+
function joinSteerPrompt(base, addition) {
|
|
5715
|
+
const next = addition.trim();
|
|
5716
|
+
if (!next) return base;
|
|
5717
|
+
const head = base.replace(/\s+$/, "");
|
|
5718
|
+
if (!head) return next;
|
|
5719
|
+
return `${head}
|
|
5720
|
+
${next}`;
|
|
5721
|
+
}
|
|
5722
|
+
function trailingUnansweredUserText(messages) {
|
|
5723
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
5724
|
+
const message = messages[i];
|
|
5725
|
+
if (!message || message.origin === "continue" || message.role === "summary") continue;
|
|
5726
|
+
if (message.role === "agent") {
|
|
5727
|
+
const text3 = (message.text ?? "").trim();
|
|
5728
|
+
if (text3 || (message.parts?.length ?? 0) > 0) return null;
|
|
5729
|
+
continue;
|
|
5730
|
+
}
|
|
5731
|
+
if (message.role === "user") return message.text;
|
|
5732
|
+
}
|
|
5733
|
+
return null;
|
|
5734
|
+
}
|
|
5735
|
+
function livePartsShowAgentReply(parts) {
|
|
5736
|
+
for (const part of parts) {
|
|
5737
|
+
if (part.type === "tool") return true;
|
|
5738
|
+
if ((part.type === "text" || part.type === "thinking") && part.text.trim()) return true;
|
|
5739
|
+
}
|
|
5740
|
+
return false;
|
|
5741
|
+
}
|
|
5742
|
+
|
|
5713
5743
|
// src/composer/consume-attachments.ts
|
|
5714
5744
|
function consumeComposerAttachments(thread) {
|
|
5715
5745
|
return {
|
|
@@ -5762,6 +5792,128 @@ function shiftQueuedItem(queue, queueAttachments) {
|
|
|
5762
5792
|
};
|
|
5763
5793
|
}
|
|
5764
5794
|
|
|
5795
|
+
// src/orchestrator/enqueue-thread-send.ts
|
|
5796
|
+
function resolveSendFollowUp(thread, requested) {
|
|
5797
|
+
if (requested === "steer" || requested === "queue") return requested;
|
|
5798
|
+
return isOrchestratorThread(thread) ? followUpBehavior() : "queue";
|
|
5799
|
+
}
|
|
5800
|
+
function rewriteTrailingUserPrompt(threadId, from, to) {
|
|
5801
|
+
if (from === to) return;
|
|
5802
|
+
const thread = readThread(threadId);
|
|
5803
|
+
if (!thread) return;
|
|
5804
|
+
const messages = thread.messages.slice();
|
|
5805
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
5806
|
+
const message = messages[i];
|
|
5807
|
+
if (!message || message.origin === "continue" || message.role === "summary") continue;
|
|
5808
|
+
if (message.role === "user" && message.text === from) {
|
|
5809
|
+
messages[i] = { ...message, text: to };
|
|
5810
|
+
updateThread(threadId, { messages });
|
|
5811
|
+
}
|
|
5812
|
+
return;
|
|
5813
|
+
}
|
|
5814
|
+
}
|
|
5815
|
+
function reuseJoinedUserBubble(reused, threadId, last, promptText) {
|
|
5816
|
+
return reused.delete(threadId) && last?.role === "user" && last.origin !== "continue" && last.text === promptText;
|
|
5817
|
+
}
|
|
5818
|
+
function promptForJoinedSteer(input) {
|
|
5819
|
+
if (input.latestPrompt === input.promptText) return input.agentPrompt;
|
|
5820
|
+
rewriteTrailingUserPrompt(input.threadId, input.promptText, input.latestPrompt);
|
|
5821
|
+
const { agentPrompt: expandedLatest } = expandComposerPrompt(
|
|
5822
|
+
input.worktreePath,
|
|
5823
|
+
expandCanonicalGitRequest(input.latestPrompt),
|
|
5824
|
+
{ attachments: input.attachments }
|
|
5825
|
+
);
|
|
5826
|
+
return input.expandedPrompt && input.agentPrompt.endsWith(input.expandedPrompt) ? input.agentPrompt.slice(0, -input.expandedPrompt.length) + expandedLatest : `${input.agentPrompt}
|
|
5827
|
+
|
|
5828
|
+
${expandedLatest}`;
|
|
5829
|
+
}
|
|
5830
|
+
function clearSendBookkeeping(host, threadId) {
|
|
5831
|
+
host.crashContinued.delete(threadId);
|
|
5832
|
+
host.jobContinueCount.delete(threadId);
|
|
5833
|
+
host.jobContinueNudged.delete(threadId);
|
|
5834
|
+
host.haltDrain.delete(threadId);
|
|
5835
|
+
}
|
|
5836
|
+
async function enqueueThreadSend(host, threadRef, prompt, opts) {
|
|
5837
|
+
const thread = host.requireThread(threadRef);
|
|
5838
|
+
if (thread.status === "archived") {
|
|
5839
|
+
throw new Error(`Thread is archived: ${thread.id}`);
|
|
5840
|
+
}
|
|
5841
|
+
let shouldSteer = false;
|
|
5842
|
+
const sent = await withThreadLock(thread.id, async () => {
|
|
5843
|
+
const current = host.requireThread(thread.id);
|
|
5844
|
+
if (current.status === "archived") {
|
|
5845
|
+
throw new Error(`Thread is archived: ${thread.id}`);
|
|
5846
|
+
}
|
|
5847
|
+
const followUp = resolveSendFollowUp(current, opts?.followUp);
|
|
5848
|
+
const explicit = opts?.attachments;
|
|
5849
|
+
const consumed = explicit !== void 0 ? { attachments: current.attachments, consumed: explicit } : consumeComposerAttachments(current);
|
|
5850
|
+
const inFlightEarly = host.activeTurns.has(thread.id) || host.startingTurns.has(thread.id) || current.status === "running";
|
|
5851
|
+
const agentHasRepliedEarly = livePartsShowAgentReply(readTurnLiveParts(current.id));
|
|
5852
|
+
const draft = host.openSteerPrompt.get(current.id);
|
|
5853
|
+
const queuedHead = !inFlightEarly && current.status === "queued" && current.queue.length > 0 ? current.queue[0] : null;
|
|
5854
|
+
const unanswered = followUp === "steer" && !agentHasRepliedEarly ? draft?.text ?? (inFlightEarly ? trailingUnansweredUserText(current.messages) : queuedHead) : null;
|
|
5855
|
+
if (unanswered != null && (draft ? !draft.spawned : queuedHead != null)) {
|
|
5856
|
+
clearSendBookkeeping(host, thread.id);
|
|
5857
|
+
const combined = joinSteerPrompt(unanswered, prompt);
|
|
5858
|
+
if (draft && !draft.spawned) {
|
|
5859
|
+
draft.text = combined;
|
|
5860
|
+
rewriteTrailingUserPrompt(current.id, unanswered, combined);
|
|
5861
|
+
} else {
|
|
5862
|
+
const queue = current.queue.slice();
|
|
5863
|
+
queue[0] = combined;
|
|
5864
|
+
const queueAttachments = alignQueueAttachments(queue.length, current.queueAttachments);
|
|
5865
|
+
if (consumed.consumed.length > 0) {
|
|
5866
|
+
queueAttachments[0] = [...queueAttachments[0] ?? [], ...consumed.consumed];
|
|
5867
|
+
}
|
|
5868
|
+
const patch2 = { queue, queueAttachments };
|
|
5869
|
+
if (explicit === void 0 && consumed.consumed.length > 0) {
|
|
5870
|
+
patch2.attachments = consumed.attachments;
|
|
5871
|
+
}
|
|
5872
|
+
updateThread(current.id, patch2);
|
|
5873
|
+
host.emit({ type: "queue_changed", threadId: current.id, queue });
|
|
5874
|
+
}
|
|
5875
|
+
if (thisProcessShouldDrainAgentQueues() && !inFlightEarly) {
|
|
5876
|
+
host.armDrain(current.id);
|
|
5877
|
+
}
|
|
5878
|
+
return host.requireThread(current.id);
|
|
5879
|
+
}
|
|
5880
|
+
const promptToQueue = unanswered != null ? joinSteerPrompt(unanswered, prompt) : prompt;
|
|
5881
|
+
if (unanswered != null) {
|
|
5882
|
+
if (draft) draft.text = promptToQueue;
|
|
5883
|
+
rewriteTrailingUserPrompt(current.id, unanswered, promptToQueue);
|
|
5884
|
+
host.reusedUserPrompt.add(current.id);
|
|
5885
|
+
}
|
|
5886
|
+
const queued = appendQueuedItem(
|
|
5887
|
+
current.queue,
|
|
5888
|
+
current.queueAttachments,
|
|
5889
|
+
promptToQueue,
|
|
5890
|
+
consumed.consumed
|
|
5891
|
+
);
|
|
5892
|
+
clearSendBookkeeping(host, thread.id);
|
|
5893
|
+
const inFlight = host.activeTurns.has(thread.id) || host.startingTurns.has(thread.id) || current.status === "running";
|
|
5894
|
+
shouldSteer = followUp === "steer" && (inFlight || current.queue.length > 0);
|
|
5895
|
+
const patch = queued;
|
|
5896
|
+
if (explicit === void 0 && consumed.consumed.length > 0) {
|
|
5897
|
+
patch.attachments = consumed.attachments;
|
|
5898
|
+
}
|
|
5899
|
+
if (!inFlight) patch.status = "queued";
|
|
5900
|
+
const pid = current.agentPid;
|
|
5901
|
+
if (typeof pid === "number" && pid > 0 && !host.pidAlive(pid)) {
|
|
5902
|
+
patch.agentPid = null;
|
|
5903
|
+
}
|
|
5904
|
+
updateThread(thread.id, patch);
|
|
5905
|
+
host.emit({ type: "queue_changed", threadId: thread.id, queue: queued.queue });
|
|
5906
|
+
if (!inFlight) {
|
|
5907
|
+
host.emit({ type: "status_changed", threadId: thread.id, status: "queued" });
|
|
5908
|
+
}
|
|
5909
|
+
if (thisProcessShouldDrainAgentQueues() && !shouldSteer) {
|
|
5910
|
+
host.armDrain(thread.id);
|
|
5911
|
+
}
|
|
5912
|
+
return host.requireThread(thread.id);
|
|
5913
|
+
});
|
|
5914
|
+
return { thread: sent, shouldSteer };
|
|
5915
|
+
}
|
|
5916
|
+
|
|
5765
5917
|
// src/agents/instructions.ts
|
|
5766
5918
|
import { existsSync as existsSync12 } from "fs";
|
|
5767
5919
|
import { join as join12 } from "path";
|
|
@@ -6815,7 +6967,7 @@ function formatScheduledPrompt(name, prompt) {
|
|
|
6815
6967
|
${prompt}`;
|
|
6816
6968
|
}
|
|
6817
6969
|
async function defaultDeps() {
|
|
6818
|
-
const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-
|
|
6970
|
+
const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-NCA4LSCC.js");
|
|
6819
6971
|
const orch = getOrchestrator2();
|
|
6820
6972
|
return {
|
|
6821
6973
|
findThread: (id) => findThreadByRef(id),
|
|
@@ -6931,10 +7083,6 @@ async function waitForPidExit(pid, timeoutMs) {
|
|
|
6931
7083
|
}
|
|
6932
7084
|
return true;
|
|
6933
7085
|
}
|
|
6934
|
-
function resolveSendFollowUp(thread, requested) {
|
|
6935
|
-
if (requested === "steer" || requested === "queue") return requested;
|
|
6936
|
-
return isOrchestratorThread(thread) ? followUpBehavior() : "queue";
|
|
6937
|
-
}
|
|
6938
7086
|
function resolveOrchChildFollowUp(requested) {
|
|
6939
7087
|
if (requested === "steer" || requested === "queue") return requested;
|
|
6940
7088
|
return followUpBehavior();
|
|
@@ -6963,6 +7111,13 @@ var Orchestrator = class {
|
|
|
6963
7111
|
draining = /* @__PURE__ */ new Set();
|
|
6964
7112
|
/** Threads past setStatus(running) but not yet in activeTurns (spawn in flight). */
|
|
6965
7113
|
startingTurns = /* @__PURE__ */ new Set();
|
|
7114
|
+
/**
|
|
7115
|
+
* Prompt for the turn that has not been answered yet. Steer follow-ups before
|
|
7116
|
+
* any agent output are joined onto this text instead of starting a second bubble.
|
|
7117
|
+
*/
|
|
7118
|
+
openSteerPrompt = /* @__PURE__ */ new Map();
|
|
7119
|
+
/** Next runTurn should keep the user bubble already rewritten to this prompt. */
|
|
7120
|
+
reusedUserPrompt = /* @__PURE__ */ new Set();
|
|
6966
7121
|
/** Last sync thread-file read for false-stop heal (throttled per thread). */
|
|
6967
7122
|
lastReconcileHealAt = /* @__PURE__ */ new Map();
|
|
6968
7123
|
/** Per-repo timestamp of the last `reconcile(repo, { light: true })`. */
|
|
@@ -7573,54 +7728,29 @@ var Orchestrator = class {
|
|
|
7573
7728
|
return thread;
|
|
7574
7729
|
}
|
|
7575
7730
|
async send(threadRef, prompt, opts) {
|
|
7576
|
-
const
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
|
|
7592
|
-
|
|
7593
|
-
|
|
7594
|
-
|
|
7595
|
-
|
|
7596
|
-
this.
|
|
7597
|
-
this.jobContinueNudged.delete(thread.id);
|
|
7598
|
-
this.haltDrain.delete(thread.id);
|
|
7599
|
-
const inFlight = this.activeTurns.has(thread.id) || this.startingTurns.has(thread.id) || current.status === "running";
|
|
7600
|
-
shouldSteer = followUp === "steer" && (inFlight || current.queue.length > 0);
|
|
7601
|
-
const patch = queued;
|
|
7602
|
-
if (explicit === void 0 && consumed.consumed.length > 0) {
|
|
7603
|
-
patch.attachments = consumed.attachments;
|
|
7604
|
-
}
|
|
7605
|
-
if (!inFlight) patch.status = "queued";
|
|
7606
|
-
const pid = current.agentPid;
|
|
7607
|
-
if (typeof pid === "number" && pid > 0 && !isPidAlive(pid)) {
|
|
7608
|
-
patch.agentPid = null;
|
|
7609
|
-
}
|
|
7610
|
-
updateThread(thread.id, patch);
|
|
7611
|
-
this.emit({ type: "queue_changed", threadId: thread.id, queue: queued.queue });
|
|
7612
|
-
if (!inFlight) {
|
|
7613
|
-
this.emit({ type: "status_changed", threadId: thread.id, status: "queued" });
|
|
7614
|
-
}
|
|
7615
|
-
if (thisProcessShouldDrainAgentQueues() && !shouldSteer) {
|
|
7616
|
-
this.armDrain(thread.id);
|
|
7617
|
-
}
|
|
7618
|
-
return this.requireThread(thread.id);
|
|
7619
|
-
});
|
|
7620
|
-
if (shouldSteer && sent.queue.length > 0) {
|
|
7621
|
-
return this.sendQueuedMessageNow(sent.id, sent.queue.length - 1);
|
|
7731
|
+
const sent = await enqueueThreadSend(
|
|
7732
|
+
{
|
|
7733
|
+
activeTurns: this.activeTurns,
|
|
7734
|
+
startingTurns: this.startingTurns,
|
|
7735
|
+
openSteerPrompt: this.openSteerPrompt,
|
|
7736
|
+
reusedUserPrompt: this.reusedUserPrompt,
|
|
7737
|
+
crashContinued: this.crashContinued,
|
|
7738
|
+
jobContinueCount: this.jobContinueCount,
|
|
7739
|
+
jobContinueNudged: this.jobContinueNudged,
|
|
7740
|
+
haltDrain: this.haltDrain,
|
|
7741
|
+
emit: (event) => this.emit(event),
|
|
7742
|
+
armDrain: (id) => this.armDrain(id),
|
|
7743
|
+
requireThread: (ref) => this.requireThread(ref),
|
|
7744
|
+
pidAlive: (pid) => isPidAlive(pid)
|
|
7745
|
+
},
|
|
7746
|
+
threadRef,
|
|
7747
|
+
prompt,
|
|
7748
|
+
opts
|
|
7749
|
+
);
|
|
7750
|
+
if (sent.shouldSteer && sent.thread.queue.length > 0) {
|
|
7751
|
+
return this.sendQueuedMessageNow(sent.thread.id, sent.thread.queue.length - 1);
|
|
7622
7752
|
}
|
|
7623
|
-
return sent;
|
|
7753
|
+
return sent.thread;
|
|
7624
7754
|
}
|
|
7625
7755
|
async fanOut(threadRefs, prompt, opts) {
|
|
7626
7756
|
const results = [];
|
|
@@ -7777,6 +7907,10 @@ var Orchestrator = class {
|
|
|
7777
7907
|
this.emit({ type: "status_changed", threadId, status: "running" });
|
|
7778
7908
|
this.emit({ type: "turn_started", threadId, prompt });
|
|
7779
7909
|
try {
|
|
7910
|
+
this.openSteerPrompt.set(threadId, {
|
|
7911
|
+
text: typeof prompt === "string" ? prompt : "",
|
|
7912
|
+
spawned: false
|
|
7913
|
+
});
|
|
7780
7914
|
try {
|
|
7781
7915
|
const baseline = await captureTurnBaseline(thread.worktreePath);
|
|
7782
7916
|
if (baseline) this.turnBaselines.set(threadId, baseline);
|
|
@@ -7802,18 +7936,21 @@ var Orchestrator = class {
|
|
|
7802
7936
|
this.emit({ type: "error", threadId, message: `context compact failed: ${message}` });
|
|
7803
7937
|
thread = this.requireThread(threadId);
|
|
7804
7938
|
}
|
|
7805
|
-
const promptText = typeof prompt === "string" ? prompt : "";
|
|
7939
|
+
const promptText = this.openSteerPrompt.get(threadId)?.text ?? (typeof prompt === "string" ? prompt : "");
|
|
7806
7940
|
const autoContinue = isJobContinuePrompt(promptText) || promptText.startsWith("The previous agent process ended before it finished.");
|
|
7807
7941
|
const parked = takePendingTurnAttachments(thread);
|
|
7808
7942
|
const sentAttachments = !autoContinue && parked.length > 0 ? parked : void 0;
|
|
7809
7943
|
if (!autoContinue) clearAgentBlock(threadId);
|
|
7810
|
-
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
|
|
7944
|
+
const lastShown = this.requireThread(threadId).messages.at(-1);
|
|
7945
|
+
if (!reuseJoinedUserBubble(this.reusedUserPrompt, threadId, lastShown, promptText)) {
|
|
7946
|
+
appendMessage(threadId, {
|
|
7947
|
+
role: "user",
|
|
7948
|
+
text: promptText,
|
|
7949
|
+
...sentAttachments ? { attachments: sentAttachments } : {},
|
|
7950
|
+
...autoContinue ? { origin: "continue" } : {},
|
|
7951
|
+
ts: (/* @__PURE__ */ new Date()).toISOString()
|
|
7952
|
+
});
|
|
7953
|
+
}
|
|
7817
7954
|
if (!autoContinue) {
|
|
7818
7955
|
const live = this.requireThread(threadId);
|
|
7819
7956
|
const stamp = agentPurposeStamp({
|
|
@@ -8012,11 +8149,22 @@ ${formatEnvReminder(projectNameForRepoPath(thread.repoPath || thread.worktreePat
|
|
|
8012
8149
|
].filter(Boolean).join("\n\n---\n\n");
|
|
8013
8150
|
const stderrTail = [];
|
|
8014
8151
|
traceTurn("runTurn.beforeSpawn", { threadId, agent: fresh.agent });
|
|
8152
|
+
const steerDraft = this.openSteerPrompt.get(threadId);
|
|
8153
|
+
if (steerDraft) steerDraft.spawned = true;
|
|
8154
|
+
const promptForAgent = promptForJoinedSteer({
|
|
8155
|
+
threadId,
|
|
8156
|
+
promptText,
|
|
8157
|
+
latestPrompt: steerDraft?.text ?? promptText,
|
|
8158
|
+
agentPrompt,
|
|
8159
|
+
expandedPrompt,
|
|
8160
|
+
worktreePath: fresh.worktreePath,
|
|
8161
|
+
attachments: autoContinue ? [] : sentAttachments ?? []
|
|
8162
|
+
});
|
|
8015
8163
|
const handle = await spawnAgentTurn(
|
|
8016
8164
|
fresh,
|
|
8017
8165
|
{
|
|
8018
8166
|
cachedPrefix,
|
|
8019
|
-
prompt:
|
|
8167
|
+
prompt: promptForAgent,
|
|
8020
8168
|
systemPrompt: turnReminders,
|
|
8021
8169
|
isolateCodexPlugins: fresh.isolateCodexPlugins === true
|
|
8022
8170
|
},
|
|
@@ -8144,7 +8292,7 @@ ${formatEnvReminder(projectNameForRepoPath(thread.repoPath || thread.worktreePat
|
|
|
8144
8292
|
retryThread,
|
|
8145
8293
|
{
|
|
8146
8294
|
cachedPrefix: retryPrefix,
|
|
8147
|
-
prompt:
|
|
8295
|
+
prompt: promptForAgent,
|
|
8148
8296
|
systemPrompt: turnReminders,
|
|
8149
8297
|
isolateCodexPlugins: isolateCodexPluginRetry || retryThread.isolateCodexPlugins === true
|
|
8150
8298
|
},
|
|
@@ -8304,6 +8452,7 @@ ${formatEnvReminder(projectNameForRepoPath(thread.repoPath || thread.worktreePat
|
|
|
8304
8452
|
} finally {
|
|
8305
8453
|
this.startingTurns.delete(threadId);
|
|
8306
8454
|
this.activeTurns.delete(threadId);
|
|
8455
|
+
this.openSteerPrompt.delete(threadId);
|
|
8307
8456
|
this.processes.delete(`${threadId}:agent`);
|
|
8308
8457
|
this.stoppedTurns.delete(threadId);
|
|
8309
8458
|
this.runningCount = Math.max(0, this.runningCount - 1);
|
|
@@ -9867,6 +10016,9 @@ export {
|
|
|
9867
10016
|
discoverSkills,
|
|
9868
10017
|
readSkillBody,
|
|
9869
10018
|
expandComposerPrompt,
|
|
10019
|
+
joinSteerPrompt,
|
|
10020
|
+
trailingUnansweredUserText,
|
|
10021
|
+
livePartsShowAgentReply,
|
|
9870
10022
|
consumeComposerAttachments,
|
|
9871
10023
|
takePendingTurnAttachments,
|
|
9872
10024
|
alignQueueAttachments,
|
|
@@ -9875,6 +10027,7 @@ export {
|
|
|
9875
10027
|
removeQueuedItem,
|
|
9876
10028
|
moveQueuedItemToFront,
|
|
9877
10029
|
shiftQueuedItem,
|
|
10030
|
+
resolveSendFollowUp,
|
|
9878
10031
|
packagedDetachedJobPath,
|
|
9879
10032
|
resolveDetachedJobScript,
|
|
9880
10033
|
formatDetachedJobInvoke,
|
|
@@ -9914,7 +10067,6 @@ export {
|
|
|
9914
10067
|
RUN_SCRIPT_DESKTOP_ADOPT_MS,
|
|
9915
10068
|
isPidAlive,
|
|
9916
10069
|
waitForPidExit,
|
|
9917
|
-
resolveSendFollowUp,
|
|
9918
10070
|
resolveOrchChildFollowUp,
|
|
9919
10071
|
LIGHT_RECONCILE_THROTTLE_MS,
|
|
9920
10072
|
Orchestrator,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
abletimeRestUrl,
|
|
3
3
|
textFromAbleTimeDoc
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AUJ4XB6H.js";
|
|
5
5
|
import {
|
|
6
6
|
assertAbleTimeCredential,
|
|
7
7
|
callAbleTimeTool,
|
|
8
8
|
normalizeAbleTimeHost,
|
|
9
9
|
rewriteAbleTimeError
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LXBZQP2Q.js";
|
|
11
11
|
import {
|
|
12
12
|
httpFetch
|
|
13
13
|
} from "./chunk-JAT3JFOS.js";
|
|
@@ -549,9 +549,12 @@ function issueAttachmentForAbleTimeTask(task) {
|
|
|
549
549
|
].filter(Boolean).join("\n")
|
|
550
550
|
};
|
|
551
551
|
}
|
|
552
|
+
function ableTimeStateIsClosed(state) {
|
|
553
|
+
const value = (state ?? "").trim().toLowerCase();
|
|
554
|
+
return Boolean(value && CLOSED_STATES.has(value));
|
|
555
|
+
}
|
|
552
556
|
function isOpenTask(task) {
|
|
553
|
-
|
|
554
|
-
return !state || !CLOSED_STATES.has(state);
|
|
557
|
+
return !ableTimeStateIsClosed(task.state);
|
|
555
558
|
}
|
|
556
559
|
async function getAbleTimeOrientation(opts) {
|
|
557
560
|
const raw = await callAbleTimeTool("orientation", {}, opts);
|
|
@@ -847,6 +850,7 @@ export {
|
|
|
847
850
|
mapAbleTimeTask,
|
|
848
851
|
toAbleTimeIssueInfo,
|
|
849
852
|
issueAttachmentForAbleTimeTask,
|
|
853
|
+
ableTimeStateIsClosed,
|
|
850
854
|
getAbleTimeOrientation,
|
|
851
855
|
listAbleTimeProjects,
|
|
852
856
|
listAbleTimeTasks,
|
|
@@ -155,7 +155,7 @@ function textsFromUnknown(value) {
|
|
|
155
155
|
return "";
|
|
156
156
|
}
|
|
157
157
|
async function abletimeMcpRequest(method, params, opts) {
|
|
158
|
-
const rawToken = opts?.token ?? await import("./abletime-oauth-
|
|
158
|
+
const rawToken = opts?.token ?? await import("./abletime-oauth-2VWQCXGT.js").then((m) => m.ensureAbleTimeAccessToken());
|
|
159
159
|
if (!rawToken?.trim()) {
|
|
160
160
|
throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
|
|
161
161
|
}
|
|
@@ -226,9 +226,9 @@ async function callAbleTimeTool(name, args = {}, opts) {
|
|
|
226
226
|
if (!opts?.token && !isAbleTimeConnected()) {
|
|
227
227
|
throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
|
|
228
228
|
}
|
|
229
|
-
const rawToken = opts?.token ?? await import("./abletime-oauth-
|
|
229
|
+
const rawToken = opts?.token ?? await import("./abletime-oauth-2VWQCXGT.js").then((m) => m.ensureAbleTimeAccessToken());
|
|
230
230
|
if (rawToken && ableTimeUsesRest(rawToken)) {
|
|
231
|
-
const { callAbleTimeRestTool } = await import("./abletime-rest-
|
|
231
|
+
const { callAbleTimeRestTool } = await import("./abletime-rest-7NICZYOC.js");
|
|
232
232
|
return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
|
|
233
233
|
}
|
|
234
234
|
const requestOpts = { ...opts, pm: opts?.pm ?? abletimeToolUsesPm(name) };
|
|
@@ -244,7 +244,7 @@ async function callAbleTimeTool(name, args = {}, opts) {
|
|
|
244
244
|
return await call();
|
|
245
245
|
}
|
|
246
246
|
if (rawToken && ableTimeUsesRest(rawToken) && isAbleTimeRejectedCredential(message)) {
|
|
247
|
-
const { callAbleTimeRestTool } = await import("./abletime-rest-
|
|
247
|
+
const { callAbleTimeRestTool } = await import("./abletime-rest-7NICZYOC.js");
|
|
248
248
|
return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
|
|
249
249
|
}
|
|
250
250
|
throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
|